Solar Power LinkIt (med Tracking) (5 / 5 steg)
Steg 5: Enkel enda axel spårning: programvara
Det gladde mig att hitta en färdig lösning för att bestämma höjd/Azimut från latitud/longitud på Arduino forum. Om du är intresserad av driften av koden jag rekommenderar att läsa tråden, jag vill bara peka på några viktiga punkter.
Bestämma tid/plats från GPS
Jag har skrivit om detta några gånger nu i andra Instructables, så för mitt eget förstånd skall jag bara hänvisa dig till min GSM Närhetssensor, steg 2 för detaljer.
Jag var bara tvungen att konvertera latitud och longitud till lämplig datatyp och voila, visko koden spottade ut en elevation och Azimut
Kontrollera programvaran
Du kommer att kontrollera att elevation och Azimut värdena som du får är korrekt, jag rekommenderar timeanddatepraktiskt verktyg, här är en länk för Kapstaden, men du kommer att kunna hitta din egen stad.
Omvandla höjd till Servo Position
Om du ta titt på tomt ovan ser du att höjden varierar från 0° till ca 78° och sedan tillbaka till 0°. Denna vinkel är solen över horisonten "höjd".
Eftersom min trackers rotationsaxel är vinklad Nord-syd servo måste gå från 0° (sunrise) till 90° (lunchtid) och över till 180° (solnedgång).
Jag beslutade att det enklaste sättet att uppnå detta att skala höjd vinkeln (med funktionen map()), vilket innebar att jag behöver beräkna noon höjd före tid. Jag gör detta genom att stega igenom decimal timmar 6 minuter intervaller och beräkna solens position för var och en.
denna funktion determins maximal höjd (dvs. vid middagstid) den aktuella dagen
bara göra det en gång per dag
kom ihåg att reparse GPS strängen efteråt, eftersom det bråkar med tid variabler
void determineMaxElevation() {
ElevationMaxToday = 0;
Timmar = 0,0;
Minuter = 0,0;
medan (timmar < 24,0) {
Timmar + = 0,1; Increment timme med 0,1 (6 minuter)
sunPos();
om (ElevationAngle > ElevationMaxToday) {
ElevationMaxToday = ElevationAngle;
Middag = timmar;
}
}
Serial.Print ("middag idag på");
Serial.println(Noon);
Serial.Print ("högsta höjd");
Serial.println(ElevationMaxToday);
}
Den enda kvarvarande frågan är att konvertera 0°-90°-0 ° förflyttning av solen i 0° - 180° rörelse för servo. Detta är dock lätt, vi bara dela upp dagen på middagen och göra två separata mappningar.
om (DecimalHours < Noon) {
panelElev = map(ElevationAngle,0,ElevationMaxToday,sunRiseServoAngle,midDayServoAngle);
}
annat {
panelElev = map(ElevationAngle,ElevationMaxToday,0,midDayServoAngle,sunSetServoAngle);
}
Visa laddning staten
Det är bra att veta om enheten laddas eller inte, lyckligtvis, det finns ett bibliotek för som ingår. Nedan är ett exempel på hur jag använder det att ställa in variabeln staten för min bärnsten ledde
#include < LBattery.h >
void chargeStatus() {
IF(LBattery.isCharging()) {
ledStateAmber = hög;
}
annat {
ledStateAmber = låg;
}
}
Blinkande indikator lysdioder
Jag använde min kod från mitt tidigare projekt för att hantera blinkande/uppdatera Lysdioderna