Arduino 2-axlig servo solar tracker (5 / 6 steg)
Steg 5: Arduino koden
#define TILTL 2#define TILTH 3
#define botten 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 spd;
int divisor;
int känslighet;
int tiltl;
int tilth;
Ogiltiga inställningar () {
vservo.attach(9); tillmäter objektet servo servo på pin 9
hservo.attach(10); tillmäter objektet servo servo på stift 10
divisor = 10; Detta styr hastigheten på servo. lägre antal = högre hastighet
känslighet = 5; Detta styr känsligheten i tracker. lägre antal = högre känslighet. om din tracker ständigt Darr och tillbaka öka antalet
Serial.BEGIN(19200); Öppna seriell com
Serial.Print ("SolarTracker ready!");
pinMode (botten, indata); ställa in ingångarna
pinMode (TOPLEFT, indata);
pinMode (TOPRIGHT, indata);
pinMode (TILTL, indata);
pinMode (TILTH, indata);
}
Ogiltig loop () {
tiltl = digitalRead(TILTL); Läs tilt sensor
Tilth = digitalRead(TILTH);
tlsense = analogRead(TOPLEFT); Läs ljussensorer
trsense = analogRead(TOPRIGHT);
bsense = analogRead(BOTTOM);
bsense = bsense * 1,05; Jag var tvungen att justera värdet av sensor för att göra det mer exakt. Du kan behöva göra samma sak men börja med lämnar den ensam
tavg = (tlsense + trsense) / 2; få ett genomsnittligt värde för top 2 sensorer
diff = abs (tavg - bsense); Detta bedömer hur långt tracker måste vända
SPD = diff/divisor; och justerar hastigheten på reaktionen därefter
SPD = max (spd, 1); Anger den lägsta hastigheten till 1
Serial.Print ("\nTOP:"); Serial.Print (tavg, DEC); skriva ut sensorn värdena till den seriella com
Serial.Print("\tBOTTOM:"); Serial.Print (bsense, DEC);
Serial.Print("\tLEFT:"); Serial.Print (tlsense, DEC);
Serial.Print("\tRIGHT:"); Serial.Print (trsense, DEC);
om ((tavg < bsense) & & (diff > känslighet) & & (tiltl == låg) & & (tilth == låg)) {/ / om det genomsnittliga värdet av de översta sensorerna är mindre (mer ljus) än botten sensorn och tilt sensorn är i rätt intervall
vservo.write (90 - spd); Skicka servo kommando för att vända uppåt plus lägga till hastighet
Serial.Print ("\tState:"); Serial.Print("up!");
} else om ((tavg < bsense) & & (diff > känslighet) & & (tiltl == hög) & & (tilth == låg)) {/ / om det genomsnittliga värdet av de översta sensorerna är mindre (mer ljus) än botten sensorn och tilt sensorn är i rätt intervall
vservo.write (90 - spd); Skicka servo kommando för att vända uppåt plus lägga till hastighet
Serial.Print ("\tState:"); Serial.Print("up!");
} else om ((tavg > bsense) & & (diff > känslighet) & & (tiltl == hög) & & (tilth == låg)) {/ / om värdet på botten sensorn är mindre (mer ljus) än det genomsnittliga värdet av de översta sensorerna och tilt sensor är i rätt intervall
vservo.write (90 + spd); Skicka servo kommando att vända nedåt samt lägga till hastighet
Serial.Print ("\tState:"); Serial.Print("down!");
} else om ((tavg > bsense) & & (diff > känslighet) & & (tiltl == låg) & & (tilth == hög)) {/ / om värdet på botten sensorn är mindre (mer ljus) än det genomsnittliga värdet av de översta sensorerna och tilt sensor är i rätt intervall
vservo.write (90 + spd); Skicka servo kommando att vända nedåt samt lägga till hastighet
Serial.Print ("\tState:"); Serial.Print("down!");
} annat {/ / för varje annan instans
vservo.write(90); stoppa motorn y-axeln
Serial.Print ("\tState:"); Serial.Print("stop!");
}
tlsense = analogRead(TOPLEFT); läsa upp 2 sensorer igen eftersom de har förmodligen ändrat
trsense = analogRead(TOPRIGHT);
trsense = trsense * 1,03; igen jag var tvungen att justera värdet av en sensor för att göra tracker mer exakt
diff = abs (tlsense - trsense); återställa variabeln diff för de nya värdena
SPD = diff/divisor; och därmed generera en hastighet
SPD = max (spd, 1); som lägsta hastigheten till 1
om ((tlsense < trsense) & & (diff > känslighet)) {/ / om övre vänstra sensorn är mindre (mer ljus) än den översta högra sensorn
hservo.write (90 + spd); Skicka servo kommando att svänga vänster
Serial.Print ("\tState:"); Serial.Print("left!");
} else om ((tlsense > trsense) & & (diff > känslighet)) {/ / om övre vänstra sensorn värdet är större (mindre ljus) än den översta högra sensorn
hservo.write (90 - spd); Skicka servo kommando till höger
Serial.Print ("\tState:"); Serial.Print("Right!");
} annat {/ / för varje annan instans
hservo.write(90); stoppa motorn x-axeln
Serial.Print ("\tState:"); Serial.Print("stop!");
}
Delay(10); dröjsmål 10ms
}
Arduino avsöker sensorerna och reagerar därför att se till att aldrig tilta för långt ner eller upp. Skillnaden i ljus avgör hur snabbt tracker bör reagera.