Teema 3: NUPP ja PHOTORESISTOR

Katse 3.1. ( Näidis 1 )

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

  }    	

  }

const int button1Pin = 2; – Määrab nupp 1 pin-i numbri, mis on ühendatud pin-iga 2.

const int ledPin = 13; – Määrab LED pin-i numbri, mis on ühendatud pin-iga 13.

void setup() – Algfunktsioon, mis käivitatakse ainult korra enne põhitsükli alustamist.

pinMode(button1Pin, INPUT); – Määrab button1Pin sisendiks, et lugeda nupp 1 seisundit (HIGH või LOW).

pinMode(button2Pin, INPUT); Määrab button2Pin sisendiks, et lugeda nupp 2 seisundit.

void loop() – Peamine tsükkel, mis käivitub pidevalt pärast setup() funktsiooni lõppemist.

int button1State, button2State; – Loome muutujad button1State ja button2State, et salvestada nuppude olekud.

button1State = digitalRead(button1Pin); – Loeme button1Pin seisundi (HIGH või LOW) ja salvestame selle muutujasse button1State.

digitalWrite(ledPin, HIGH); – Kui eelmine tingimus on täidetud, siis lülitab LED sisse.

digitalWrite(ledPin, LOW); – Kui LED ei tohiks olla sisse lülitatud, siis lülitame selle välja (seame pinge madalaks).

( Näidis 2 )

Katse 3.2.

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);

}

int lightLevel, high = 0, low = 1023; – Loome muutujad lightLevel, high ja low, et salvestada valguse taset ja määrata madalamad ja kõrgemad piirväärtused.

Serial.begin(9600); – Seab Serial Monitori kiiruseks 9600 bitti sekundis, et edastada andmeid arvutisse.

lightLevel = analogRead(sensorPin); – Loeme sensori analoogväljundi väärtuse (vahemik 0–1023), mis sõltub valgustaseme tugevusest.

lightLevel = map(lightLevel, 300, 800, 0, 255); – Funktsioon map() muudab väärtuse vahemiku 300-800 vahemikku 0-255, et kohandada valgustugevuse taset LED-il.

manualTune(); – Kutsub välja käsitsi kohandamise funktsiooni, mis reguleerib valgustugevust käsitsi määratud vahemikus.

analogWrite(ledPin, lightLevel); – Lülitab LED-i heleduse vastavalt lightLevel väärtusele. Seda saab kasutada sujuvaks valgustuse reguleerimiseks.

Serial.print(lightLevel); – Kuvab Serial Monitoris valgustugevuse väärtuse (0–1023).

Serial.println(“”); – Kuvab Serial Monitoris tühja rea, et eraldada erinevad andmed.

————————————————–Ülesanne Öölamp——————————————————

Töö kirjeldus:

Nelja töörežiimiga öövalgusti fotoresistoriga:
Režiim 1) Kõik LED-id välja lülitatud
Režiim 2) Ainult üks kahest valgusdioodist on sisse lülitatud.
Režiim 3) Kõik kaks dioodi on sisse lülitatud.
Režiim 4) Kõik 2 dioodi töötavad täisvõimsusel sõltumata fotoresistori valgustusest!

Kasutatud komponenid:

Arduino UNO plaat (1tk)
Arendusplaat (1tk)
Juhtmed (10tk)
Takisti (3tk, 220Om ja 10000Om)
LED (2tk: 1 valge ja 1 roheline)
PHOTORESISTOR (1tk)
Potentsiomeetr (1tk)

Töö protsess:

Öövalgusti, millel on 4 erinevat töörežiimi, mida saab lülitada potentsiomeetri abil ja mis töötab fotoresistori ja valgusallikaga.
1) Kõik valgusdioodid on välja lülitatud ka siis, kui fotoresistori valgus on sisse lülitatud.
2) Üks LED on sisse lülitatud ja mõjutab valguse
3) Kaks valgusdioodi on sisse lülitatud ja mõjutavad valgust
4) Kõik kaks LED-i põlevad maksimaalselt (sõltumata fotoresistori valgusest!).

LED-ide rakendamine:

Valgustus kodus või õues inimeste mugavuse huvides. Valgustub sõltuvalt ümbritsevast valguse hulgast

Skeem:

Programm:

// Pins
const int ldrPin = A0;
const int potPin = A1;

const int ledPins[] = {8, 9, 10};
const int ledCount = 3;

void setup() {
  for (int i = 0; i < ledCount; i++) {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW);
  }

  Serial.begin(9600);
}

void loop() {
  int lightLevel = analogRead(ldrPin);
  int potValue = analogRead(potPin);

  // Potentsiomeetri väärtus 5 tsooni kohta
  int mode = map(potValue, 0, 1023, 1, 5);

  Serial.print("Režiim: ");
  Serial.print(mode);
  Serial.print(" | Valgustus: ");
  Serial.println(lightLevel);

  switch (mode) {
    case 1: // Kõik välja lülitatud
      controlLeds(0);
      break;

    case 2: // Üks LED sõltuvalt valgustusest
      if (lightLevel < 500) controlLeds(1);
      else controlLeds(0);
      break;

    case 3: // Kaks valgusdioodi sõltuvalt valgustusest
      if (lightLevel < 500) controlLeds(2);
      else controlLeds(0);
      break;

    case 4: // Kolm valgusdioodi sõltuvalt valgusest
      if (lightLevel < 500) controlLeds(3);
      else controlLeds(0);
      break;

    case 5: // Kõik alati kaasa arvatud
      controlLeds(3);
      break;
  }

  delay(100);
}

void controlLeds(int numberOn) {
  for (int i = 0; i < ledCount; i++) {
    digitalWrite(ledPins[i], i < numberOn ? HIGH : LOW);
  }
}

Video:

https://drive.google.com/file/d/1UX8YoPA5zNEzMOKGgGgiXt0ASJgVhz-e/view?usp=sharing

Uued funktsioonid :

map(lightLevel, 0, 1023, 255, 0) – Esimene parameeter on algväärtus, mida tahame teisendada (lightLevel), Teine ja kolmas parameeter on algväärtuste vahemik, st 0 kuni 1023, Neljas ja viies parameeter on sihtvahemik, millesse me tahame väärtust teisendada, st 255 kuni 0. See tähendab, et kui lightLevel on minimaalne (0), on heledus maksimaalne (255) ja vastupidi.

abs() – on sisseehitatud funktsioon, mis tagastab arvu absoluutväärtuse. Käesoleval juhul rakendatakse seda praeguse potentsiomeetri väärtuse (potValue) ja eelmise väärtuse (previousPotValue) vahe suhtes.

int lightLevel = analogRead(ldrPin);
int potValue = analogRead(potPin); – Loeb analoogväärtused LDR-st ja potentsiomeetrist.

int mode = map(potValue, 0, 1023, 1, 5); – Teisendab potentsiomeetri väärtuse vahemikku 1 kuni 4 (režiimi valik).