Ciao a tutti, ho scritto anche sulla pagina FB di Arduino ma chiedo anche qui, non si sa mai :-)
Sto scrivendo uno sketch per automatizzare la chiusura della tenda da
la luce de sole, quello che ho fatto fin'ora funziona ma... al reset o
istante, a volte va a zero altre va al massimo o "inf" e spesso manda a
Non capisco dove sbaglio, il sensore hall attiva l'interrupt che legge i millisecondi e fa la sottrazione trovando il periodo fra un interrupt e
fila tutto liscio.
Dove caspita sbaglio?
Ringrazio per l'eventuale aiuto.
int relechiusura = 13; // comando rele chiusura su pin 13 int releapertura = 12; // comando rele apertura su pin 12 int finecorsa = 11; // fine corsa tenda chiusa su pin 11 volatile int state = LOW; // set per interrupt unsigned long tempo_1 = 0; // tempo iniziale in mS float tempo = 0; // differenza fra tempo iniziale e tempo dell'interrupt
float frequenza = 0; // frequenza interrupt in Hz in base al tempo int valorepotsetvento = 0; // valore del potenziometro da 0 a 1023 unsigned long setvento = 0; // variabile dove memorizza il valore del set del vento int potsetvento = A0; // ingresso del potenziometro int termoresistenza = A1; // ingresso termoresistenza int lucesole = 0; //imposta valore iniziale lucesole int setluce = 0; // imposta valore iniziale setluce int potsetluce = A2; // ingresso potenziometro set luce
void setup() { pinMode (relechiusura, OUTPUT); pinMode (releapertura, OUTPUT); pinMode (finecorsa, INPUT_PULLUP); digitalWrite(relechiusura, LOW); //mette l'uscita bassa digitalWrite(releapertura, LOW); //mette l'uscita bassa attachInterrupt(0, periodo, FALLING); //intervento interrupt su pin 2 attiva "periodo" su lettura del segnale a massa
}void periodo() //ciclo interrupt { unsigned long tempo_2 = millis(); //assegna a tempo_2 il valore attuale in millisecondi
tempo = (tempo_2 - tempo_1); //tempo trascorso in mS fra i due interrupt che corrisponde a mezzo giro o 0,5m/S frequenza = ((1/tempo)*1000); //frequenza interrupt 4 interrupt corrispondono a 1 m/S
tempo_1 = tempo_2; //mette il tempo iniziale uguale al tempo finale per prepararlo alla prossima sottrazione }
void loop() {
finecorsa = digitalRead(11); //legge finecorsa
{ digitalWrite(relechiusura, LOW); //disattiva relechiusura setvento = 1000; //mette setvento a 1000 per bloccare il rele di chiusura } else { valorepotsetvento = analogRead(potsetvento); //legge il valore del potenziometro setvento=((valorepotsetvento/0.64)*0.036); //calcola il set del vento in km/h
superiore al set
digitalWrite (relechiusura, HIGH); //attiva il rele di chiusura } }