fog machine/problema switch...case, aiuto non riesco a capire

scusate ma proprio non riesco a capire come devo compilare uno sketch con il comando switch...case.
qualcuno gentilmente mi può illuminare?

sto cercando di far funzionare una fog machine con orduino e voglio far si che ci sia un bottone che comanda un relè che fa funzionare delle pompe tramite delay dato da un potenziometro (problema risolto e funzionante)
ora devo riuscire a far si che premendo un altro bottone il relè delle pompe non tenga più conto del potenziometro e tenga in funzione le pompe tanto quanto io tengo premuto il bottone.
ho provato con if..else ma non riesco ad escludere il potenziometro e quindi il relè apre e chiude comunque a seconda del valore del potenziometro e quindi ho optato per usare lo schema switch...case pensando che potesse risolvere questo problema tuttavia non riesco proprio a capire come impostare e far comprendere ad arduino i vari casi.
lo sketch che ho fatto è questo:

const int resint = A0; // pin interruttore resistenze
const int pumpint = A1; // pin interruttore pompe
const int manint = A2; // pin interruttore manuale
const int potpin = A3; // pin potenziometro
const int fluidsens = A4; // pin sensore presenza liquido
const int tempsens = A5; // pin sensore temperatura
const int resrel = 2; // pin rele resistenze
const int pumprel = 4; // pin rele pompe
const int potrel = 7; // pir rele potenziometro
const int spyfluidled = 13; // pin led spia fluido
const int spytempled = 12; // pin led spia temperatura

int resstate = 0; // stato rele resistenze
int lastresstate = LOW; // ultimo stato rele resistenze
int pumpstate = 0; // stato rele pompe
int lastpumpstate = LOW; // ultimo stato rele pompe
int manstate = 0; // stato rele interruttore manuale
int lastmanstate = LOW; // ultimo stato interruttore manuale
int valpot = 0; // valore potenziometro
int delayval = 0; // valore delay pompe
int fluidstate = 0; // valore sensore liquido
int lastfluidstate = LOW; // ultimo valore sensore liquido
int valtemp = 0; // valore sensore temperatura
int tempstate = 0; // stato sensore temperatura
int lasttempstate = LOW; // ultimo stato sensore temperatura


void setup ()
{
  pinMode(resint, INPUT);
  pinMode(pumpint, INPUT);
  pinMode(manint, INPUT);
  pinMode(potpin, INPUT);
  pinMode(fluidsens, INPUT);
  pinMode(tempsens, INPUT);
  pinMode(resrel, OUTPUT);
  pinMode(pumprel, OUTPUT);
  pinMode(potrel, OUTPUT);
  pinMode(spyfluidled, OUTPUT);
  pinMode(spytempled, OUTPUT);

  Serial.begin(9600);
}

void loop ()
{
  valpot=analogRead(potpin);
  delayval=map(valpot, 15, 1023, 250, 4000);
  fluidstate=digitalRead(fluidsens);
  fluidstate=digitalRead(fluidsens);
  tempstate=digitalRead(tempsens);
  valtemp=map(tempsens, 0, 1023,0, 255);
  resstate=digitalRead(resint);
  pumpstate=digitalRead(pumpint);
  int manstate=digitalRead(manint);

  if (resstate == lastresstate)
  {
    digitalWrite(resrel, HIGH);
  }
  else
  {
    digitalWrite(resrel, LOW);
  }

  switch(manstate,lastmanstate)
  {

  case 0:
    if (pumpstate == lastpumpstate)
    {
      digitalWrite(pumprel, HIGH);
    }
    else
    {
      digitalWrite(pumprel, LOW);
      delay(delayval);
      digitalWrite(pumprel, HIGH);
      delay(delayval);
    }
    break;

  case 1:
    if (manstate == lastmanstate)
    {
      digitalWrite(pumprel, LOW);
      delay(delayval);
      digitalWrite(pumprel, HIGH);
      delay(delayval);
    }
    else
    {
      digitalWrite(pumprel, LOW);
    }
    break; 

  default:
    break;
  }


}

adesso io, premendo il bottone per far andare le pompe queste mi vanno e seguendo il delay dato dal potenziometro, se premo il bottone che dovrebbe escludere il potenziometro e far funzionare le pompe finchè non smetto di premere... non succede nulla e non riesco proprio a capire come devo impostare i comandi.

chiedo aiuto!!!!

Scusa ma che sintassi è questa (… nel senso, che valore dovrebbe assumere secondo te quello che è tra parentesi) ?

switch(manstate,lastmanstate)

Guglielmo

Edit : Ovvero … che non capico l’uso del “comma operator” in questo switch … praticamente (a, b) ha come risultato b quindi … quale sarebbe lo scopo nel tuo statement switch ???

Forse non ho capito bene io il senso della tua domanda, ma ... se tutto quello che ti serve e' un "bypass" delle funzioni di temporizzazione dell'arduino, perche' non mettere semplicemente un pulsante in parallelo al comando del rele', o addirittura al rele stesso ? :cold_sweat:

infatti è proprio un problema di sintassi il mio,
facendo ricerche in rete ho trovato tutti esempi su sensori di vario genere che quindi generano un certo lasso di dati, mentre non ho trovato nulla per un interruttore e quindi non riesco a capire come pote gestire e scrivere il comando.

avevo provato anche a dare come comando

int manstatemin=0;
int manstatemax=1;

switch(manstatemin, manstatemax)

ma il risultato non è cambiato.
come dovrei impostare il comando?

Etemenanki:
per quanto riguarda la tua proposta....ho già pensato e provato a usare un altro relè che si aprisse e si chiudesse alla pressione o al rilascio del pulsante e che al contempo disattivasse il relè comandato dal poenziometro.
Tuttavia il problema non si è risolto perchè il relè si apre e si chiude sempre seguendo quanto comandato dal potenziometro e mi trovavo sempre con un rele "lampeggiante" che comandava a tempo le pompe e un relè che bypassava il primo sempre acceso pertanto mi sembrava una cosa veramente inutile.

problema risolto,
magari non proprio in maniera ortodossa ma sono riuscito aggiungendo due relè, uno per bypassare quello delle pompe e l'altro per interrompere il flusso dati del potenziometro
(non ho ancora capito perchè continuava ad interferire.

il problema switch...case però rimane.
ora devo realizzare i comandi per i sensori di calore e di presenza fluido e questo tipo di comando mi sembra quello che fa per me dato che, se non ho capito male, permette di creare più "vie da seguire" a seconda delle variabili.

tuttavia, non ho ancora capito come si compila il comando switch...case.

qualcuno me lo può spiegare per cortesia?

intanto grazie
DD

DoubleD666:
...
il problema switch...case però rimane.
...

Ma hai guardato il "Reference" QUI ??? Perché mi sembra ben spiegato ...
... in funzione del valore di UNA variabile (quella che indichi nello switch) hai varie possibilità (quelle che indichi nei vari case).
La variabile inoltre DEVE essere di tipo int, shor, long o char.

Guglielmo

ho capito che al variare di una variabile ho i vari casi.
Avevo già guardato sulla guida alla quale mi hai indirizzato, ho cercato in rete sketch con il comando switch...case,ho provato anche a copiarli ma non riesco a capire.

Non capisco come impostare i vari casi.

facciamo un esempio

const int bottone=A4; // nel mio caso due cavi nudi che immersi in un liquido se fanno corto fanno funzionare tutto altrimenti bloccano tutto
int statobottone= 0; // la mia variabile se non è questo che ho capito male

void setup ()
{
pinMode(bottone, INPUT);
}

void setup ()
{
statobottone=digitalRead(bottone)

switch(statobottone)
{
caso 1:
 // non va nulla
break;

caso 2:
 // va tutto
break;
}
}

Questo è circa quello che ho provato a fare
però l'unico evento che si realizza è il secondo, cioè, va sempre tutto

Visto che proprio non ci arrivo mi sapete dire dove sbaglio per favore?
grazie
DD

… in quel codice c’è qualche cosa che non quadra … hai DUE volte la funzione setup() e non hai la funzione loop() … :roll_eyes:

Sistemalo e poi ne riparliamo …

Guglielmo

P.S. : Quando si usa un contatto “meccanico” (… nel senso di non elettronico) è facile che alla chiusura ed alla apertura del contatto ci siano dei “rimbalzi”, ovvero una serie di chiusure/aperture ravvicinate nel tempo. Per evitare di ricevere una raffica di impulsi, equivalenti alle N aperture/chiusure di una serie di “rimbalzi”, si usa una tecnica di “debouncing” come descritto QUI. Visto che tu hai, in fin dei conti, un contatto “meccanico”, vedi se non sia il caso di implementarla per evitare falsi segnali di apertura/chiusura del contatto.

data l'ora in cui ho scritto il post ho sbagliato a scrivere comunque il secondo setup sarebbe il loop come è ovvio che debba essere-
in ogni caso riscrivo il mio esempio:

const int bottone=A4; // nel mio caso due cavi nudi che immersi in un liquido se fanno corto fanno funzionare tutto altrimenti bloccano tutto
int statobottone= 0; // la mia variabile se non è questo che ho capito male

void setup ()
{
pinMode(bottone, INPUT);
}

void loop()
{
statobottone=digitalRead(bottone)

switch(statobottone)
{
caso 1:
 // non va nulla
break;

caso 2:
 // va tutto
break;
}
}

il problema è che il non si verifica il caso "non va nulla" ma, al contrario, tutto continua ad andare come se nulla fosse.

per fare i test ho provato a fare direttamente corto sulla breadboard collegando il filo del pin A4 con i 5V in modo tale da evitare i problemi di debounce che potrebbe darmi un bottone che fisicamente non userò (contando che poi, per tutto il progetto non userò bottoni ma interruttori a bilanciere che dovrebbero soffrire meno debouncing).

ad ogni modo, ad ogni variazione di "statobottone" il risultato non cambia, va sempre tutto quindi c'è qualcosa che non va nello script e non sono in grado di capire cosa sia dato che si verifica solo uno dei casi ma non l'altro, è come se la funzione switch non venisse considerata.

Hai provato a scrivere "case" invece di "caso" ?
Statobottone, inoltre, viene da un digitalread quindi è 1 oppure 0.

Il digitalRead restituisce il valore di lettura dei pin che può valere LOW o HIGH, ovvero 0 e 1, non 1 e 2.
Il caso 2 non funzionerà e quando vale 0 lo switch non sa che fare.
Ecco perché si mette anche il case default: quando ci posso essere valori non previsti.

Puoi riscriverlo cosi

void setup ()
{
  pinMode(bottone, INPUT);
}

void loop()
{
  statobottone=digitalRead(bottone)

  switch(statobottone)
  {
    case LOW:
    // non va nulla
    break;

    case HIGH:
    // va tutto
    break;

    default:
    break;
  }
}

p.s. Mi chiedo come mai ti compilasse... o non andava neanche quello?

compila e trasferiva ad Arduino senza problemi
per quello non riesco a capire dov'è il problema.

adesso riprovo anche se con

statobottone=digitalRead(bottone);

switch(statobottone)
{
case LOW:
// non va nulla
break;
caso HIGH:
// va tutto
break;
}

ho già provato.
a compilato e trasferito tutto
ma il risultato non è cambiato
riproverò

risolto!!!

penso che il malfunzionamento del comando switch…case sia stato dovuto ad un falso contatto nella basetta, cambiando prima il bottone che usavo, poi il cavetto ed infine il pin della basetta ora funziona tutto.

ora proverò a vedere se riesco a far funzionare un altro switch…case

adesso devo impostare una termocoppia