SELETTORE BCD

Tutte ottime idee. Credo inserirò la funzione debounce sugli ingressi per evitare la lettura dei rimbalzi. potrebbe essere non necessario visto che la selezione viene inpostata 1 volta e poi non più toccata.
Per la funzione switch come posso scriverla?

[quote author=Michele Menniti link=topic=100540.msg754226#msg754226 date=1333983732]
poi ovviamente dovrà resettare tutto ad ogni nuovo ciclo di lettura;[/quote]
Se definisce totale prima di setup sicuramente
Io ragionavo pensando a tutto nel loop , tutto unito

potrebbe forse usare anche uno switch case senza break;

Sicuramente perche' non ci sara' possibilita' che ci siano piu' valori veri ; da 0 a 9

non so cosa succede esattamente all'interno di quegli aggeggi, immagino che ci siano un bel po' di rimbalzi; forse potrebbe essere necessario, se lui pensa di ruotarlo al volo durante il funzionamento, effettuare più cicli di lettura orima di dare responso.

Potrebbe accettare il valore dopo che questo permane per un paio di decimi
Ma questo va a complicargli la vita perche' dovrebbe aggiungere un temporizzatore ed un valore old
Quegli affari li nascono per selezionare un indirizzo e basta
Risulta piu' semplice mettere un affare del genere piuttosto che 4 dipswitch che poi ,se l'utilizzatore non e' un po' sviluppato, fatichera' come 'na bestia a combinarli in binario
Piu' semplice dire metti 5 piuttosto che .... se vuoi 5 tira su il primo ed il terzo

lightman750:
Per la funzione switch come posso scriverla?

brunol949:

lightman750:
Per la funzione switch come posso scriverla?

switch...case - Arduino Reference

aggiungo che visto che devi settarlo una volta per tutte il debounce NON ti serve assolutamente a nulla, e nemmeno se ogni tanto decidi di cambiare combinazione, purché tu lo faccia prima di dare alimentazione.
@ brunol949: concordo pienamente, ed infatti lightman750 ha confermato che deve lasciarlo su un valore fisso.

Il problema dei rimbalzi non susiste perché quei selettori non sono fatti per essere mossi di coninuo.
Ciao Uwe

Dunque: lo strumento è un pò più complesso. Si tratta di un regolatore di livelli per pellet. Il selettore mi serve per sezionare il fondo scala di un timer che dodrebbe partire quando parte il sistema di carico. Il fondo scala dovrò tararlo più alto del tempo effettivo per caricare la caldaia. Se il timer arriva in fondo spegne tutto perchè vuol dire che qualcosa non va.
Secondo voi MS timer2 può andare bene?

Ora devi divertirti col software; i 4 pin di Arduino li devi impostare come INPUP e poi devi eseguire il comando digitalWrite(pin, HIGH) su tutti è quattro in modo da attivare le R di pull-up interne, sempre come ti ha spiegato Uwe.

Perchè il compilatore mi da errore????

lightman750:
Ora devi divertirti col software; i 4 pin di Arduino li devi impostare come INPUP e poi devi eseguire il comando digitalWrite(pin, HIGH) su tutti è quattro in modo da attivare le R di pull-up interne, sempre come ti ha spiegato Uwe.

Perchè il compilatore mi da errore????

Vediamo se hanno riparato la palla di vetro di Uwe, dopo l'ultima rottura, così lui vede lo sketch che hai scritto, lo copia, lo compila, legge l'errore e poi ti risponde ]:smiley:

Se io metto pinMode(pin,INPUT)
e poi digitalWrite(pin,HIGH)

il compilatore mi dice che non può farlo perchè il pin è impostato come ingresso (e direi che ha PIENAMENTE ragione........)

lightman750:
Se io metto pinMode(pin,INPUT)
e poi digitalWrite(pin,HIGH)

il compilatore mi dice che non può farlo perchè il pin è impostato come ingresso (e direi che ha PIENAMENTE ragione........)

sì eh? chissà perché CENTINAIA DI ALTRI UTENTI, di cui forse QUALCUNO più ESPERTO di te, usano giornalmente quella tecnica per attivare le pull-up interne ]:slight_smile: ma almeno hai prima detto al software che numero è quel pin?
E' segreto qwuesto sketch o potremmo vederlo pubblicato tra due tag "CODE"? :sweat_smile:

lightman750:
Se io metto pinMode(pin,INPUT)
e poi digitalWrite(pin,HIGH)

il compilatore mi dice che non può farlo perchè il pin è impostato come ingresso (e direi che ha PIENAMENTE ragione........)

@Michele Menniti Non ho ancora la palla disponibile; forse un uvetto potrebbe andare bene ugualmente?
@lightman750 Che compilatore usi?

Eccolo:

const int LED1 = 5; //Led e uscita connesso pin 5
const int LED_ALARM = 6; //Led di allarme connesso pin 6
const int PULS_UP = 2; //Sonda UP connesso pin 2
const int PULS_DW = 7; //Sonda DW connesso pin 7
const int BIT1 = 3; //Bit 1 Selettore
const int BIT2 = 4; //Bit 2 Selettore
const int BIT3 = 8; //Bit 3 Selettore
const int BIT4 = 9; //Bit 4 Selettore

int PULS_UP_State = 0; //variabile Puls UP
int PULS_DW_State = 0; //variabile Puls DW
int PIN_1 = 0;
int PIN_2 = 0;
int PIN_3 = 0;
int PIN_4 = 0;
int PIENO = 0; //variabile condizione di riempimento
int ALLARME = LOW; //variabile allarme
int TEMPO = 0; //variabile per misurazione tempo di allarme
int VALORE_SEL = 0; //Reset Selettore

void setup() {
pinMode(LED1, OUTPUT); //inizializzazione dei PIN
pinMode(LED_ALARM,OUTPUT);
pinMode(PULS_UP, INPUT);
pinMode(PULS_DW, INPUT);
pinMode(BIT1,INPUT);
pinMode(BIT2,INPUT);
pinMode(BIT3,INPUT);
pinMode(BIT4,INPUT);

digitalWrite(LED_ALARM, LOW);
digitalWrite(LED1, LOW);
digitalWrite(BIT1, HIGH);

manca la { di chiusura alla void setup e manca completamente la void loop, le hai "tagliate" nel copia incolla o ti mancano? se mancano gli errori sono di sicuro quelli, tanto per cominciare....
così a me compila correttamente:

const int LED1 = 5;                    //Led e uscita connesso pin 5
const int LED_ALARM = 6;               //Led di allarme connesso pin 6
const int PULS_UP = 2;                 //Sonda UP connesso pin 2
const int PULS_DW = 7;                 //Sonda DW connesso pin 7
const int BIT1 = 3;                    //Bit 1 Selettore
const int BIT2 = 4;                    //Bit 2 Selettore
const int BIT3 = 8;                    //Bit 3 Selettore
const int BIT4 = 9;                    //Bit 4 Selettore

int PULS_UP_State = 0;                 //variabile Puls UP
int PULS_DW_State = 0;                 //variabile Puls DW
int PIN_1 = 0;
int PIN_2 = 0;
int PIN_3 = 0;
int PIN_4 = 0;
int PIENO = 0;                         //variabile condizione di riempimento
int ALLARME = LOW;                     //variabile allarme
int TEMPO = 0;                         //variabile per misurazione tempo di allarme
int VALORE_SEL = 0;                    //Reset Selettore

void setup()  {
  pinMode(LED1, OUTPUT);               //inizializzazione dei PIN
  pinMode(LED_ALARM,OUTPUT);
  pinMode(PULS_UP, INPUT);
  pinMode(PULS_DW, INPUT);
  pinMode(BIT1,INPUT);
  pinMode(BIT2,INPUT);
  pinMode(BIT3,INPUT);
  pinMode(BIT4,INPUT);
  
  digitalWrite(LED_ALARM, LOW);
  digitalWrite(LED1, LOW);
  digitalWrite(BIT1, HIGH);
}

void loop()  {}

lightman750:
Se io metto pinMode(pin,INPUT)
e poi digitalWrite(pin,HIGH)

il compilatore mi dice che non può farlo perchè il pin è impostato come ingresso (e direi che ha PIENAMENTE ragione........)

Questo errore non esiste, semplicemente te lo sei inventato. Non hai neppure provato.

Inoltre, casomai tu non ne fossi a conoscenza:
http://arduino.cc/en/Reference/Constants

A pin may also be configured as an INPUT with pinMode, and subsequently made HIGH with digitalWrite, this will set the internal 20K pullup resistors, which will steer the input pin to a HIGH reading unless it is pulled LOW by external circuitry.

Voi avete ragione. Ho dovuto reinstallare il compilatore (quello originale) e oggi funziona. Mah.......
Il resto dello sketch l'ho volutamente non copiato perchè funziona. Comunque vi posto il listato intero (ovviamente non è finito) e vediamo cosa ne pensate e se è possibile semplificarlo.

const int LED1 = 5; //Led e uscita connesso pin 5
const int LED_ALARM = 6; //Led di allarme connesso pin 6
const int PULS_UP = 2; //Sonda UP connesso pin 2
const int PULS_DW = 7; //Sonda DW connesso pin 7
const int BIT1 = 3; //Bit 1 Selettore
const int BIT2 = 4; //Bit 2 Selettore
const int BIT3 = 8; //Bit 3 Selettore
const int BIT4 = 9; //Bit 4 Selettore

int PULS_UP_State = 0; //variabile Puls UP
int PULS_DW_State = 0; //variabile Puls DW
int PIN_1 = 0;
int PIN_2 = 0;
int PIN_3 = 0;
int PIN_4 = 0;
int PIENO = 0; //variabile condizione di riempimento
int ALLARME = LOW; //variabile allarme
int TEMPO = 0; //variabile per misurazione tempo di allarme
int VALORE_SEL = 0; //Reset Selettore

void setup() {
pinMode(LED1, OUTPUT); //inizializzazione dei PIN
pinMode(LED_ALARM,OUTPUT);
pinMode(PULS_UP, INPUT);
pinMode(PULS_DW, INPUT);
pinMode(BIT1,INPUT);
pinMode(BIT2,INPUT);
pinMode(BIT3,INPUT);
pinMode(BIT4,INPUT);

digitalWrite(LED_ALARM, LOW);
digitalWrite(LED1, LOW);
digitalWrite(BIT1, HIGH);
digitalWrite(BIT2, HIGH);
digitalWrite(BIT3, HIGH);
digitalWrite(BIT4, HIGH);
}

//loop del programma

void loop() {
PULS_UP_State = digitalRead(PULS_UP);
PULS_DW_State = digitalRead(PULS_DW);
PIN_1 = digitalRead(BIT1);
PIN_2 = digitalRead(BIT2);
PIN_3 = digitalRead(BIT3);
PIN_4 = digitalRead(BIT4);

if (PULS_UP_State == LOW && PULS_DW_State == LOW && PIENO == HIGH) {
int (PIENO = LOW); //se le sonde sono basse e risultava pieno, resetto il flag PIENO
digitalWrite(LED_ALARM, LOW);
delay(100);
}
if (PULS_UP_State == HIGH && PULS_DW_State == LOW && PIENO == LOW) {
digitalWrite(LED1, LOW); //se leggo solo la sonda di MAX abilitata metto in allarme
digitalWrite(LED_ALARM, HIGH);
digitalWrite(ALLARME, HIGH);
delay(100);
}
if (PULS_UP_State == HIGH && PULS_DW_State == LOW && PIENO == HIGH) {
digitalWrite(LED1, LOW); //se smetto di leggere la sonda MIN metto in allarme
digitalWrite(LED_ALARM, HIGH);
digitalWrite(ALLARME, HIGH);
delay(100);
}
if (PULS_UP_State == LOW && PULS_DW_State == HIGH && PIENO == HIGH) {
digitalWrite(LED1,LOW); //se è pieno e smette di leggere la sonda MAX non faccio nulla
digitalWrite(LED_ALARM, LOW);
delay(100);
}
if (PULS_UP_State == LOW && PULS_DW_State == LOW && PIENO == LOW) {
digitalWrite(LED1, HIGH); //leggo entrambi gli ingressi. se sono bassi entrambi abilito l'uscita.
digitalWrite(LED_ALARM, LOW);
delay(100);
}
if (PULS_UP_State == LOW && PULS_DW_State == HIGH && PIENO == LOW) {
digitalWrite(LED1,HIGH); //se sta riempiendo e supera il minimo non cambio nulla
digitalWrite(LED_ALARM, LOW);
delay(100);
}
if (PULS_UP_State == HIGH && PULS_DW_State == HIGH && PIENO == LOW) {
digitalWrite(LED1,HIGH); //se sta riempiendo e arriva al MAX dico che è pieno
digitalWrite(LED_ALARM, LOW);
int (PIENO = HIGH);
delay(100);
}
if (PULS_UP_State == HIGH && PULS_DW_State == HIGH && PIENO == HIGH) {
digitalWrite(LED1, LOW); //se tutto pieno spengo l'uscita
digitalWrite(LED_ALARM, LOW);
delay(100);
}
delay(100);
}