Stap 5: De code van de Arduino
#define TILTL 2#define TILTH 3
#define onderste 2
#define TOPLEFT 0
#define TOPRIGHT 1
#include < Servo.h >
#include "math.h"
Servo hservo;
Servo vservo;
int tlsense;
int trsense;
int bsense;
int tavg;
int diff;
int EPD;
int de deler;
int gevoeligheid;
int tiltl;
int tilth;
void setup () {}
vservo.attach(9); de servo op pin 9 hecht aan de servo-object
hservo.attach(10); de servo op pin 10 hecht aan de servo-object
deler = 10; Hiermee wordt de snelheid van de servo. lager aantal = hogere snelheid
gevoeligheid = 5; Hiermee wordt de gevoeligheid van de tracker. lager aantal = hogere gevoeligheid. Als je tracker is voortdurend heen en weer jitterpercentage het getal verhogen
Serial.begin(19200); Open seriële com
Serial.Print ("SolarTracker ready!");
pinMode (BOTTOM, INPUT); instellen van de ingangen
pinMode (TOPLEFT, INPUT);
pinMode (TOPRIGHT, INPUT);
pinMode (TILTL, INPUT);
pinMode (TILTH, INPUT);
}
void loop () {}
tiltl = digitalRead(TILTL); Lees de neigingsensor
tilth = digitalRead(TILTH);
tlsense = analogRead(TOPLEFT); Lees de lichtsensoren
trsense = analogRead(TOPRIGHT);
bsense = analogRead(BOTTOM);
bsense = bsense * 1.05; Ik moest de waarde van deze sensor om er nauwkeuriger aanpassen. Wellicht moet doen hetzelfde maar beginnen door het verlaten van het alleen
tavg = (tlsense + trsense) / 2; krijg een gemiddelde waarde voor de top 2 sensoren
diff = abs (tavg - bsense); Dit rechters hoe ver de tracker moet richten
SPD = diff/deler; en past de snelheid van de reactie dienovereenkomstig
SPD = max (spd, 1); Hiermee stelt u de minimumsnelheid op 1
Serial.Print ("\nTOP:"); Serial.Print (tavg, DEC); afdrukken van de sensor-waardes aan de seriële com
Serial.Print("\tBOTTOM:"); Serial.Print (bsense, DEC);
Serial.Print("\tLEFT:"); Serial.Print (tlsense, DEC);
Serial.Print("\tRIGHT:"); Serial.Print (trsense, DEC);
Als ((tavg < bsense) & & (diff > gevoeligheid) & & (tiltl == laag) & & (tilth == LOW)) {/ / als de gemiddelde waarde van de hoogste sensoren kleiner (meer licht) dan de sensor van de bodem is en de Kantelsensor in het juiste bereik is
vservo.write (90 - EPD); Stuur servo opdracht om te schakelen naar boven plus toevoegen snelheid
Serial.Print ("\tState:"); Serial.Print("up!");
} anders als ((tavg < bsense) & & (diff > gevoeligheid) & & (tiltl == HIGH) & & (tilth == LOW)) {/ / als de gemiddelde waarde van de hoogste sensoren kleiner (meer licht) dan de sensor van de bodem is en de Kantelsensor in het juiste bereik is
vservo.write (90 - EPD); Stuur servo opdracht om te schakelen naar boven plus toevoegen snelheid
Serial.Print ("\tState:"); Serial.Print("up!");
} anders als ((tavg > bsense) & & (diff > gevoeligheid) & & (tiltl == HIGH) & & (tilth == LOW)) {/ / als de waarde van de bodem sensor kleiner (meer licht is) dan is de gemiddelde waarde van de hoogste sensoren en de Kantelsensor in het juiste bereik
vservo.write (90 + spd); Stuur servo opdracht om te schakelen naar beneden plus toevoegen van snelheid
Serial.Print ("\tState:"); Serial.Print("down!");
} anders als ((tavg > bsense) & & (diff > gevoeligheid) & & (tiltl == laag) & & (tilth == HIGH)) {/ / als de waarde van de bodem sensor kleiner (meer licht is) dan is de gemiddelde waarde van de hoogste sensoren en de Kantelsensor in het juiste bereik
vservo.write (90 + spd); Stuur servo opdracht om te schakelen naar beneden plus toevoegen van snelheid
Serial.Print ("\tState:"); Serial.Print("down!");
} else {/ / voor elke andere instantie
vservo.write(90); stoppen met de y-as motor
Serial.Print ("\tState:"); Serial.Print("Stop!");
}
tlsense = analogRead(TOPLEFT); Lees de top 2 sensoren weer omdat ze hebben waarschijnlijk veranderd
trsense = analogRead(TOPRIGHT);
trsense = trsense * 1.03; weer moest ik de waarde van een sensor te maken van de tracker nauwkeuriger aanpassen
diff = abs (tlsense - trsense); Reset de diff-variabele voor de nieuwe waarden
SPD = diff/deler; en het genereren van een snelheid dienovereenkomstig
SPD = max (spd, 1); Stel de minimumsnelheid op 1
Als ((tlsense < trsense) & & (diff > gevoeligheid)) {/ / als de bovenste linker sensor-waarde kleiner (meer licht) dan de top juiste sensor is
hservo.write (90 + spd); Stuur servo opdracht linksaf
Serial.Print ("\tState:"); Serial.Print("left!");
} else if ((tlsense > trsense) & & (diff > gevoeligheid)) {/ / als de bovenste linker sensor-waarde groter (minder licht) dan de top juiste sensor is
hservo.write (90 - EPD); Stuur servo opdracht rechtsaf
Serial.Print ("\tState:"); Serial.Print("right!");
} else {/ / voor elke andere instantie
hservo.write(90); stoppen met de x-as motor
Serial.Print ("\tState:"); Serial.Print("Stop!");
}
delay(10); vertraging 10ms
}
Arduino opiniepeilingen van de sensoren en reageert bijgevolg ervoor nooit te kantelen te ver naar beneden of omhoog. Het verschil in licht bepaalt hoe snel de tracker moet reageren.