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
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.