salve a tutti spero di essere abbastanza chiaro dato la mia poca esperienza
ho realizzato un contatore up che ad un determinato volore impostato accende un led.
fino qui tutto bene. voglio implementarlo con un dipswitch a 4 posizioni perche ho necessita di cambiare valore impostato e non voglio programmare sempre arduino.
la mia idea è: avendo necessita di voler impostare valori che decido al momento e molto flessibili, impostando i dip a combinazione imposto i valori gia assegnati esempio
tutti a off valore 100 on off off off 110 off on off off 120
e cosi via per tutte le combinazioni.
non riesco ad assegnare il valore alla combinazione. qualcuno puo aiutarmi?
Grazie
Periodicamente (per esempio ogni 200ms, con millis() ) leggi lo stato degli ingressi e con degli if/else o con uno switch case imposti i valori.
Puoi anche combinare i 4 ingressi, per esempio:
uint8_t stato = 8*digitalRead(6)+4*digitalRead(5)+2*digitalRead(4)+digitalRead(3);
// I/O 6543
if (stato == 0b0000) {} // Tutti a 0
else if (stato == 0b0001) {} // Solo il 3 è a 1
Puoi farlo anche con uno switch case.
Cioè? Comunque con 4 switch hai 16 combinazioni possibili, ti conviene dare un "peso" binario ad ognuno (1,2,4,8), poi li leggi in sequenza e se ON sommi il numero corrispondente. Alla fine uno switch/case assegna ad ogni combinazione il valore che vuoi.
Comincia con il pubblicare il codice che hai scritto, ben indentato (ctrl-T nell'IDE) e racchiuso dai code tags (</>).
Ciao, Ale.
// CONTATORE versione V1.1 CON DISPLAY TM1632
#include "TM1637.h"
#define DIO 11
#define CLK 12
TM1637 tm1637(CLK,DIO);
int count = 0;
int SWITCH1=7 ; // imposta switch 1
int SWITCH2=4 ; // imposta switch 2
int SWITCH3=3 ; // imposta switch 3
int SWITCH4=2 ; // imposta switch 4
byte Z=0;
byte A=0;
byte B=0;
byte C=0;
byte D=0;
void setup() {
tm1637.init(); //INIZIALIZZAZIONE DYSPLAY
tm1637.set (BRIGHT_TYPICAL); //IMPOSTO LUMINOSITA
pinMode(SWITCH1, INPUT); // dipswitch_1
pinMode(SWITCH2, INPUT); // dipswitch_2
pinMode(SWITCH3, INPUT); // dipswitch_3
pinMode(SWITCH4, INPUT); // dipswitch_4
pinMode(6, INPUT); // conta
pinMode(13,INPUT); // reset
pinMode(8,OUTPUT); // led pannello lp
pinMode(9,OUTPUT); // led esterno lf
pinMode(10,OUTPUT); // rele
}
int v1, prevv1 ; // qui creo delle variabili di ingresso e uscita
void loop() {
byte SW1 = (digitalRead(SWITCH1)); // creo il bite SW1 quando chiudo switch 1
byte SW2 = (digitalRead(SWITCH2)); // creo il bite SW2 quando chiudo switch 2
byte SW3 = (digitalRead(SWITCH3)); // creo il bite SW3 quando chiudo switch 3
byte SW4 = (digitalRead(SWITCH4)); // creo il bite SW4 quando chiudo switch 4
int v1 = !digitalRead(6); // ingresso per contare
if (v1 && !prevv1 ){ // s1 true prevs1 falso il pulsante è aperto quindi fronte di salita
}
if (!v1 && prevv1 ){ // s1 falso prevs1 falso il pulsante è satto rilasciato quindi fronte di discesa
count++;
}
if (digitalRead (13)){ //qui resetto il contatore
count = 0;
}
shownumber (count); //questo serve per accendere il display
prevv1 = v1;
A = ( SW1 & !SW2 & !SW3 & !SW4);
B = (!SW1 & SW2 & !SW3 & !SW4);
C = (!SW1 & !SW2 & SW3 & !SW4);
}
void shownumber(int n){
int d1 = n % 10; // qui prendo il numero del modulo e trovo le unita
int d2 = (n/10) % 10; // qui prendo il numero del modulo e trovo le decine
int d3 = (n/100) % 10; // qui prendo il numero del modulo e trovo le centinaia
int d4 = (n/1000) % 10; // qui prendo il numero del modulo e trovo le migliaia
tm1637.display(0,d4); // migliaia
tm1637.display(1,d3); // centinaia
tm1637.display(2,d2); // decine
tm1637.display(3,d1); // unita e quindi numero + a destra
/********************** QUI IMPOSTO I SETTAGGI***************************/
if (A) { Z = 2;
}
if (B) { Z = 5;
}
if (C) { Z = 8;
}
// qui dovrei accendere ad A e spegnere ad (A+2)
if (count >=Z & count <=(Z+2)){ //qui accendo il led quando conto 8
digitalWrite(8, HIGH);
}
else
{
digitalWrite(8, LOW);
}
}
sicuramente ci sono sistemi migliori per fare quello che mi occorre
il sw sembra funzionare
se mi date qualche informazioni forse riesco a fare meglio
Come ti avevo suggerito...
Grazie Datman, infatti ho preso spunto.
ora cerco di perfezionare anche le 3 uscite che hanno scopi diversi
uint32_t t_lett_dsw;
loop:
if(millis()-t_lett_dsw>=500) // Ogni mezzo secondo controlla lo stato dei dip switch
{
t_lett_dsw+=500;
switch (8*digitalRead(SWITCH1) + 4*digitalRead(SWITCH2) + 2*digitalRead(SWITCH3) + digitalRead(SWITCH4))
{
// dipsw 1234
case 0b1000: ... ; break;
case 0b1100: ... ; break;
case 0b0001: ... ; break;
...
}
}
Io adotterei un approccio diverso francamente...
Un dip-switch da 4 posizioni ti limita moltissimo sui possibili valori di preset del contatore.
Visto che hai degli ingressi liberi, puoi aggiungere un paio di pulsanti e creare una semplice interfaccia di "programmazione" del timer che a quel punto ha la massima flessibilità e scalabilità.
Se non ricordo male, ho un progetto molti simile su Tinkercad.com.
Se colleghi i 4 dsw su 4 I/O in sequenza, poi, è ancora più semplice. Per esempio, usando gli I/O 2, 3, 4 e 5:
uint32_t t_lett_dsw;
loop:
if(millis()-t_lett_dsw>=500) // Ogni mezzo secondo controlla lo stato dei dip switch
{
t_lett_dsw+=500;
// dipsw --4321--
// I/O 76543210
switch ((PIND&0b00111100)>>2) // Mette una maschera sui 4 I/O utilizzati
{ // e li scorre a destra di due.
// dipsw 4321
case 0b0001: ... ; break;
case 0b0011: ... ; break;
case 0b1000: ... ; break;
...
}
}
Comunque con i dip switch collegati al positivo senza (suppongo) resistenze di pulldown aspettati parecchie false letture...
Ciao, Ale.
Ah, beh... Una cosa del genere non dà "false letture"... E' proprio sbagliata e non funzionerà mai!
Con i dip switch verso il positivo servono delle resistenze di pull down, per esempio da 10kOhm; altrimenti, mettendo i dip switch verso massa è sufficiente attivare le resistenze interne impostando il pin come ingresso con pinMode (pin, INPUT_PULLUP);
In questo secondo caso, naturalmente, i dip switch chiusi verranno letti a livello 0.
ho realizzato un prototipo collegando +5v a ingresso pulsante o dipswitch, uscita a resistenza e pin arduino, altro capo resistenza a gnd , quindi pull-down.
da quello che state dicendo forse è meglio utilizzare il collegamento a pull-up?
No. Il pullup ti permette di usare le resistenze interne, ma inverte gli stati. Ha di buono che i comandi devono chiudere a massa, perciò non devi portare in giro il positivo. Lascialo così com'è senza problemi.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.