Sketch completo del progetto
/* Effettua un'escursione completa di rotazione oraria e antioraria testando i due relè reed
* Acquisisce durante la prima escursione il valore della luminosità di fondo con la fotoresistenza
* Inserisce il contatore di Step
* Ricerca del punto di START (Posizionamento iniziale per la scansione dei valori)
* Array e ricerca del valore Max
* Inseguimento da lettura fotodiodi
* Led rosso di REC e segnalazione codici di errore
* Led verde di spostamento per posizione ottimale
* Alla fine del ciclo di inseguimento va alla posizione di start spegne il motore pp.
* Legge valore luminosità di fondo e quando sorge il sole riparte.
 */
//---------- RESET VIA SOFTWARE --------------------------------------
#include <avr/io.h>
#include <avr/wdt.h>
#define Reset_AVR() wdt_enable(WDTO_30MS); while(1) {}
// -------------------------------------------------------------------
float myArray [118]; // Crea array di 118 elementi, poi si varia
int i=0;
float massimo=0;
int NumeroStep=0;
int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;
int motor_Speed = 25;
int stepCount = 0;
byte label1 = 0; //Semaforo rosso di inversione di marcia
float fot1; // fotodiodo 1
float fot2; // fotodiodo 2
float Deltaf; // fot1-fot2
float fr1; // fotoresistenza 1
byte SW1=0; // Relè reed fine corsa START
byte SW2=0; // Relè reed fine corsa END
 void setup() {
 Serial.begin(9600);
 pinMode (4, OUTPUT); //Led Rosso di registrazione dati e segnalazione codici di errore
 pinMode (5, OUTPUT); //Led Verde di segnalazione ok
 pinMode (6, OUTPUT); //Pilotaggio relè alimentazione scheda motore pp

 pinMode (motorPin1, OUTPUT);
 pinMode (motorPin2, OUTPUT);
 pinMode (motorPin3, OUTPUT);
 pinMode (motorPin4, OUTPUT);
 digitalWrite(6, HIGH); //Attiva relè alimentazione motore
}
void loop ()
{


// -------------------- Lettura fotodiodi e fotoreistenza -------------------
 fot1 = analogRead(A0); fot1=fot1/1024*5;
 fot2 = analogRead(A1); fot2=fot2/1024*5;
 fr1 = analogRead(A2); fr1=fr1/1024*5;
 Serial.print(fot1); Serial.print(", "); Serial.print(fot2);
 Serial.print(", "); Serial.print(fr1); Serial.print(", "); Serial.println(stepCount);
 Serial.print("I= "); Serial.println(i);

// -------------------- Lettura relè reed di fine corsa ---------------------
 SW1 = digitalRead(2); if(SW1==0){label1=1;i=0;} //Attiva semaforo rosso
 SW2 = digitalRead(3); if(SW2==0){label1=0;stepCount = 0;} //Disattiva semaforo rosso
 
 if (SW1==1 && label1==0)
 {
 Orario ();
 stepCount++;
 }
if (SW2==1 && label1==1)
 {
 digitalWrite (4, HIGH);
 antiorario ();
 stepCount--;
 myArray[i]= fr1; // Array valori fotoresistenza
 i++;
 if(i>=103)
 {
 digitalWrite (4, LOW);
 ricerca_Max_Lux ();
 }
 }
}
void ricerca_Max_Lux()
{

 For (i=0; i<=103; i=i+1)
 {
 If (myArray[i]>massimo)
 {
 massimo=myArray[i]; NumeroStep = i;
 }
 }
 Serial.print("Massimo = "); Serial.println(massimo); Serial.println(NumeroStep);

 // ---------------- Posizionamento stepper verso valore massimo -----------
 For (i=0; i<=103-NumeroStep; i=i+1)
 {
 Orario ();
 }
 // ------------------ Inseguimento ----------------------------------------
 digitalWrite(5, HIGH); delay (5000); i=0; digitalWrite(5,LOW);

 do {
 fot1 = analogRead(A0); fot1=fot1/1024*5;
 fot2 = analogRead(A1); fot2=fot2/1024*5;
 Deltaf = abs(fot1-fot2);
 Serial.print("fot1= "); Serial.print(fot1); Serial.print(" fot2= ");Serial.println(fot2);
 Serial.print("Deltaf = "); Serial.println(Deltaf);


 if(fot1>fot2 && Deltaf>=0.03)
 {
 digitalWrite (5, HIGH);
 antiorario ();
 digitalWrite (5, LOW);
 }
 if(fot1<fot2 && Deltaf>=0.03)
 {
 digitalWrite (5, HIGH);
 orario ();
 digitalWrite (5, LOW);
 }
 SW1 = digitalRead(2);
 SW2 = digitalRead(3);
 if (SW2 == 0) //
 {
 // Va alla posizione di start, spegne il motore pp.
 // e quando sorge il sole riparte.


 For (int x=90; x>=0; x=x-1) // Se ritorna esattamente alla posizione di start (117) esegue due volte il
 // ciclo di avvio perché SW1 rimane attivato. Facendolo fermare un po’ prima
esegue il reset
 // correttamente.
 {

 digitalWrite (5, LOW);
 digitalWrite (4, LOW);
 delay( 50);
 orario ();
 Serial.println(x);
 digitalWrite (5, HIGH);
 digitalWrite (4, HIGH);
 delay (50);
 }
 delay (5000);
 do {
 digitalWrite (5, LOW);
 digitalWrite (4, LOW);
 delay (990);
 fr1 = analogRead(A2); fr1=fr1/1024*5;
 digitalWrite (5, HIGH);
 digitalWrite (4, HIGH);
 delay (10);
 Serial.println(fr1);
 digitalWrite (6, LOW); //Disattiva relè alimentazione motore
 }while(fr1<2); //Rimane in loop finché il sole non sorge

 Reset_AVR (); //Resetta il microcontrollore
 }

 delay (1000);
 } while(i==0);
}
void orario ()
{
 digitalWrite (motorPin1, HIGH);
 digitalWrite (motorPin2, LOW);
 digitalWrite (motorPin3, LOW);
 digitalWrite (motorPin4, LOW);
 delay(motor_Speed);
 digitalWrite (motorPin1, LOW);
 digitalWrite (motorPin2, HIGH);
 digitalWrite (motorPin3, LOW);
 digitalWrite (motorPin4, LOW);
 delay (motor_Speed);
 digitalWrite (motorPin1, LOW);
 digitalWrite (motorPin2, LOW);
 digitalWrite (motorPin3, HIGH);
 digitalWrite (motorPin4, LOW);
 delay (motor_Speed);
 digitalWrite (motorPin1, LOW);
 digitalWrite (motorPin2, LOW);
  digitalWrite (motorPin3, LOW);
 digitalWrite (motorPin4, HIGH);
 delay (motor_Speed);
}
void antiorario ()
{
 digitalWrite (motorPin4, HIGH);
 digitalWrite (motorPin3, LOW);
 digitalWrite (motorPin2, LOW);
 digitalWrite (motorPin1, LOW);
 delay (motor_Speed);
 digitalWrite (motorPin4, LOW);
 digitalWrite (motorPin3, HIGH);
 digitalWrite (motorPin2, LOW);
 digitalWrite (motorPin1, LOW);
 delay (motor_Speed);
 digitalWrite (motorPin4, LOW);
 digitalWrite (motorPin3, LOW);
 digitalWrite (motorPin2, HIGH);
 digitalWrite (motorPin1, LOW);
 delay (motor_Speed);
 digitalWrite (motorPin4, LOW);
 digitalWrite (motorPin3, LOW);
 digitalWrite (motorPin2, LOW);
 digitalWrite (motorPin1, HIGH);
 delay (motor_Speed);

}

 
 