Salve a tutti e buonasera a tutta la community, sto realizzando un progetto con arduino uno, un led e un sensore ad ultrasuoni. Ho realizzato il software con la funzione millis(), il led lampeggia una volta ogni 2 secondi e fin qui tutto ok, ma quando inserisco nel codice anche il controllo del sensore ogni 500ms, la scheda inizia a mandare segnali solo al sensore, mentre il led non lampeggia più. Lo scopo è di far lampeggiare il led più velocemente quando la distanza fra sensore e oggetto si appresti nel range 50cm / 400cm.
Grazie mille in anticipo a chi si farà carico del mio quesito <3
Emmm ... e il codice dov'è? Perché ... non possiamo certo immaginare quello che hai fatto ...
Guglielmo
Chiedo scusa, eccolo qui:
Come già accennato, il led non ha lampeggiato più non appena ho inserito lo script per la misurazione della distanza
int ledverticale = 13;
int trigsonic = 7;
int echosonic = 8;
int stateled;
int statesonic;
unsigned long currentmillis, previousmillis, intervalon, intervaloff, currentmicros, previousmicros, intervalmicros, intervalsonic, timesonic, distanza ;
void setup()
{
pinMode(ledverticale, OUTPUT);
pinMode(trigsonic, OUTPUT);
pinMode(echosonic, INPUT);
stateled = 0;
statesonic = 0;
currentmillis = 0;
previousmillis = 0;
intervalon = 2000;
intervaloff = 70;
intervalmicros = 12;
intervalsonic = 500;
currentmicros = 0;
previousmicros = 0;
timesonic = 0;
distanza = 0;
digitalWrite(trigsonic, HIGH);
delayMicroseconds(12);
digitalWrite(trigsonic, LOW);
Serial.begin(9600);
}
void loop()
{
currentmillis=millis();
currentmicros=micros();
if(currentmillis - previousmillis >= intervalon && stateled == 0)
{
previousmillis = currentmillis;
stateled = 1;
digitalWrite(ledverticale, stateled);
}
if(currentmillis - previousmillis >= intervaloff && stateled == 1)
{
previousmillis = currentmillis;
stateled = 0;
digitalWrite(ledverticale, stateled);
}
if(currentmillis - previousmillis >= intervalsonic && statesonic == 0) //controllo sonico
{
previousmillis = currentmillis;
statesonic = 1;
digitalWrite(trigsonic, statesonic);
}
if(currentmicros - previousmicros >= intervalmicros && statesonic == 1)
{
previousmicros = currentmicros;
statesonic = 0;
digitalWrite(trigsonic, statesonic);
timesonic = pulseIn(echosonic, HIGH);
distanza = 0.034 * timesonic / 2;
Serial.println(distanza);
}
}
...In cui vai ad alterare il valore della variabile 'previousmillis' usata per il lampeggio del LED.
Come ti ha detto Claudio_FF ciascun IF deve utilizzare uno specifico previousmillis per ciò che vuoi controllare quindi .... in questo caso te ne serviranno due, uno specifico per il controllo sensore ed uno specifico per il lampeggio del LED.
Poi ... perché tutte quelle complicazioni per accendere e spegnere? Ti basta la variabile specifica (es. stateled oppure statesonic, dichiarate byte per non sprecare spazio inutile) e semplicemente invertirne il valore rispetto al valore precedente (senza dove andare a vedeere se era HIGH e portarla a LOW e viceversa) ... esempio:
...
byte miaVariabile = 0; // dichiaro la variabile che voglio usare di tipo byte e la inizializzo a LOW
...
...
// nell'IF per invertirne il valore, basta fare ...
miaVariabile = !miaVariabile; // se mia variabile è LOW diventa HIGH e viceversa
digitalWrite(mioPin, miaVariabile);
...
...
Guglielmo
Concordo al 100%
Anzi io per far lampeggiare un led, nemmeno la "spreco" una variabile: leggo e inverto direttamente lo stato del pin.
digitalWrite(mioPin, !digitalRead(mioPin));
Anziché usare il nome previousmillis, che per differenziare le variabili diverrebbe previousmillis_1, previousmillis_2, ecc., usa nomi più esplicativi, per esempio t_lamp_led e t_ultrasuoni. Se usi sempre il prefisso t_ riconosci subito le variabili uint32 usate per le temporizzazioni e dopo solo due caratteri fissi puoi mettere il dettaglio della funzione della variabile.
Ringrazio tutti ragazzi, come sempre utilissimi e gentilissimi, sto usando diverse variabili per il conteggio del tempo e sembra funzionare tutto alla perfezione
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.