Problema con il sensore ultrasuoni.

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);
} }

XSparter ... non sei mica al tuo primo post ... e ancora usi il tag QUOTE per il codice ??? :astonished:

Correggi il post e modifica il tag in CODE (... in edit, il bottone #, terzultimo della seconda fila) !!! Grazie.

Guglielmo

Viene spiegato come fare in sezione 7 del regolamento.
Magari togli anche quei 3 o 4 kg di righe vuote che non servono ad una cippa :smiley:

Inoltre prima di copiare il codice usa la formattazione automatica dell'IDE (menù strumenti o CTRL + T) in modo da avere uno sketch ben identato così:

//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);
  } 
}

Potresti usare uno switch case al posto dei tanti IF --> http://arduino.cc/en/Reference/SwitchCase