Più sonar e RGB

Buongiorno, espongo il mio problema:
sto cercando di programmare uno sketch che si compone di 4 ricettori ad ultrasuoni (HC-SR04). Ogni ricettore "comanda" un led rgb: a determinate distanze percepite, corrisponde un preciso colore del led. Per esempio: entro i 20 cm, il led è rosso. Da 20 a 40, è verde, e così via.
Con un solo sonar ed un solo rgb, tutto funziona perfettamente.
Appena aggiungo un altro sonar, le distanze (lette dal monitor seriale) vengono lette abbastanza bene, ma i comandi agli rgb sono totalmente alterati, ed inoltre spesso uno dei due risulta spento. Qualcuno ha idea del perchè?
grazie mille!

Riesci a postare il codice?

Certo eccolo qui!

int portarossa = 1; // porta 11 da collegare all’anodo “rosso” del modulo RGB
int portaverde = 2; // porta 10 da collegare all’anodo “verde” del modulo RGB
int portablu = 3; // porta 9 da collegare all’anodo “blu” del modulo RBG
int portarossa2 = 4; // porta 11 da collegare all’anodo “rosso” del modulo RGB
int portaverde2 = 5; // porta 10 da collegare all’anodo “verde” del modulo RGB
int portablu2 = 6; 
/**********************routine di accensione del led - lighting leds routine ***************** 
nelle prossime righe viene definita la routine “colore” che, al momento del lancio, e’ 
accompagnata da tre variabili (rosso, verde e blu) che contengono i valori dell’intensita’ 
luminosa, di volta in volta voluta, per ogni singolo led (0 = minima e 255 = massima) - in the next
lines there is the "colore” routine that, at launch, is accompanied by three variables (rosso, verde 
and blu) that contains the desired intensity light values for each individual LED (0 = minimum and 
255 = maximum)
*/ 
#define TRIG_PIN 24
#define ECO_PIN 22
#define TRIG_PIN2 28
#define ECO_PIN2 26
void colore (unsigned char rosso, unsigned char verde, unsigned char blu)

{ 
 analogWrite(portarossa, rosso); // attiva il led rosso con l’intensita’ definita nella 
 // variabile rosso
 analogWrite(portablu, blu); //attiva il led blu con l’intensita’ definita nella
 // variabile blu
 analogWrite(portaverde, verde); //attiva il led verde con l’intensita’ definita nella
 // variabile verde
 }
 void colore2 (unsigned char rosso2, unsigned char verde2, unsigned char blu2){ 
 analogWrite(portarossa2, rosso2); // attiva il led rosso con l’intensita’ definita nella 
 // variabile rosso
 analogWrite(portablu2, blu2); //attiva il led blu con l’intensita’ definita nella
 // variabile blu
 analogWrite(portaverde2, verde2); //attiva il led verde con l’intensita’ definita nella
 // variabile verde
}
// 
void setup()// Arduino: led rgb: tanti colori, un solo led – one led, many colors
{ 
  Serial.begin(9600);
   pinMode(TRIG_PIN, OUTPUT);
   pinMode(ECO_PIN, INPUT);
      pinMode(TRIG_PIN2, OUTPUT);
   pinMode(ECO_PIN2, INPUT);
 pinMode(portarossa, OUTPUT); // dichiara la porta 11 come porta di output
 pinMode(portaverde, OUTPUT); // dichiara la porta 10 come porta di output 
 pinMode(portablu, OUTPUT); // dichiara la porta 9 come porta di output
  pinMode(portarossa2, OUTPUT); // dichiara la porta 11 come porta di output
 pinMode(portaverde2, OUTPUT); // dichiara la porta 10 come porta di output 
 pinMode(portablu2, OUTPUT); // dichiara la porta 9 come porta di output
digitalWrite(TRIG_PIN, LOW);
digitalWrite(TRIG_PIN2, LOW);
}
// 
void loop() 
{ 
  digitalWrite(TRIG_PIN, HIGH);

  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  unsigned long tempo = pulseIn (ECO_PIN,HIGH);
   
  float distanza =0.03436 *tempo/2;
 
  Serial.println("Distanza: " + String(distanza) +"cm");
   if(distanza<20)
   { (colore(255, 0, 0)); 
   Serial.print("rosso");}//ROSSO

  if(distanza>=20&&distanza<40)
 { (colore(255, 50, 0));
 Serial.print ("ARANCIO");}//arancio
   
      if(distanza>=40&&distanza<60)
   { (colore(0, 255, 0)); }//VERDE

      if(distanza>=60&&distanza<80)
   { (colore(0, 255, 255)); 
   Serial.print("azzurro");}//AZZURRO

     if(distanza>80)
   { (colore(0, 0, 128)); }//BLU
 if(distanza<20)
   { (colore(255, 0, 0)); }//ROSSO
  


  digitalWrite(TRIG_PIN2, HIGH);
  delayMicroseconds(10);

  digitalWrite(TRIG_PIN2, LOW);

   unsigned long tempo2 = pulseIn (ECO_PIN2,HIGH);

  float distanza2 =0.03436 *tempo2/2;

  Serial.print("Distanza2: " + String(distanza2) +"cm");


if(distanza2<20)
   { (colore2(255, 0, 0)); }//ROSSO
   
  if(distanza2>=20&&distanza2<40)
 { (colore2(255, 50, 0)); }//arancio
   
      if(distanza2>=40&&distanza2<60)
   { (colore2(0, 255, 0)); }//VERDE

      if(distanza2>=60&&distanza2<80)
   { (colore2(0, 255, 255)); }//AZZURRO

     if(distanza2>80)
   { (colore2(0, 0, 128)); }//BLU

  
  delay(500);
 /*// gestione colori (tra parentesi il valore da inserire nei tre parametri (rosso, verde e blu)
 colore(255, 0, 0); // lancia la routine colore, con il parametro rosso a 255, il verde a
 // 0 ed il blu a 0 (accende il rosso) - Red
 delay(800); // aspetta 2 secondi prima di accendere il successivo colore 
 colore(0,255, 0); // lancia la routine colore ed accende il verde - - green
 delay(800); // aspetta 2 secondi 
 colore(0, 0, 255); // accende il blu - blue
 delay(800); 
 colore(237,109,0); // accende l’arancione (237 di rosso e 109 di verde) - Orange
 delay(800); 
 colore(255,215,0); // accende il giallo (255 di rosso e 215 di verde) - Yellow
 delay(800); 
 colore(0,46,90); // accende l’indaco (46 di verde e 90 di blu) - Indigo
 delay(800);
 colore(128,0,128); // accende il viola (128 di rosso e 128 di blu) - violet
 delay(800); 
 //colore(0,0,0); // spegne tutto e ricomincia - shut off leds and restart
 //delay(2000); */
}

Sei su una mega?
Forse non centra col problema, ma il pin 1 è pwm?

Ciao, si sono su un Mega! Il pin 1 dovrebbe essere PWM :slight_smile:

0 e 1 sono i pin della seriale collegata all'usb. non credo siano pwm.

ps: non serve il pinMode prima di chiamare la analogWrite (vedi reference)

EDIT: hai ragione tu, pare che sia un pin pwm.

RIEDIT: però visto che usi la seriale magari fa casino. prova ad usarne un altro.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.