Proiectul reprezinta o macheta a unui panou solar ce se afla pe un suport rotativ. Scopul acestuia este sa se invarta dupa sursa de lumina maximizand, astfel, “energia generata”. Informatii referitoare la energie vor fi afisate pe un ecran LCD. Disclaimer: Orice inginer de control va fi cel putin dezgustat de rezultatele proiectului meu
Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html
Voi folosi un mircocontroller Arduino UNO R3 la care va fi legat senzorul de lumina pe I2C. Acesta fiind un senzor analog cu ceva precizie, cel putin asa se lauda ei, ar trebui sa fie capabil sa diferentieze intesitatea luminii pe masura ce aceasta isi schimba pozitia. Folosindu-ne de acest input, va fi comandat un stepper, prin intermediul unui driver bineinteles, acesta fiind unul chinezesc. Informatii referitoare la energia generata de panou vor fi afisate pe un ecran LCD chinezesc, ce va fi legat pe uart.
Schema electrica, facut in ltspice si paint, nu sunt barbar sa o desenez:
In schema am folosit VDD si VSS in loc de 5V, respectiv GND pentru ca pentru “GND” nu-mi dadea ltspice-ul label, ci-mi dadea semnul de ground
Detalii pini:
Io-te, merge:
P.S. Nu se vede pe POZA, dar merge si motorul, doar senzorul nu l-am testat efectiv, adica, cum ar, veni, am facut si in plus (:
Panoul, desi haotic ish, reuseste sa gaseasca mereu blitz-ul telefonului si sa fie centrat pe el.
Desi arata horror, macar face cat de cat ce trebuie. Ar putea fi folosit efectiv in practica? NU! Se misca mult prea haotic pentru ceva ce ar cantarii sute de kg, dar pt 20g ale mele, functioneaza macar…
codul: Declararea componentelor, global de ce ma-ntrebi:
int stepsPerRevolution = 2048; int motSpeed = 10; Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11); LiquidCrystal lcd(2, 3, 4, 5, 6, 7); Adafruit_VEML7700 veml;
Partea de begin, practic initializarea a ceea ce voi folosi:
Serial.begin(9600); myStepper.setSpeed(motSpeed); lcd.begin(16,2); if (veml.begin()) { Serial.println("Found a VEML7700 sensor"); } else { Serial.println("No sensor found ... check your wiring?"); while (1); } veml.setGain(VEML7700_GAIN_1); veml.setIntegrationTime(VEML7700_IT_100MS); Timer1.initialize(10000000); Timer1.attachInterrupt(checkADC);
Partea de loop:
void loop() { int code = look_for_better_sunlight(); if(code == 10000) { lcd.clear(); int lux = veml.readLux(); while(lux > 700) { lux = veml.readLux(); float W = 220.0 * lux / 700; lcd.clear(); lcd.setCursor(0,0); lcd.print("Lux: " + String(lux) + " KW: " + String(W)); lcd.setCursor(0,1); lcd.print("Sunlight is good"); } } }
Functia care efectiv imi gaseste lumina:
int look_for_better_sunlight() { int lux = veml.readLux(); float W = 220.0 * lux / 700; lcd.clear(); lcd.setCursor(0,0); lcd.print("Bad sunlight"); lcd.setCursor(0,1); lcd.print("Lux: " + String(lux) + " KW: " + String(W)); int current_steps = 0; while (lux < 700) { current_steps = 0; while(current_steps < stepsPerRevolution/2) { int lux_ant = lux; myStepper.step(stepsPerRevolution/64); current_steps += stepsPerRevolution/64; lux = veml.readLux(); float W = 220.0 * lux / 700; lcd.setCursor(0,1); lcd.print("Lux: " + String(lux) + " KW: " + String(W)); if (lux > 700) { Serial.println("boss1"); return 10000; } if(lux < lux_ant) { break; } delay(100); } while (current_steps > -stepsPerRevolution/2) { int lux_ant = lux; myStepper.step(-stepsPerRevolution/64); current_steps -= stepsPerRevolution/64; lux = veml.readLux(); float W = 220.0 * lux / 700; lcd.setCursor(0,1); lcd.print("Lux: " + String(lux) + " KW: " + String(W)); if (lux > 700) { Serial.println("boss2"); return 10000; } if (lux < lux_ant) { break; } delay(100); } } }
Intreruperea ce genereaza un timer de 10 secunde, ce afiseaza pe LCD “ora noua”, in sensul ca dupa mintea lui a trecut o ora(daca l-as lasa chiar o ora n-as mai avea ce arata la demo)
void checkADC() { customInterrupt(); } void customInterrupt() { lcd.setCursor(0,0); lcd.print("Ora noua?"); delay(1000); }