Stap 5: Eenvoudige enkele as Tracking: Software
Ik was blij te vinden van een kant en klare oplossing voor het bepalen van de hoogte/azimuth van breedte-/ lengtegraad op de Arduino forum. Als u geïnteresseerd bent in de werking van de code beveel ik het lezen van de draad, ik wil gewoon wijzen op een paar saillante punten.
Bepalen tijd/locatie van GPS
Ik heb geschreven over dit een paar keer nu in andere Instructables, dus voor mijn eigen verstand zal ik u gewoon rechtstreeks naar mijn sensor van de nabijheid van GSM, stap 2 voor meer informatie.
Ik had net te zetten de lengte- en breedtegraad om het juiste gegevenstype en voila, mowcius' code spuwde uit een hoogte en het Azimut
Controleer of de Software
U zult willen controleren dat de hoogte en het Azimut waarden dat u krijgt kloppen, ik beveel timeanddatehandige tool, hier een link voor Kaapstad is, maar u zal zitten kundig voor uw eigen stad vinden.
Omzetten van hoogte in Servo positie
Als u kijkje op perceel hierboven nemen ziet u dat de hoogte van 0° tot ongeveer 78° en vervolgens weer terug tot 0 varieert °. Deze hoek vertegenwoordigt de "hoogte" van de zon boven de horizon.
Aangezien mijn trackers as van rotatie hoek Noord-Zuid de servo moet verplaatsen van 0° (sunrise) tot 90° ('s middags) en naar 180° (zonsondergang).
Heb ik besloten dat de eenvoudigste manier om dit te bereiken de elevatie-hoek moest (met behulp van de map()-functie), wat betekende dat ik nodig voor het berekenen van de hoogte van de middag tevoren schalen. Ik doe dit door doorlopen decimale uur 6 minuten tussenpozen en berekening van de positie van de zon voor elkaar.
//this function determins the maximum elevation (i.e. at noon) on the current day // only do it once per day //remember to reparse the GPS string afterwards, since it messes with time variables void determineMaxElevation() { ElevationMaxToday = 0; Hours = 0.0; Minutes = 0.0; while (Hours < 24.0) { Hours += 0.1; //increment hour by 0.1 (6 minutes) sunPos(); if ( ElevationAngle > ElevationMaxToday) { ElevationMaxToday = ElevationAngle; Noon = Hours; } } Serial.print("Noon today at "); Serial.println(Noon); Serial.print("Maximum Elevation "); Serial.println(ElevationMaxToday); }
De enige resterende probleem is de 0°-90°-0 °-beweging van de zon omzetten in 0° - 180° verkeer voor de servo. Dit is echter gemakkelijk, we gewoon de dag middags splitsen en doen twee afzonderlijke toewijzingen.
if (DecimalHours < Noon ) { panelElev = map(ElevationAngle,0,ElevationMaxToday,sunRiseServoAngle,midDayServoAngle); } else { panelElev = map(ElevationAngle,ElevationMaxToday,0,midDayServoAngle,sunSetServoAngle); }
Opladen status weergeven
Het is handig om te weten of het apparaat wordt opgeladen of niet, gelukkig, er is een bibliotheek voor die opgenomen. Hieronder is een voorbeeld van hoe ik het gebruiken om de variabele staat voor mijn amber LED
#include <LBattery.h> void chargeStatus() { if(LBattery.isCharging()) { ledStateAmber = HIGH; } else { ledStateAmber = LOW; } }
Indicator LED's knipperen
Ik gebruikte mijn code van mijn vorige project om de LED's knipperen/bijwerken