|ru_RU

Teema 3: NUPP ja PHOTORESISTOR (Ülesanne)

3.1. Katse Nuppude ja Slideswitch’i kasutamise võimalus

Skeema

Kood

const int button1Pin = 2;  //viik kunu on ühebdatud nupp1

const int button2Pin = 3; //viik kuhu on ühendatud nupp2

const int ledPin =  13;   

void setup()

{

  pinMode(button1Pin, INPUT); //algväärtuse nupu viigu sisendiks

  pinMode(button2Pin, INPUT); //algväärtuse nupu viigu sisendiks

  pinMode(ledPin, OUTPUT);   //algväärtuse LED viigu väljundiks
 

}

void loop()

{

  int button1State, button2State;  //nupu oleku muutujad

  button1State = digitalRead(button1Pin);// salvestame muutujasse nupu hetke väärtuse(HIGH või LOW)

  button2State = digitalRead(button2Pin);

  if (((button1State == LOW) || (button2State == LOW))   // kui nupu on alla vajutatud

      && !

      ((button1State == LOW) && (button2State == LOW))) // kui nupude on alla vajutatud

  {

    digitalWrite(ledPin, HIGH);  // lülitame LED sisse

  }

  else                          

  {

    digitalWrite(ledPin, LOW);  // lülitame LED välja

  }    	

  }


3.2. Katse Photoresisto

Kood

const int sensorPin = 0;

const int ledPin = 9;

int lightLevel, high = 0, low = 1023; 

void setup()

{

  pinMode(ledPin, OUTPUT);

  Serial.begin(9600); // //Serial monitori seadistamine

}

void loop()

{

  // AnalogRead() kasutab väärtused vahemikus 0 (0 вольт) и 1023 (5 вольт).

  // AnalogWrite(),  kasutatakse, et LEDi sujuvalt sisselülitada 0(ei põle) kuni 255(põleb maksimalselt).

  lightLevel = analogRead(sensorPin); //loeme mõõdetud analoogväärtuse
  // Map() teisendab sisendi väärtused ühest vahemikust teisse. Näiteks, "from" 0-1023 "to" 0-255.

  // Constrain() saed muutujale kindlad piirväärtused.

  // Näiteks:  kui constrain() kohtub arvudega 1024, 1025, 1026.., siis ta teisendab need 1023, 1023, 1023..). Kui arvud vähem kui 0, siis teisendab need 0:. 

  // lightLevel = constrain(lightLevel, 0, 255);

  manualTune();  //

  //autoTune();  //

  analogWrite(ledPin, lightLevel);

  // Выражение выше, будет изменять яркость светодиода вместе с уровнем освещенности. Чтобы сделать наоборот, заменить в analogWrite(ledPin, lightLevel) "lightLevel" на "255-lightLevel". Теперь у нас получился ночник!

  Serial.print(lightLevel);     // prindime tulemused Serial Monitori (вывод данных с фоторезистора (0-1023))

  Serial.println("");          

  delay(1000);                

}

void manualTune()

{

  lightLevel = map(lightLevel, 300, 800, 0, 255); // kaardistame selle analoogväljundi vahemikku (будет от 300 темно, до 800 (светло)). 

  lightLevel = constrain(lightLevel, 0, 255);

} 

void autoTune()

{

   if (lightLevel < low)  

  {                      

    low = lightLevel;   

  }

  if (lightLevel > high)

  {

    high = lightLevel;

  }

  lightLevel = map(lightLevel, low+10, high-30, 0, 255);

  lightLevel = constrain(lightLevel, 0, 255);

}

Ülesanne 3.1 Öölamp

Projekt: Öölamp Arduino abil

Eesmärk:
Luua öölamp, mis:

  • Lülitub sisse ja välja nupuvajutusega
  • Muudab värvi iga sisselülitamisega (kui kasutatakse RGB LED-i)
  • Reguleerib eredust vastavalt ümbritsevale valgusele (LDR abil)

Komponendid:

  • Arduino
  • Nupp
  • Valgustakisti (LDR)
  • RGB LED (või tavaline LED)
  • Takistid
  • Makettplaat ja juhtmed

Funktsionaalsus:

  • Nupp lülitab lambi sisse/välja
  • Iga kord sisse lülitades muutub värv (RGB LED-i korral)
  • Mida pimedam on ruumis, seda eredamalt lamp põleb

Skeem

Kood

const int ldrPin = A0;
const int buttonPin = 7;
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 11;

bool isOn = false;
int colorMode = 0;
bool lastButtonState = HIGH;

void setup() {
  pinMode(ldrPin, INPUT);
  pinMode(buttonPin, INPUT_PULLUP); // Кнопка подключена к GND
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  bool currentButtonState = digitalRead(buttonPin);

  // Обработка нажатия кнопки
  if (lastButtonState == HIGH && currentButtonState == LOW) {
    isOn = !isOn;
    if (isOn) {
      colorMode = (colorMode + 1) % 3; // Переключаем цвет
    }
    delay(200); // Защита от дребезга
  }
  lastButtonState = currentButtonState;

  int lightLevel = analogRead(ldrPin); // 0 (темно) - 1023 (светло)
  int brightness = map(lightLevel, 0, 1023, 255, 0); // Чем темнее — тем ярче

  if (isOn) {
    int r = 0, g = 0, b = 0;
    if (colorMode == 0) r = brightness;
    else if (colorMode == 1) g = brightness;
    else if (colorMode == 2) b = brightness;

    analogWrite(redPin, r);
    analogWrite(greenPin, g);
    analogWrite(bluePin, b);
  } else {
    analogWrite(redPin, 0);
    analogWrite(greenPin, 0);
    analogWrite(bluePin, 0);
  }

  delay(50);
}

Video

https://drive.google.com/file/d/19T0Bxtzu9l6y6Z_y4PIpuGW0XSXI0kwQ/view?usp=sharing
bool isOn = false;
int colorMode = 0;
bool lastButtonState = HIGH;

Need muutujad juhivad öölambi tööd.
isOn näitab, kas lamp on hetkel sisse lülitatud (true) või välja lülitatud (false).
colorMode hoiab meeles, mis värv parasjagu LED-il on — iga kord, kui lamp uuesti sisse lülitatakse, muutub värv (nt punane, roheline, sinine).
lastButtonState salvestab nupu eelmise oleku, et korrektselt tuvastada vajutusi — nii ei lülitu lamp kogemata mitu korda järjest sisse-välja, kui nuppu hoitakse all.

if (lastButtonState == HIGH &amp;&amp; currentButtonState == LOW) {
  isOn = !isOn;
  if (isOn) {
    colorMode = (colorMode + 1) % 3; // Переключаем цвет

if (lastButtonState == HIGH && currentButtonState == LOW)

  • See tähendab: “Kas nupp just vajutati alla?”
  • Kui eelmises tsüklis (lastButtonState) nupp polnud all (HIGH),
    aga praegu (currentButtonState) on all (LOW),
    siis kasutaja just vajutas nuppu.
  • Seda nimetatakse nupu serva tuvastamiseks (“edge detection”).

isOn = !isOn;

  • Kui nuppu vajutati, muudame lambi olekut:
    • Kui ta oli false (väljas), saab true (sisse)
    • Kui ta oli sees, saab välja
  • !isOn tähendab vastupidist väärtust — sisse/välja lülitamine

if (isOn) { colorMode = (colorMode + 1) % 3; }

  • Kui lamp läks just sisse, siis:
    • Värv muutubcolorMode suureneb ühe võrra.
    • % 3 tähendab, et loendur käib ringi: 0 → 1 → 2 → 0 → …