Dit is een project dat mijn studenten uitvoerden tijdens de avondclub Young Hackers 2017-2018. Het is een veeleisend project voor basisschoolleerlingen en er waren veel vergaderingen voor nodig. Het bevat een klein 5V-zonnepaneel dat in twee assen kan draaien om maximaal vermogen van de zon te oogsten. Het project is gebaseerd op het Dual Axis Solar Tracker Project van OpenSourceClassroom.
We wilden twee modi in het eindproduct implementeren.
Om dat te bereiken hebben we het apparaat geprogrammeerd om tussen modi te wisselen met behulp van een drukknop en twee indicatieleds. Als het apparaat in handmatige modus staat, brandt het rode lampje en kunnen we de rotatie van het paneel in twee assen regelen met behulp van twee potentiometers. Wanneer het apparaat in de automatische modus staat, brandt het blauwe lampje en wordt de rotatie van het paneel bepaald door het licht dat wordt opgevangen door de vier LDR's. Het programmeren is gedaan in tinkercad.
Studenten werkten in groepen in een productielijnstijl om de taken te voltooien. (draad solderen, draad isoleren, onderdelen schroeven etc.).
Code
- Roterende zonnepaneelcode
Roterende zonnepaneelcodeArduino
De uiteindelijke code van het zonnepaneel met twee assen#include //Initialize variablesint mode =0; int knopState =0; int prevButtonState =0; int topLeftLight =0; int topRightLight =0;int bottomLeftLight =0;int bottomRightLight =0;int LeftLight =0;int RightLight =0;int TopLight =0;int BottomLight =0;//Declareer twee servo'sServo servo_9;Servo servo_10;void setup(){ pinMode (7, INGANG); //Mode-knop pinMode (12, OUTPUT); // Led-indicator voor handmatige modus pinMode (11, OUTPUT); // Led-indicator voor pinMode in automatische modus (A0, INPUT); // Potentiometer voor rechts-links beweging pinMode (A1, INPUT); // Potentiometer voor opwaartse beweging pinMode (A2, INPUT); // Lichtsensor omhoog - linker pinMode (A3, INPUT); // Lichtsensor omhoog - rechter pinMode (A4, INPUT); //Lichtsensor onder - linker pinMode (A5, INPUT); //Lichtsensor onder - rechts servo_9.attach (9); // Servomotor rechts - links beweging servo_10.attach (10); // Servomotor omhoog - omlaag beweging} ongeldige lus () {buttonState =digitalRead (7); if (buttonState !=prevButtonState) {if (buttonState ==HIGH) {//Wijzig modus en licht de juiste indicator op if (mode ==1) { mode =0; digitalWrite (12, HOOG); digitalWrite (11, LAAG); } anders { modus =1; digitalWrite (11, HOOG); digitalWrite (12, LAAG); } } } prevButtonState =buttonState; vertraging (50); // Wacht 50 milliseconde (s) als (modus ==0) {//Als de modus handmatig is, wijs de potwaarden toe aan rotatiegraden servo_9.write (map (analogRead (A0), 0, 1023, 0, 180) ); servo_10.write(map(analogRead(A1), 0, 1023, 0, 180)); } else { // if mode is auto map the sensor values to 0-100 light intensity. //Elke lichtsensor heeft een andere gevoeligheid en moet eerst worden getest //voor zijn hoge en lage waarden topLeftLight =map(analogRead(A2),50,980,0,100); topRightLight =map(analogRead(A3),200.990,0.100); bottomLeftLight =kaart(analogRead(A4),170,970,0,100); bottomRightLight =kaart (analogRead (A5),250,1000,0,100); // Bereken de gemiddelde lichtomstandigheden TopLight =((topRightLight + topLeftLight) / 2); BottomLight =((bottomRightLight + bottomLeftLight) / 2); LeftLight =((topLeftLight + bottomLeftLight) / 2); RightLight =((topRightLight + bottomRightLight) / 2); // Draai de servo's indien nodig if (abs ((RightLight - LeftLight))> 4) {// Verander de positie alleen als het lichtverschil groter is dan 4% if (RightLight LeftLight) { if (servo_9.read()> 0) { servo_9.write((servo_9.read() - 1)); } } } if (abs((TopLight - BottomLight))> 4) { // Wijzig positie alleen als het lichtverschil groter is dan 4% if (TopLight BottomLight) { if (servo_10.read()> 0) { servo_10.write((servo_10.read() + 1)); } } } }}
Schema's
bedradingsschema