Deoarece versiunea anterioara avea un mic "defect", schimband intensitatea luminoasa a afisajului matriceal foarte repede daca erau variatii bruste ale luminii din mediu apropiat, am corectat asta in fisierul LEDMatrixV2ro4.ino din subdirectorul LEDMatrixV2ro4.
Dupa ce am testat un Ceas animat complex cu date de pe net, caruia ii pot regla, printre multe altele, intensitatea luminoasa de pe o pagina web locala, am realizat ca trebuie sa implementez reglajul automat al intenstatii luminoase si ceasului simplu de-l testasem, cel care preia ora de pe un server NTP si datele meteo de pe pe serverul openweathermap.
Dearece i-am printat si lui o carcasa, ca a ceasului complez (printata in oglinda), am constatat ca noaptea e bine sa am intensitate redusa, dar pe timpul zilei nu am se vad bine informatiile.
Am ales varianta cu divizor rezistiv format dintr-o fotorezistenta si o rezistenta de 10k, cum pusem la alt ceas, dupa modelul prezentat in articolul NodeMCU With LDR
Placa WeMos D1 Mini era conectata pe cablajul universal, asa ca au fost usor de montat rezistenta de 10k si fotorezistenta.
Schema de conectare este simpla,
dupa indicatiile din program:
iar partea adaugata pentru reglajul intensitatii in 5 trepte (0 - minim, 1, 2, 3 si 4 - maxim) este
iar in serial putem vedea:
Programul cu reglaj automat al intensitatii luminoase este LEDMatrixV2ro4, care este compus din mai multe fisiere:
Am facut o mica corectie pentru a se schimba mai lent intensitatea luminoasa a ecranului, facand modificari in fisierul LEDMatrixV2ro4.ino din LEDMatrixV2ro4.
Am reluat testele cu statia meteo si ceas care prezinta datele pe un afisaj cu rezolutie de 32x8 leduri (compus din 4 afisaje 8x8 leduri rosii), contorlate de integrate MAX7219, de data asta am afisajele montate intr-o carcasa, iar ca placa de dezvoltare, am folosit un Arduino Mega, ca era disponibil. Pentru temperatura se foloseste un senzor DHT11, iar pentru temperatura un DS18B20.
Fata de articolul precedent, in care am afisat datele pe ecranul de monitorizare seriala, acum o sa afisez pe un LCD1602 (afisaj alfanumeric cu 16 coloane si 2 randuri). Deoarece, in ultima perioada, am conectat afisajul doar la pinii D2..D7, o sa mut comanda releului de la D7 la D9, cel de-al doilea ramanand pe D8. Schema de conectare devine:
Un sketch, netestat inca, ar fi de genul:
/* Photocell simple testing sketch. Connect one end of the photocell to 5V, the other end to Analog 0.Then connect one end of a 10K resistor from Analog 0 to groundFor more information see http://learn.adafruit.com/photocellsniq_ro adapted software program in 20.01.2014, see http://nicuflorica.blogspot.com/*/
#include <LiquidCrystal.h>
// use LiquidCrystal.h library for alphanumerical display 1602LiquidCrystal lcd(2,3,4,5,6,7);
/* ------------------- | LCD | Arduino | ------------------- LCD RS pin to digital pin 7 | RS | D7 | LCD Enable pin to digital pin 6 | E | D6 | LCD D4 pin to digital pin 5 | D4 | D5 | LCD D5 pin to digital pin 4 | D5 | D4 | LCD D6 pin to digital pin 3 | D6 | D3 | LCD D7 pin to digital pin 2 | D7 | D2 | LCD R/W pin to ground | R/W | GND | -------------------*/int photocellPin = 0; // the cell and 10K pulldown are connected to a0int photocellReading; // the analog reading from the analog resistor dividerint relayPin = 9; // first relay controlint relayPin2 = 8; // second relay controlvoidsetup(void) {
// We'll send debugging information via the Serial monitorSerial.begin(9600);
pinMode(relayPin, OUTPUT); // pin "relayPin" is output pinpinMode(relayPin2, OUTPUT); // pin "relayPin" is output pin
lcd.begin(16, 2); // set up the LCD's number of columns and rows:
lcd.clear(); // clear the screen
lcd.setCursor(0, 0); // put cursor at colon 0 and row 0
lcd.print("Fotorezistenta"); // print a text
lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
lcd.print("comanda 2 relee"); // print a textdelay (2000);
lcd.clear(); // clear the screen
lcd.clear(); // clear the screen
lcd.setCursor(1, 0); // put cursor at colon 1 and row 0
lcd.print("Photoresistor"); // print a text
lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
lcd.print("control 2 relay"); // print a textdelay (2000);
}
voidloop(void) {
digitalWrite(relayPin, HIGH); // first auxiliar light is offdigitalWrite(relayPin2, HIGH); // second auxiliar light is off
photocellReading = analogRead(photocellPin);
lcd.clear(); // clear the screenif (photocellReading >999)
{
lcd.setCursor(0, 0); // put cursor at colon 0 and row 0
}
elseif (photocellReading >99)
{
lcd.setCursor(1, 0); // put cursor at colon 1 and row 0
}
elseif (photocellReading >9)
{
lcd.setCursor(2, 0); // put cursor at colon 2 and row 0
}
else
{
lcd.setCursor(3, 0); // put cursor at colon 3 and row 0
}
lcd.print(photocellReading); // print a text
lcd.print(" lx");
Serial.print(photocellReading); // the raw analog readingSerial.print(" lux");
// We'll have a few threshholds, qualitatively determinedif (photocellReading < 20) {
Serial.println(" - Dark (intuneric)");
digitalWrite(relayPin, LOW); // first auxiliar light is ondigitalWrite(relayPin2, LOW); // second auxiliar light is onSerial.println("All lights are on (Toate luminile sunt aprinse).");
Serial.println("***********************************************");
lcd.print(" - Dark");
lcd.setCursor(2, 1); // put cursor at colon 0 and row 1
lcd.print("Lights are on");
} elseif (photocellReading < 200) {
Serial.println(" - Dim (intunecat)");
digitalWrite(relayPin, LOW); // first auxiliar light is ondigitalWrite(relayPin2, HIGH); // second auxiliar light is offSerial.println("First light are on (Un circuit de lumina e aprins).");
Serial.println("***********************************************");
lcd.print(" - Dim");
lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
lcd.print("1st light are on");
} elseif (photocellReading < 500) {
Serial.println(" - Light (lumina normala)");
digitalWrite(relayPin, HIGH); // first auxiliar light is offdigitalWrite(relayPin2, HIGH); // second auxiliar light is offSerial.println("All lights are off (Toate luminile sunt stinse).");
Serial.println("***********************************************");
lcd.print(" - Light");
lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
lcd.print("All lights off!");
} elseif (photocellReading < 800) {
Serial.println(" - Bright (lumina buna)");
digitalWrite(relayPin, HIGH); // first auxiliar light is offdigitalWrite(relayPin2, HIGH); // second auxiliar light is offSerial.println("All lights are off (Toate luminile sunt stinse).");
Serial.println("***********************************************");
lcd.print(" - Bright");
lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
lcd.print("All lights off!");
} else {
Serial.println(" - Very bright (lumina puternica)");
digitalWrite(relayPin, HIGH); // first auxiliar light is offdigitalWrite(relayPin2, HIGH); // second auxiliar light is offSerial.println("All lights are off (Toate luminile sunt stinse).");
Serial.println("***********************************************");
lcd.print("-Dazzling");
lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
lcd.print("All lights off!");
}
delay(1500);
}
Am reusit sa fac si o poza:
Dupa mai multe incercari,am reusit sa fac poze cu cele 4 cazuri: - lumina orbitoare (soare puternic):
- lumina normala:
- lumina slabuta, s-a aprins un set de lumini, pentru compensare:
- intuneric, s-au aprins ambele circuite de lumini, pentru a compensa lipsa lumnii naturale:
Filmuletul teste cu fotorezistenta, 2 relee si Arduino (II) realizat cu un aparat photo FujiFilm S5700 este de o calitate slabuta, datorita luminii foarte slabe din camera, dar care ajuta la intelegerea modului de comportare al montajului.
Fotorezistentele sunt componente pasive, care-si modifica valoarea (rezistenta) functie de intensitatea luminoasa (au rezistent amare la intuneric si mica la lumina puternica). In articolul Using a Photocell este prezentat un material foarte bun, din care m-am inspirat si eu. Dupa ce ma incercat primele 2 exemple de acolo, am modificat sketch-ul ca la un anumit prag de intuneric sa se cupleze un releu, iar la lumina foarte slaba (intuneric), inca unul. Circuitul de conectare al fotorezistentei, este foarte simplu, necesitand doar o rezistenta:
iar placa cu 2 relee are comanda la pinii D7, respectiv D8.
Logica de comanda este inversata, adica daca pe pinul de comanda este 0 logic (LOW), releul este actionat si daca este 1 logic (HIGH) este neconectat, cum am prezentat mai de mult in articolul Placa cu 4 relee pentru Arduino (.. si nu numai).
Montajul testat arata asa (mai contine si alte parti de circuit, nefolosite):
Pe ecran am obtinut:
Sketch-ul adaptat de mine este:
/* Photocell simple testing sketch. Connect one end of the photocell to 5V, the other end to Analog 0.Then connect one end of a 10K resistor from Analog 0 to groundFor more information see http://learn.adafruit.com/photocellsniq_ro adapted software program in 20.01.2014, see http://nicuflorica.blogspot.com/*/int photocellPin = 0; // the cell and 10K pulldown are connected to a0int photocellReading; // the analog reading from the analog resistor dividerint relayPin = 7; // first relay controlint relayPin2 = 8; // second relay controlvoidsetup(void) {
// We'll send debugging information via the Serial monitorSerial.begin(9600);
pinMode(relayPin, OUTPUT); // pin "relayPin" is output pinpinMode(relayPin2, OUTPUT); // pin "relayPin" is output pin
}
voidloop(void) {
digitalWrite(relayPin, HIGH); // first auxiliar light is offdigitalWrite(relayPin2, HIGH); // second auxiliar light is off
photocellReading = analogRead(photocellPin);
Serial.print(photocellReading); // the raw analog readingSerial.print(" lux");
// We'll have a few threshholds, qualitatively determinedif (photocellReading < 20) {
Serial.println(" - Dark (intuneric)");
digitalWrite(relayPin, LOW); // first auxiliar light is ondigitalWrite(relayPin2, LOW); // second auxiliar light is onSerial.println("All lights are on (Toate luminile sunt aprinse).");
Serial.println("***********************************************");
} elseif (photocellReading < 200) {
Serial.println(" - Dim (intunecat)");
digitalWrite(relayPin, LOW); // first auxiliar light is ondigitalWrite(relayPin2, HIGH); // second auxiliar light is offSerial.println("First light are on (Un circuit de lumina e aprins).");
Serial.println("***********************************************");
} elseif (photocellReading < 500) {
Serial.println(" - Light (lumina normala)");
digitalWrite(relayPin, HIGH); // first auxiliar light is offdigitalWrite(relayPin2, HIGH); // second auxiliar light is offSerial.println("All lights are off (Toate luminile sunt stinse).");
Serial.println("***********************************************");
} elseif (photocellReading < 800) {
Serial.println(" - Bright (lumina buna)");
digitalWrite(relayPin, HIGH); // first auxiliar light is offdigitalWrite(relayPin2, HIGH); // second auxiliar light is offSerial.println("All lights are off (Toate luminile sunt stinse).");
Serial.println("***********************************************");
} else {
Serial.println(" - Very bright (lumina puternica)");
digitalWrite(relayPin, HIGH); // first auxiliar light is offdigitalWrite(relayPin2, HIGH); // second auxiliar light is offSerial.println("All lights are off (Toate luminile sunt stinse).");
Serial.println("***********************************************");
}
delay(2500);
}