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

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
}