Pulsanti di comando multipli

Ciao! Sto provando a comandare dei led tramite pulsanti di comando. Il mio obbiettivo è quello di comandare un uscita, che in fase di test può essere un led (poi facilmente sotituibile con relè è quant'altro), con una modalità tipo toggle con un pulsante che funziona come ingresso. Semplicemente ----> schiaccio una volta il pulsante e accendo il led, -----> ri schiaccio il pulsante e spengo il led. Fino a qui non ci sono problemi.

Mi incasino =( quando provo a mettere più pulsanti (ovvero non riesco a scrivere uno sketch che funziona), a me servirebbero complessivamente 12 pulsanti di comando che attivano con questa modalità tipo (passo passo), altrettanti led.

C'e qualcuno che mi sà dare/dire qualche idea, o sketch tipo per risolvere il mio stupido :~ problemino.!!!!!

mostra l tuo codice

Ciao e benvenuto. La richiesta è semplice ma la risposta è difficile.

Gestire 1 pulsante e 1 led non è un grosso problema. I problemi vengono fuori quando devi gestire molte uscite contemporaneamente perché devi strutturare il codice affinché tenga memoria degli stati di tante uscite. Sorge poi un altro problema: 12+12 linee sono 24 linee. I pin dell'Arduino UNO sono 20, considerando anche i pin analogici che puoi comunque usare come digitali. Per cui finisci prima le linee del tuo sketch.

Inoltre la corrente massima che può attraversare un Atmega328 è di 200 mA, compresa quella che serve per alimentarlo, e che la max. corrente erogabile da un singolo pin è di 40 mA. Quindi bisogna stare attenti a questo particolare.

Alla luce di quanto sopra, ti consiglio l'uso degli shift register per gestire sia gli ingressi che le uscite: per gli ingressi dovresti usare un parallel-to-serial Shift Register come ad esempio il 74165, mentre per le uscite un Serial-to-parallel Shift Register come il 74595. Con 6 pin totali, 3 per gli ingressi e 3 per gli input, risolvi il problema lato HW (ovviamente ti serviranno almeno un paio di 165 ed un paio di 595 dato che ogni chip può gestire max 8 linee). Lato SW, dovrai però monitorare costantemente gli ingressi (li devi leggere tutti ogni tot) e variare le uscite di conseguenza.

Altri potranno proporre soluzioni più sofisticate.

per ora sto provando a usareil segunte llistato ma non riesco a fare funzionare più di un pulsante. Ho provato ancche con la libreia butto ma non vaper niente meglio.

ho guardato anche la possibilita di usare un multiplexer per i vari comndi ma anche in quel caso riesco inviare al micro i comandi dei pulsanti ma non a avere la relativa risposta sul led in uscita.

/* Test_02

Premendo Butoon_1 accendo LED1, Premendo Button_2 spengo LED1.

*/

int LED1 = 6; // LED1 connesso al pin digitale D6 int LED2 = 5; // LED2 connesso al pin digitale D5 int Button_1 = 2; // Button_1 connesso al pin digitale D2 int Button_2 = 7; // Button_2 connesso al pin digitale D7 int Button_3 = 4; // Button_3 connesso al pin digitale D4 boolean lastButton_1 = LOW; boolean LED1On =false; boolean lastButton_2 = LOW;

// Dichiarazione delle variabili usate per leggere lo stato dei pulsanti int Button_1_State = 0; int Button_2_State = 0;

void setup() { // inizializza il pin del LED come uscita digitale: pinMode(LED1, OUTPUT); // initializza il pin del pulsante come ingresso: pinMode(LED2, OUTPUT); //definisce il pin digitale LED2 come output pinMode(Button_1, INPUT); // initializza il pin del pulsante come ingresso: pinMode(Button_2, INPUT); }

// Viene dichiarato un loop infinito

void loop() {

// Legge lo stato del pulsante 1: Button_1_State = digitalRead(Button_1);

// Se è premuto attiva il LED: if (Button_1_State == HIGH && lastButton_1 ==LOW) { { LED1 = !LED1; lastButton_1 = HIGH; } // Accendo il LED: digitalWrite(LED1, HIGH); digitalWrite(LED2, LOW); }

// Legge lo stato del pulsante 2: Button_2_State = digitalRead(Button_2);

// Se è premuto spegne il LED if (Button_2_State == HIGH) { // Spengo il LED: digitalWrite(LED1, LOW); digitalWrite(LED2, HIGH); } }

Bisognerebbe anche analizzare i casi possibili prima di tirare giù uno schema a blocchi e relativo sketch, la prima domanda che mi sorge spontanea per fare i controlli nella massima velocità possibile è : qunanti pulsanti contemporaneamente possono essere premuti? solo uno alla volta? può esserci un caso che anche tutti siano chiusi contemporaneamente? vengono chiusi da una persona o altri dispositivi elettronici? (in questo caso i tempi di reazione sono importanti) Tutto il programma fa solo il controllo pulsanti o anche altre funzioni? in questo caso i tempi si allungano Ad esempio io controllo 48 porte 74 volte (circa) al secondo + qualche piccola operazione, mi basta e avanza, bisogna vedere tu cosa vuoi fare specifica meglio l'impiego del tuo progetto

ciao

non capisco perchè usi la variabile lastButton_1 ==LOW, cosa cerchi di ottenere? in oltre quando accendi un led spegni l’altro, è così che deve funzionare?

Ciao. Effettivamente potrebbero essere premuti contemporanamente più pulsanti ma comunque non tutti perche come vi dicevo ieri la mia idea sarebbe quella di controllare dei carichi al posto dei led (nella fase 2). Per ora mi basterebbe avere un sistema con più pulsanti che potrebbero anche essere premuti contemporanamente e la cui velocità di reazione non è rilevante (intendo dire che se il carico si collega diciamo dopo un tempo che per i processore è rilevante per ipotesi un secondo), alla fine per l'inerzia dei relè o dei motori o altri attuatori posti a valle non cambia un gran che.

Tu come hai fatto a controllare tutte quelle porte?

In questa fase (come prova), mi piacerebbe controllare i motori degli avvolgibili di casa. Che come sai hanno Un pulsante di salita e Uno di discesa su ogni tapparella + un pulsante centralizzato (sempre doppio salita/discesa), per la chisura/apertura di tutto il sistema (ma che funzuinerebbe esattamente come gli altri). La parte elettrica non è un probelma mentre la compilazione dei uno sketch di comando per i pulsanti mi sta mettendo fortemente in crisi.

ok, allora io lavorerei così:

crei una matrice (immagina una tabella), con 2 colonne e tante righe quanti i pulsanti.
nel caso 22 pulsanti:
int matrice[22][2]

ora, ogni riga rappresenta una accoppiata pin di input, pin di output, nella prima colonna (attenzione, gli array partono da 0 a contare, quindi di indice 0) ci sarà il numer di pin di input, nella seconda colonna(indice 1) il numero di pin di output.
prendiamo il caso vuoi controllare se il pulsante 5 è premuto (pulsante 5, -1 perchè si conta da 0, vuol dire indice 4):

boolean statoPulsante = digitalRead(matrice[4][0]);

ora se lo stato del pulsante è high, accendiamo il carico, altrimenti lo spegnamo.

if (statoPulsante==HIGH){//se il pulsante è premuto
digitalWrite(HIGH, matrice[4][1]);
}else{ //altrimenti
digitalWrite(LOW, matrice[4][1]);
}

ora, se vuoi testare tutti gli input di fila, senza scrivere per 22 volte lo stesso pezzo di codice, usi un for, il cui indice andrà da 0 a 21(perchè le celle sono 22, ma se si inizia a contare da 0 le celle vanno da 0 a 21), e usi la variabile contatore come indice delle righe della matrice:

for (int i=0; i<22; i++){//è verò, ho lasciato 22, ma c’è il minore, quindi si ferma a 21! lo so questo fatto dello 0 è un casino all’inizio
//esegui il codice sull’elemento matrice_[0] e matrice*[1]_
_
}*_
spero di essermi spiegato e averti dato abbastanza codice per iniziare, ma non troppo in modo da farti ragionare :slight_smile:
una volta che hai copletato il codice, postalo, perchè molto probabilmente non funzionerà bene: un pulsante premuto (o non premuto, dipende dal circuito, potrebbe anche non avere il problema) non rimane fisso allo stato HIGH o LOW, ma continua a “rimbalzare” su e giù: questo problema si chiama appunto bounce (rimbalzo dall’inglese) e si risolve complicando un pochettino il controllo sulla lettura del pin di input, e se necessario lo affrontiamo più avanti.

Ciao lesto.

Sei stato molto gentile. Ti ringrazio per la dritta, adesso non ho sotto mano arduino.

La tua è sicuramente una buona idea a cui non sarei arrivato da solo.

Provo a scrivermi lo sketch e poi ti aggiorno.

P.S.: secondo te è meglio pensare ad un arduino (con più ingressi tipo mega), o basta l'uno.

dipende dai progetti che vuoi fare, se ti basta qualche input in più complicando un poco il codice puoi usare dei demux o degli switch(meglio)