Salve, un paio di settimane fa mi ero cimentato con la creazione di un piccolo sistema domotico capace di accendere la mia postazione tramite smartphone oppure tramite sensore ad ultrasuoni.
Funzionava tutto tranne qualche piccolo intoppo con la misurazione delle distanze col sensore ad ultrasuoni, che ieri sera Ho deciso di correggere facendo effettuare ad arduino una media su 5 valori ottenuti ed aggiornati durante tutto il periodo di durata della conta (ho impostato il timer di 20 secondi per il debug ma normalmente era una scansione ogni 10 minuti circa). Il problema è stato "risolto" se non fosse per il fatto che ora sia con la prima versione del software che con la seconda nel momento in cui si azzera il timer e la "soglia" entro la quale il relè deve essere chiuso viene superata il valore misurato diventa "0" e di conseguenza Arduino chiude nuovamente il relè.
EDIT: ho scritto tutto il codice perché non ho idea di dove sia il problema, l'elettronica è montata bene...
ecco il codice
//HC RS04 Sensore ultrasuoni
#include <avr/wdt.h>
int triggerPort = 13;
int echoPort = 12;
long cont = 0;
int SerVv = 0;
int base = 0;
int ad = 0;
int ad1 = 0;
void setup() {
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(2,OUTPUT);
wdt_enable(WDTO_2S);
pinMode( triggerPort, OUTPUT );
pinMode( echoPort, INPUT );
Serial.begin( 9600 );
Serial.println( "Sensore ultrasuoni: ");
pinMode(5, OUTPUT);
SerVv = 'a';
}
void loop() {
int SerV = Serial.read();
if (SerV == 'L') {
digitalWrite(2, HIGH);
} else if (SerV == 'V') { digitalWrite(2, LOW); }
if (SerV == 'a') {
SerVv = 'a'; }
if (SerV == 'b') {
SerVv = 'b'; }
if (SerV == 'c') {
SerVv = 'c'; }
if (SerV == 'd') {
SerVv = 'd'; }
if (SerVv == 'a') {
base = 70;
ad = 0;
//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
wdt_reset();
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );
long duration = pulseIn( echoPort, HIGH );
wdt_reset();
long r = 0.034 * duration / 2;
long v1 = r;
if (cont == 0 & v1 < base) {
cont = (cont + 180 );
wdt_reset();
digitalWrite(5, HIGH); }
else if (cont > 0) {
wdt_reset();
cont = (cont - 1);
digitalWrite(11 , HIGH);
delay(300);
digitalWrite(11 , LOW);}
if (v1 < base) {
digitalWrite(10,HIGH);
digitalWrite(9, LOW); }
else {
digitalWrite(10,LOW);
digitalWrite(9,HIGH);
}
wdt_reset();
if (cont == 0 & v1 > base) {
digitalWrite(5, LOW);}
else {
digitalWrite(5, HIGH);}
wdt_reset();
//duration = pulseIn( echoPort, HIGH );
//r = 0.034 * duration / 2;
//int v2 = r;
//duration = pulseIn( echoPort, HIGH );
long ValMed = v1;//(v1+v2 / 2);
Serial.print("distanza");
Serial.print( ValMed );
Serial.print( "cm ");
Serial.print ( "tempo " );
Serial.print(cont);
Serial.println("s");
delay(1000);
wdt_reset();
}
else if (SerVv == 'b') {
int a = 1+1;
}
else if (SerVv == 'c'){
digitalWrite(5, HIGH); //appiccia il relè
wdt_reset();
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,LOW);
ad = ad + 1;
}
if (ad==1) {
Serial.println("|___________________________________|");
Serial.println("|-----------TIMER SPENTO------------|");
cont = 0;
Serial.println("|---SENSORI E VARIABILI RESETTATE---|");
Serial.println("|-----IN ATTESA DI ISTRUZIONI-------|");
Serial.println("|___________________________________|");
wdt_reset();
ad = 4; }
else if (SerVv == 'd') {
digitalWrite(5, LOW);
ad1 = ad1 + 2;
wdt_reset();
if (ad1==2) {
Serial.println("|___________________________________|");
Serial.println("|-----------TIMER SPENTO------------|");
cont = 0;
Serial.println("|---SENSORI E VARIABILI RESETTATE---|");
Serial.println("|----------ARRESTO FORZATO----------|");
Serial.println("|-Eseguire un reset del controllore-|");
Serial.println("|---o inviare il valore ''a'' per---|");
Serial.println("|-avviare il controllo automatico-|");
Serial.println("|-----oppure ''b'' per riavviare----|");
Serial.println("|-----oppure ''c'' per accendere----|");
Serial.println("|-----IN ATTESA DI ISTRUZIONI-------|");
Serial.println("|___________________________________|");
ad1 = 5; }
wdt_reset();
wdt_reset();
digitalWrite(11,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
} }