ciao
vi sottopongo il risultato della applicazione di prova, per il controllo della semina in pieno campo, per una seminatrice con 6 elementi, i risultati sono incoraggianti
stefano
/*
stato operativo
versione con interrupt per due elementi
*/
//#include <LiquidCrystal.h> // include the library code
//LiquidCrystal lcd(9,8,7,6,5,4); // initialize the library with the numbers of the interface pins
int statosensore1=HIGH; //stato iniziale del sensore
int statosensore2=HIGH; //stato iniziale del sensore
int i,j,k,x;
float Fmin,Fmax;
float freq[2]={0,0};//per la frequenza degli eventi di interrupt
int count[2]={0,0};//conteggio degli eventi per il calcolo del tempo
unsigned long tempo[2][10]={{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0}};//memorizza l'istante di tempo in cui accade l'evento
unsigned long deltatempo1;//tempo di attesa in mancanza di eventi
unsigned long deltatempo2;//tempo di attesa in mancanza di eventi
//shiftout
int latchPinOUT = 7;//ST_CP di 74HC595 pin 12
int clockPinOUT =6;//SH_CP di 74HC595 pin 11
int dataPinOUT = 5;//DS di 74HC595 pin 14
byte ledRossiH = B00000000; //matrice 3x2 di led
byte ledVerdi = B00000000; //matrice 3x2 di led
byte ledRossiL = B00000000; //matrice 3x2 di led
void setup()
{
delay(5000);
//lcd.begin(16,4); // set up the LCD's number of columns and rows:
i=0;
j=0;
k=0;
Fmin=3.0;
Fmax=10.0;
attachInterrupt(0,sensore1,FALLING); //sensore collegato al pin 2
attachInterrupt(1,sensore2,FALLING); //sensore collegato al pin 3
pinMode(2,INPUT);
pinMode(3,INPUT);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
//--------------------------shiftout
pinMode(latchPinOUT, OUTPUT);
pinMode(clockPinOUT, OUTPUT);
pinMode(dataPinOUT, OUTPUT);
// Serial.begin(9600); //per debug
}
void loop()
{
//------------------------sensore 1
if (statosensore1==LOW)
{
count[0]++; //incremento del contatore
// Serial.println(count[0]); //per debug
tempo[0][i]=millis(); //memorizzazione dell'istante di tempo
i++; //incremento del contatore
// Serial.println(tempo[0]); //per debug
// Serial.println(tempo[9]); //per debug
if(i==10)
{
freq[0]=(count[0]-1)*1000/(tempo[0][9]-tempo[0][0]);//calcolo della frequenza
i=0;
count[0]=0;
// Serial.println(freq[0]); //per debug
}
statosensore1=HIGH;
}
//---------------------------sensore 2
if (statosensore2==LOW)
{
count[1]++; //incremento del contatore
tempo[1][j]=millis(); j++; //memorizzazione dell'istante di tempo
if(j==10)
{
freq[1]=(count[1]-1)*1000/(tempo[1][9]-tempo[1][0]); //calcolo della frequenza
j=0; //azzeramento del contatore
count[1]=0; //azzeramento del contatore
// Serial.println(freq[1]); //per debug
}
statosensore2=HIGH;
}
deltatempo1=millis()-tempo[0][9];
//Serial.println(deltatempo1);
deltatempo2=millis()-tempo[1][9];
if (deltatempo1>2000)
{
freq[0]=0; //azzeramento della frequenza dopo attesa di 2 sec
}
if (deltatempo2>2000)
{
freq[1]=0; //azzeramento della frequenza dopo attesa di 2 sec
}
for(k=0;k<=1;k++)
{
// Serial.println("freq[0] ");
// Serial.println(freq[0]);
// Serial.println("freq[1] ");
// Serial.println(freq[1]);
if(freq[k]>Fmin && freq[k]<Fmax) //frequenza normale di lavoro
{
bitWrite(ledRossiH,k,0);// 00000000
bitWrite(ledVerdi,k,1);// 01000000 accensione del led centrale
bitWrite(ledRossiL,k,0);// 00000000
// Serial.println(freq[0]);
//Serial.println(bitRead(ledVerdi,k));
}
if(freq[k]<=Fmin) //frequenza bassa di lavoro
{
// Serial.println(pulseIn(k+2,LOW));
bitWrite(ledRossiH,k,0);
bitWrite(ledVerdi,k,0);
bitWrite(ledRossiL,k,1);// accensione del led inferiore
}
if(freq[k]>=Fmax) //frequenza alta di lavoro
{
bitWrite(ledRossiH,k,1);// accensione del led superiore
bitWrite(ledVerdi,k,0);
bitWrite(ledRossiL,k,0);
}
digitalWrite(latchPinOUT,1); //Pull latch LOW to start sending data
shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, ledRossiH); //Send the data byte rossi
shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, ledVerdi); //Send the data byte verdi
shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, ledRossiL); //Send the data byte rossi
digitalWrite(latchPinOUT,0); //Pull latch HIGH to stop sending data
}
}
void sensore1() //pin 2 a cui attaccare il fotosensore
{
statosensore1=LOW;
}
void sensore2() //pin 3 a cui attaccare il fotosensore
{
statosensore2=LOW;
}
fotosem.zip (2.58 MB)