Sensori di parcheggio con Arduino, problema LED

Ciao a tutti,
ho un problema (strano) con l’utilizzo del sensore ad ultrasuoni HC-SR04. Attraverso l’uso di questo trasduttore, volevo far accendere 6 LED (2 rossi, 2 arancioni e 2 verdi), in base alla distanza con cui si trovi un oggetto. L’idea è quella di usare un sensore PIR, che attraverso un comando di interrupt, “svegli” Arduino, in modo da ridurre lo spreco di energia. Il problema che incontro è che si accendono 5 LED in ogni posizione che mi trovo, come mai ? Il primo progetto utilizza i cicli FOR per risparmiare codice, ma ho riscritto tutti per capire come devono essere i LED in ogni situazione. Ecco il codice:

/* Programma che fa accedere un LED rosso, quando c'è un oggetto ad una certa distanza
 HC-SR04 sensore di distanza
 VCC al arduino 5v 
 GND al arduino GND
 Echo al Arduino pin 7 
 Trig al Arduino pin 8
 */



#define echoPin 6 // Echo Pin
#define trigPin 7 // Trigger Pin
int Verde1 = 13;
int Verde2 = 12;
int Arancione1 = 11;
int Arancione2 = 10;
int Rosso1 = 9;
int Rosso2 = 8;

int maximumRange = 200; // Maximum range 
int minimumRange = 10; // Minimum range 
long duration, distance; 
int LED[6] = {13,12,11,10,9,8};

int i = 0;

void setup() {
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 // Vengono inizializzati i LED

   pinMode(Verde1,OUTPUT);
   pinMode(Verde2,OUTPUT);
   pinMode(Arancione1,OUTPUT);
   pinMode(Arancione2,OUTPUT);
   pinMode(Rosso1,OUTPUT);
   pinMode(Rosso2,OUTPUT);
 
}

void loop() {
/* La seguente funzione permette di ricavare la distanza a cui si trova un oggetto, vicino al sensore */
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 

 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10); 
 
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 
/* Calcola la distanza in centimetri dall'oggetto*/
 distance = duration/58.2;
 
 if (distance >80 ){
   digitalWrite(Verde1,LOW);
   digitalWrite(Verde2,LOW);
   digitalWrite(Arancione1,LOW);
   digitalWrite(Arancione2,LOW);
   digitalWrite(Rosso1,LOW);
   digitalWrite(Rosso2,LOW);
   
   
 }
 
 if (60 <distance <=80 ){
   digitalWrite(Verde1,HIGH);
   digitalWrite(Verde2,LOW);
   digitalWrite(Arancione1,LOW);
   digitalWrite(Arancione2,LOW);
   digitalWrite(Rosso1,LOW);
   digitalWrite(Rosso2,LOW);
   
   
 }
 
 if (50 <distance <=60 ){
   
   digitalWrite(Verde1,HIGH);
   digitalWrite(Verde2,HIGH);
   digitalWrite(Arancione1,LOW);
   digitalWrite(Arancione2,LOW);
   digitalWrite(Rosso1,LOW);
   digitalWrite(Rosso2,LOW);
   
 }
 


 
 if (30 < distance <= 50 ){
   
   digitalWrite(Verde1,HIGH);
   digitalWrite(Verde2,HIGH);
   digitalWrite(Arancione1,HIGH);
   digitalWrite(Arancione2,LOW);
   digitalWrite(Rosso1,LOW);
   digitalWrite(Rosso2,LOW);
  
 }
 
 if (20 <distance <=30 ){
   
   digitalWrite(Verde1,HIGH);
   digitalWrite(Verde2,HIGH);
   digitalWrite(Arancione1,HIGH);
   digitalWrite(Arancione2,HIGH);
   digitalWrite(Rosso1,LOW);
   digitalWrite(Rosso2,LOW);
  
   
 }
 
 
 if (10 <distance <=20 ){
   
   digitalWrite(Verde1,HIGH);
   digitalWrite(Verde2,HIGH);
   digitalWrite(Arancione1,HIGH);
   digitalWrite(Arancione2,HIGH);
   digitalWrite(Rosso1,HIGH);
   digitalWrite(Rosso2,LOW);
   
   
 }
 
 
 if (distance <=10 ){
   
   digitalWrite(Verde1,HIGH);
   digitalWrite(Verde2,HIGH);
   digitalWrite(Arancione1,HIGH);
   digitalWrite(Arancione2,HIGH);
   digitalWrite(Rosso1,HIGH);
   digitalWrite(Rosso2,HIGH);
   
   
  
   
 }

 
 /* Viene mostrata la distanza nel seriale */
 Serial.println(distance);
 

 
 
 
 
 

 delay(500);
}

Usa il costrutto if-else e metti degli and per le condizioni .Ad esempio (60<distance<=80) diventa (60<distance && distance<=80)

Ho risolto il problema con l’uso degli && logici. Vorrei implementare la possibilità di “addormentare” Arduino, fino a quando il sensore PIR non rilevi un movimento. Ho modificato il codice, ma tuttavia Arduino non si accende, come mai ?

/* Programma che fa accedere un LED rosso, quando c'è un oggetto ad una certa distanza, con il comando di INTERRUPUITTHC-SR04 sensore di distanza
 VCC al arduino 5v 
 GND al arduino GND
 Echo al Arduino pin 7 
 Trig al Arduino pin 8
 */
#include "LowPower.h"


#define echoPin 6 // Echo Pin
#define trigPin 7 // Trigger Pin
int Verde1 = 13;
int Verde2 = 12;
int Arancione1 = 11;
int Arancione2 = 10;
int Rosso1 = 9;
int Rosso2 = 8;
const int pir = 5; //Il pin a cui è connesso il sensore PIR


long duration, distance; 
int LED[6] = {13,12,11,10,9,8};

int i = 0;

void wakeUp()
{
    pinMode(pir, INPUT);
}


void setup() {
  // Configure wake up pin as input.
    // This will consumes few uA of current.
    pinMode(pir, INPUT);   
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 // Vengono inizializzati i LED

   pinMode(Verde1,OUTPUT);
   pinMode(Verde2,OUTPUT);
   pinMode(Arancione1,OUTPUT);
   pinMode(Arancione2,OUTPUT);
   pinMode(Rosso1,OUTPUT);
   pinMode(Rosso2,OUTPUT);
 
}

void loop() {

  // Allow wake up pin to trigger interrupt on low.
    attachInterrupt(5, wakeUp, HIGH);
    
    // Enter power down state with ADC and BOD module disabled.
    // Wake up when wake up pin is low.
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
    
    // Disable external pin interrupt on wake up pin.
    detachInterrupt(5); 
  
  /* La seguente funzione permette di ricavare la distanza a cui si trova un oggetto, vicino al sensore */
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 

 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10); 
 
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 
/* Calcola la distanza in centimetri dall'oggetto*/
 distance = duration/58.2;
 
 if (distance >80 ){
   for(int i = 0; i<=5; i++){
     digitalWrite(LED[i], LOW);
   }
}
 
 if (60 <distance && distance<=80 ){
   digitalWrite(Verde1,HIGH);
  for(int i = 1; i<=5; i++){
     digitalWrite(LED[i], LOW);
   }
}
 
if (50 <distance && distance<=60 ){
   
   digitalWrite(Verde1,HIGH);
   digitalWrite(Verde2,HIGH);
   for(int i = 2; i<=5; i++){
     digitalWrite(LED[i], LOW);
   }
}
 
if (30 < distance && distance<= 50 ){
   
   for(int i = 0; i<3; i++){
     digitalWrite(LED[i], HIGH);
   }
   for(int i = 3; i<=5; i++){
     digitalWrite(LED[i], LOW);
   }
}
 
if (20 <distance && distance<=30 ){
   
   for(int i = 0; i<=3; i++){
     digitalWrite(LED[i], HIGH);
   }
   digitalWrite(Rosso1,LOW);
   digitalWrite(Rosso2,LOW);
}
 
if (10 <distance && distance<=20 ){
   
   for(int i = 0; i<=4; i++){
     digitalWrite(LED[i], HIGH);
   }
   digitalWrite(Rosso2,LOW);
}
 
 if (distance <=10 ){
   for(int i = 0; i<=5; i++){
     digitalWrite(LED[i], HIGH);
   }
 }

 
 /* Viene mostrata la distanza nel seriale */
 Serial.println(distance);
 delay(500);
}

Se stai usando un Arduino UNO, hai sbagliato a chiamare attachInterrupt perché gli interrupt esterni ammessi sono solo lo 0 e l'1. Il primo è agganciato al pin D2, il secondo al pin D3.

leo72: Se stai usando un Arduino UNO, hai sbagliato a chiamare attachInterrupt perché gli interrupt esterni ammessi sono solo lo 0 e l'1. Il primo è agganciato al pin D2, il secondo al pin D3.

Si sto utilizzando Arduino Uno. Vorrei che Arduino si svegliasse, quando il sensore PIR li invio un segnale HIGH. Come posso fare allora ? Devo collegare il sensore direttamente all'uscita digitale 3 ? Cosa scrivo nel codice ?