Ülesanne #1

Komponendid

  • Arduino UNO plaat (1tk)
  • Arendusplaat (1tk)
  • Juhtmed (7tk)
  • 330 Ω takisti (1tk -220Ω, 2tk – 10kΩ)
  • LED (1tk)
const int button1Pin = 2; // viik kuhu on ühendatud 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)) &&
      !((button1State == LOW) && (button2State == LOW))) {  // kui ainult üks nupp on alla vajutatud

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

  } else {

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

  }
} 

Ülesanne #2

Komponendid

  • Arduino UNO plaat (1tk)
  • Arendusplaat (1tk)
  • Juhtmed (6tk)
  • 330 Ω takisti (1tk -220Ω, 1tk – 10kΩ)
  • LED (1tk)
  • Fotoresistor (1tk)
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);
}

Öölamp

Video

https://drive.google.com/file/d/1FYvBk3ypcrEbxwL27a0gwX9womS1ZFxo/view?usp=sharing

Kirjeldus

Öövalgus, mis reageerib ümbritsevale valgusele ja mida saab juhtida nupu või potentsiomeetriga. Ühes režiimis põleb öövalgus ainult sinise valgusega, teises režiimis aga vahetab see erinevaid värve.

Komponendid

  • Arduino UNO plaat (1tk)
  • Arendusplaat (1tk)
  • Juhtmed (6tk)
  • 330 Ω takisti (1tk -220Ω, 1tk – 10kΩ)
  • LED (1tk)
  • Fotoresistor (1tk)

Uuritud funktsioonid

analogWrite(pin, value)Saadab PWM-signaali määratud pinni kaudu, et juhtida näiteks LED-i heledust. Väärtus on vahemikus 0 (täiesti väljas) kuni 255 (täisvõimsus).
analogRead(pin)Loeb analoogsisendi väärtuse vahemikus 0 kuni 1023. Seda kasutatakse näiteks fotorresistori või potentsiomeetri väärtuste saamiseks.
Serial.begin(9600)Käivitatakse, et seada seriaalühenduse kiirus (baud rate). Võimaldab andmete saatmist ja vastuvõtmist Serial Monitori kaudu.
Serial.print()Need käsud saadavad tekstipõhist infot Serial Monitori. println() lisab reavahetuse, print() jätkab samal real.
random(min, max)Tagastab juhusliku täisarvu vahemikus min kuni max - 1. Kasulik näiteks LED-ide värvi või käitumise juhuslikuks muutmiseks.
map(value, fromLow, fromHigh, toLow, toHigh)Teisendab mingis vahemikus oleva väärtuse teise vahemikku. Näiteks kui sensor annab väärtuse vahemikus 0–1023, saab selle muuta sobivaks LED-i või mootori juhtimiseks vahemikus 1–3.
constrain(value, min, max)Kindlustab, et mingi arvuline väärtus jääks määratud piiridesse. Kui väärtus läheb liiga suureks või väikeseks, kärbitakse see määratud miinimumi või maksimumi järgi.

Selgitus

Määratakse RGB-LED-i, samuti fotoresistori ja potentsiomeetri pin’id. Lisaks määratakse muutujad valgustaseme jälgimiseks ja automaatse kalibreerimise piiride seadmiseks.

int RED = 11;
int GREEN = 10;
int BLUE = 9;

int potentsiomeeterPIN = A0;
int photoresistorPIN = A1;

int lightLevel, high = 0, low = 1023;

Seadistatakse RGB-kanalite väljundid ning käivitatakse jadaliides silumiseks portaali jälgimise kaudu.

void setup() {
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);

  Serial.begin(9600);
}

Loetakse praegused väärtused fotoresistorilt ja potentsiomeetrilt.

void loop() {
  int photoresistorVALUE = analogRead(photoresistorPIN);    
  int potentsiomeeterVALUE = analogRead(potentsiomeeterPIN); 

Potentsiomeetri asendi põhjal määratakse üks kolmest töörežiimist. Väärtus piiritletakse vahemikus 1 kuni 3.

  int mode = map(potentsiomeeterVALUE, 0, 1023, 1, 3);   
  mode = constrain(mode, 1, 3);  

Valgustaseme väärtus salvestatakse muutujasse ja kohandatakse automaatselt vahemikku 0 kuni 255, kasutades funktsiooni autoTune.

  lightLevel = photoresistorVALUE; 
  autoTune(); 

Väljund portaali jälgimisele aitab jälgida fotoresistori praegust olekut ja kohandatud heledusväärtust.

  Serial.print("photoresistorVALUE: ");
  Serial.print(photoresistorVALUE);
  Serial.print(", lightLevel: ");
  Serial.println(lightLevel);

Esimeses režiimis on öölamp täielikult välja lülitatud — kõik värvid on välja lülitatud.

  if (mode == 1) {
    analogWrite(RED, 0);
    analogWrite(GREEN, 0);
    analogWrite(BLUE, 0);

Teises režiimis aktiveeritakse sinakas värv (sinise ja rohelise segu), heledus sõltub valgustasemest.

  } else if (mode == 2) {
    analogWrite(RED, 0);
    analogWrite(GREEN, lightLevel);
    analogWrite(BLUE, lightLevel);

Kolmandas režiimis kasutatakse juhuslikku tooni genereerimist, mis skaleeritakse vastavalt praegusele valgustasemele. Värve uuendatakse iga 300 ms tagant.

  } else if (mode == 3) {
    int redPin = random(100, 200);
    int greenPin = random(50, 150);
    int bluePin = 255;

    int redValue = (redPin * lightLevel) / 255;
    int greenValue = (greenPin * lightLevel) / 255;
    int blueValue = (bluePin * lightLevel) / 255;

    analogWrite(RED, redValue);
    analogWrite(GREEN, greenValue);
    analogWrite(BLUE, blueValue);

    delay(300);
  }

  delay(100);
}

Funktsioon jälgib valgustaseme minimaalsete ja maksimaalsete väärtuste muutumist, et kohandada LED-i heledust muutuvates tingimustes.

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

Kood

int RED = 11;
int GREEN = 10;
int BLUE = 9;

int potentsiomeeterPIN = A0;
int photoresistorPIN = A1;

int lightLevel, high = 0, low = 1023;

void setup() {
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);

  Serial.begin(9600);
}

void loop() {
  int photoresistorVALUE = analogRead(photoresistorPIN); // loeme valguse taset
  int potentsiomeeterVALUE = analogRead(potentsiomeeterPIN); // loeme potentsiomeetri asendit

  int mode = map(potentsiomeeterVALUE, 0, 1023, 1, 3); // teisendame väärtuse režiimiks 1-3
  mode = constrain(mode, 1, 3); // piirame režiimi lubatud vahemikku

  lightLevel = photoresistorVALUE; // salvestame valguse tugevuse
  autoTune(); // kohandame heledust vastavalt valgusele

  Serial.print("photoresistorVALUE: ");
  Serial.print(photoresistorVALUE);
  Serial.print(", lightLevel: ");
  Serial.println(lightLevel);

  if (mode == 1) {
    analogWrite(RED, 0); // režiim 1: valgus on välja lülitatud
    analogWrite(GREEN, 0);
    analogWrite(BLUE, 0);
  } else if (mode == 2) {
    analogWrite(RED, 0); // režiim 2: helesinine valgus
    analogWrite(GREEN, lightLevel);
    analogWrite(BLUE, lightLevel);
  } else if (mode == 3) {
    int redPin = random(100, 200); // režiim 3: juhuslikud värvid
    int greenPin = random(50, 150);
    int bluePin = 255;

    int redValue = (redPin * lightLevel) / 255; // skaleerime värvi vastavalt valgusele
    int greenValue = (greenPin * lightLevel) / 255;
    int blueValue = (bluePin * lightLevel) / 255;

    analogWrite(RED, redValue);
    analogWrite(GREEN, greenValue);
    analogWrite(BLUE, blueValue);

    delay(300); // paus värvi muutuste vahel
  }

  delay(100); // üldine viivitus
}

void autoTune() {
  if (lightLevel < low) {
    low = lightLevel; // uuendame väikseimat mõõdetud väärtust
  }

  if (lightLevel > high) {
    high = lightLevel; // uuendame suurimat mõõdetud väärtust
  }

  lightLevel = map(lightLevel, low + 10, high - 30, 0, 255); // teisendame väärtuse vahemikku 0–255
  lightLevel = constrain(lightLevel, 0, 255); // piirame väärtuse lubatud piiridesse
}