Qui lo sketch completo......
//variabili per loop ULTRASUONO
const byte Echo(30);
const byte Trig(31);
int Tempo=0;
int Distanza=0;
int Cm=0;
byte MediaCm=0;
byte Direzione=0;
//variabili per loop RILEVA_DISTANZE
#include <Stepper.h>
const int Giro=200;
Stepper myStepper(Giro,41, 43, 45, 47);
unsigned long tempoMot=0;
boolean MuoviStepper=0;
boolean VerificaInCorso=1;
boolean ControlloDistanza=1;
byte Posizione=0;
byte RicordaPosizione=0;
byte VerificaDistanza[7]={};
byte PuntaDistanza=0;
//variabili per loop MEMORIZZA_DISTANZE
boolean RichiediVerifica=0;
boolean MemorizzaDistanze=0;
byte MemoriaDistanza_1[7]={};
byte MemoriaDistanza_2[7]={};
byte MemoriaDistanza_3[7]={};
byte PuntaMemoria_1=0;
byte PuntaMemoria_2=0;
byte PuntaMemoria_3=0;
byte ConfrontoMemoria=0;
//variabili per loop MEDIA_DISTANZE()
byte MediaMemorieDistanze[7]={};
byte PuntaMediaMemorie=0;
byte PosizionaPuntatori=0;
int MediaMemorie=0;
boolean MediaDistanze=0;
void setup()
{
Serial.begin(9600);//velocita Serial Monitor
pinMode(Echo,INPUT);//ULTRASUONO
pinMode(Trig,OUTPUT);//ULTRASUONO
myStepper.setSpeed(150);//PASSOPASSO
}
void ULTRASUONO()
{
digitalWrite(Trig,LOW);
delayMicroseconds(2);//aspetta(ma non ho capito bene per quale motivo)
digitalWrite(Trig,HIGH);
delayMicroseconds(10);//aspetta(ma non ho capito bene per quale motivo)
digitalWrite(Trig,LOW);
Tempo=pulseIn(Echo,HIGH);//tempo uguale a pulseIn
Cm=Tempo*0.0165725;//verifica la distanza in millimetri stando attento alla temperatura
Distanza=Distanza+Cm;
MediaCm++;
if(MediaCm>10)
{
Distanza=Distanza/10;
VerificaDistanza[PuntaDistanza]=Distanza;
Distanza=0;
MediaCm=0;
}
}
void MEMORIZZA_DISTANZE()
{
if(VerificaInCorso==1)
{
if(ConfrontoMemoria==0)
{
if(PuntaDistanza==0)
{
Serial.println("");
Serial.println("");
Serial.print("ConfrontoMemoria ");
Serial.print(ConfrontoMemoria);
Serial.print(" ");
Serial.print(VerificaDistanza[PuntaDistanza]);
Serial.print(" ");
}
if(PuntaDistanza!=0)
{
Serial.print(VerificaDistanza[PuntaDistanza]);
Serial.print(" ");
}
}
if(ConfrontoMemoria==1)
{
PuntaMemoria_1=PuntaDistanza;
MemoriaDistanza_1[PuntaMemoria_1]=VerificaDistanza[PuntaDistanza];
if(PuntaMemoria_1==0)
{
Serial.println("");
Serial.println("");
Serial.print("ConfrontoMemoria ");
Serial.print(ConfrontoMemoria);
Serial.print(" ");
Serial.print(MemoriaDistanza_1[PuntaMemoria_1]);
Serial.print(" ");
}
if(PuntaMemoria_1!=0)
{
Serial.print(MemoriaDistanza_1[PuntaMemoria_1]);
Serial.print(" ");
}
}
if(ConfrontoMemoria==2)
{
PuntaMemoria_2=PuntaDistanza;
MemoriaDistanza_2[PuntaMemoria_2]=VerificaDistanza[PuntaDistanza];
if(PuntaMemoria_2==0)
{
Serial.println("");
Serial.println("");
Serial.print("ConfrontoMemoria ");
Serial.print(ConfrontoMemoria);
Serial.print(" ");
Serial.print(MemoriaDistanza_2[PuntaMemoria_2]);
Serial.print(" ");
}
if(PuntaMemoria_2!=0)
{
Serial.print(MemoriaDistanza_2[PuntaMemoria_2]);
Serial.print(" ");
}
}
if(ConfrontoMemoria==3)
{
PuntaMemoria_3=PuntaDistanza;
MemoriaDistanza_3[PuntaMemoria_3]=VerificaDistanza[PuntaDistanza];
if(PuntaMemoria_3==0)
{
Serial.println("");
Serial.println("");
Serial.print("ConfrontoMemoria ");
Serial.print(ConfrontoMemoria);
Serial.print(" ");
Serial.print(MemoriaDistanza_3[PuntaMemoria_3]);
Serial.print(" ");
}
if(PuntaMemoria_3!=0)
{
Serial.print(MemoriaDistanza_3[PuntaMemoria_3]);
Serial.print(" ");
}
}
}
}
void RILEVA_DISTANZE()
{
PuntaDistanza=Posizione;
if(VerificaInCorso==1)
{
if(Posizione>6)//SE la posizione in cui mettersi supera la dimensione dell'array
{
Posizione=0;//riporta la posizione al punto di partenza
ConfrontoMemoria++;
}
if(ConfrontoMemoria>3)
{
VerificaInCorso=0;
ConfrontoMemoria=0;
ControlloDistanza==0;//...................
MediaDistanze=1;
}
if(MuoviStepper==1)//SE pronto al movimento
{
if(Posizione==0){myStepper.step(0);}// SE=0 resta Fermo Avanti
if(Posizione==1){myStepper.step(150);}// SE=1 sposta Destra 1\2
if(Posizione==2){myStepper.step(150);}//SE=2 sposta Destra 1
if(Posizione==3){myStepper.step(-300);}//SE=3 torna Avanti venendo da Destra(aggiustato passo per meccanica sgranata)
if(Posizione==4){myStepper.step(-150);}// SE=4 sposta Sinistra 1\2
if(Posizione==5){myStepper.step(-150);}//SE=5 sposta Sinistra 1
if(Posizione==6){myStepper.step(300);}//SE=6 torna Avanti venendo da Sinistra(aggiustato passo per meccanica sgranata)
MuoviStepper=0;//attiva il movimento(dopo la lettura)
}
if(MuoviStepper==0)
{
if(millis()-tempoMot>=200)
{
ULTRASUONO();
if(millis()-tempoMot>=800)
{
MEMORIZZA_DISTANZE();
Posizione++;
MuoviStepper=1;
tempoMot=millis();//azzera il cronometro
}
}
}
}
}
void MEDIA_DISTANZE()
{
if(MediaDistanze==1)
{
PuntaMemoria_1=PosizionaPuntatori;
PuntaMemoria_2=PosizionaPuntatori;
PuntaMemoria_2=PosizionaPuntatori;
PuntaMediaMemorie=PosizionaPuntatori;
MediaMemorie=MediaMemorie+MemoriaDistanza_1[PuntaMemoria_1];
MediaMemorie=MediaMemorie+MemoriaDistanza_2[PuntaMemoria_2];
MediaMemorie=MediaMemorie+MemoriaDistanza_3[PuntaMemoria_3];
MediaMemorieDistanze[PuntaMediaMemorie]=MediaMemorie/3;
if(PosizionaPuntatori==0)
{
Serial.println("");
Serial.println("");
Serial.print("MediaMemorie ");
Serial.print(MediaMemorieDistanze[PuntaMediaMemorie]);
Serial.print(" ");
}
if(PosizionaPuntatori!=0)
{
Serial.print(MediaMemorieDistanze[PuntaMediaMemorie]);
Serial.print(" ");
}
PosizionaPuntatori++;
if(PosizionaPuntatori>6)
{
PosizionaPuntatori=0;
MediaDistanze=0;
}
}
}
void loop()
{
if(ControlloDistanza==1){RichiediVerifica=1;}
if(RichiediVerifica==1){RILEVA_DISTANZE();}
MEDIA_DISTANZE();
}
In pratica il motorino sù cui è incastrato UltraSuono và in posizione,il sensore legge e memorizza.
Il tutto per 3 volte e fin qui tutto OK anche se le letture non sono il massimo della precisione.
Il problema sta qui
void MEDIA_DISTANZE()
{
if(MediaDistanze==1)
{
PuntaMemoria_1=PosizionaPuntatori;
PuntaMemoria_2=PosizionaPuntatori;
PuntaMemoria_2=PosizionaPuntatori;
PuntaMediaMemorie=PosizionaPuntatori;
MediaMemorie=MediaMemorie+MemoriaDistanza_1[PuntaMemoria_1];
MediaMemorie=MediaMemorie+MemoriaDistanza_2[PuntaMemoria_2];
MediaMemorie=MediaMemorie+MemoriaDistanza_3[PuntaMemoria_3];
MediaMemorieDistanze[PuntaMediaMemorie]=MediaMemorie/3;
if(PosizionaPuntatori==0)
{
Serial.println("");
Serial.println("");
Serial.print("MediaMemorie ");
Serial.print(MediaMemorieDistanze[PuntaMediaMemorie]);
Serial.print(" ");
}
if(PosizionaPuntatori!=0)
{
Serial.print(MediaMemorieDistanze[PuntaMediaMemorie]);
Serial.print(" ");
}
PosizionaPuntatori++;
if(PosizionaPuntatori>6)
{
PosizionaPuntatori=0;
MediaDistanze=0;
}
}
}
in pretica escono dei valori completamente senza senso.