Doppio controllo separato

Salve a tutti mi presento sono Edoardo, vorrei porvi un quesito da neofita:
Vorrei controllare due led attraverso un modulo Bluetooth, fino a qui tutto bene, ma se io volessi che alla ricezione del segnale uno dei due led inizi a lampeggieare si può fare in modo che l'altro continui a lavorare in modo indipendente ovvero:
1-led spenti
2-invio il segnale e uno dei due led inizia a lampeggiare
3-invio un segnale diverso e l'altro led o si accende o spenge(in base allo stato precedente)
4- invio un altro segnale che mi fa spengere il led che lapeggia

tutto questo in modo separato ovvero controllarne uno solo o entrambi come spiegato prima.

grazie mille
-Edoardo

:warning:
Ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato. Grazie.

A quanto detto da UKHeliBob aggiungo ...

... cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO della sezione Italiana del forum, (prestando sempre molta attenzione al punto 15), dopo di che, come da suddetto regolamento, fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Si può fare senza grossi problemi.
Posta il tuo codice che si parte da quello.

Questi sono tre if, esattamente come descritti in italiano:

se comando X:
   imposta lampeggio attivo

se comando Y:
   inverti LED2

se comando Z:
    imposta lampeggio disattivo

Dopo di che va scritto un blinker, che fa lampeggiare il LED1 solo quando la variabile
di abilitazione del lampeggio si trova ad esempio a 1.

Il blinker dovrà temporizzare usando NON delay, ma misurando il tempo con la funzione millis, come descritto nell'esempio Blink Without Delay.

const int led = 13;
const int led2 = 8;
int ledState = LOW;
int ledState2 = LOW;
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
const long interval = 700;
int stato = 0;

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}

void loop() {
  char c = Serial.read();
  if(c == 'a'){
      currentMillis = millis();
      if(currentMillis - previousMillis >= interval){
        if (ledState == LOW) {
         ledState = HIGH;
         }
         else{
      ledState = LOW;
      }
    digitalWrite(led,ledState);
      }
      }
      c = Serial.read();
      if(c == 'b'){
      digitalWrite(led,LOW);
      }
    
  }
  else if (c=='d'){
    if (ledState2 == LOW) {
         ledState2 = HIGH;
         }
         else{
      ledState2 = LOW;
      }
    digitalWrite(led2,ledState);
  }
}

Ecco questo è quello che ho buttato giù.

@Claudio_FF ho provato a ragionare sulla tua idea ma non riesco a capire come fare ad applicarla perché per esempio se io do il comando "X" per far lampeggiare il led e poi volessi invertire lo stato dell'altro led uscirei dalla condizione di lampeggio, sicuramente sto sbagliando qualcosa nella comprensione :disappointed_relieved:

Infatti il lampeggio non deve stare dentro quella condizione, ma fuori dagli if che riconoscono i comandi in arrivo. Dentro quella condizione si deve semplicemente dare l'abilitazione al lampeggio, impostando una apposita variabile che resta impostata fino a comando contrario.

Il processo di lampeggio (fuori dalle condizioni di ricezione) legge quella variabile ed agisce di conseguenza, se vogliamo "in parallelo" al processo di ricezione/riconoscimento comandi.

1 Like

Hai letto il link consigliato?

Cosa non ti convince?

Serve una variabile di stato: lamp_on=1 o 0 (o HIGH e LOW). A ogni giro di loop, se è 1 o HIGH, controlla quanto tempo è trascorso e, al momento giusto, inverte lo stato del LED. Se è 0 o LOW, spegne il LED.

#include <SoftwareSerial.h>

String message;
int rxPin = 0;
int txPin = 1;
SoftwareSerial bluetooth(rxPin, txPin);

const int led = 12;
const int led2 = 8;
int ledState = LOW;
int ledState2 = LOW;
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
const long interval = 500;
int statoblink = 0;
int stato1=0;

void setup() {
  Serial.begin(9600);
  bluetooth.begin(9600);
  pinMode(led, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop() {
  /*while (bluetooth.available()) {
    message += char(bluetooth.read());
  }*/
  char c = Serial.read();

  if(c == 'a'){
      statoblink = 1;
  }
   if(c == 'b'){
      statoblink = 0;
   }
   if(c == 'c'){
      stato1 = 1;
   }
   if(c == 'd'){
      stato1 = 0;
   }
   
    currentMillis = millis();
   if(statoblink == 1){
     if(currentMillis - previousMillis >= interval){
      previousMillis = currentMillis;
        if (ledState == LOW) {
         ledState = HIGH;
         }
         else{
         ledState = LOW;
         }
         digitalWrite(led,ledState);
      }
     }
     if(statoblink == 0){
      digitalWrite(led,  LOW);
     }
     if (stato1 == 1){
         digitalWrite(led2, HIGH);
       }
      if (stato1 == 0){
         digitalWrite(led2, LOW);
       }  

  delay(25);
      }
     

Grazie a tutti per i consigli utilissimi, vi lascio in allegato le schema funzionante :metal:

l'unico problema è che se metto i pin tutti alla stessa massa mi lampeggia anche quell che dovrebbe stare fisso :rofl:

Bravo! :slight_smile:
Qualche nota:

  1. se usi LOW, HIGH, false, true per coerenza devi usare una variabile di tipo bool, pur essendo associati nell'ambiente di Arduino a LOW e false il valore 0 e a HIGH e true il valore 1.

  2. LOW e HIGH solitamente si usano per fare confronti con digitalRead o per assegnare uno stato con digitalWrite; negli altri casi si usano false e true, ma funziona comunque:
    Interchanging HIGH/LOW with true/false - #7 by system

  3. per convenzione, le costanti hanno nomi maiuscoli:
    const byte PIN_LED1=12; const byte PIN_LED2=8;

  4. le variabili int sono a 16 bit, ma per piccoli valori tra 0 e 255 o tra -127 e +127 puoi usare byte e char. Più chiaramente puoi usare
    int8_t
    uint8_t
    int16_t
    uint16_t
    int32_t
    uint32_t
    che sono con segno o senza segno (u=unsigned, senza segno) a 8, 16 o 32 bit.

  5. evita l'oggetto String, che frammenta la memoria. Se non vuoi usare le stringhe classiche del C, è stata inventata la libreria SafeString:
    Classe "SafeString" una valida alternativa alla pessima "String" ...

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