vi cheido un aiuto , dovrei realizzare un sistema di conteggio auto per un parcheggio
ovvero dovrei incrementare con il pin 5 e decrementare con il 6, al raggiungimento del numero massimo devo attivare un uscita e accendere un semaforo, scopiazzando un pò in giro ho messo insieme questo codice ma non funziona!!! essendo una pippa non capisco dove sbaglio, qualcuno mi aiuta per cortesia
//Conteggio Auto
const int IncresePin = 5 //Incremento auto
const int DecresePin = 6 //Decremento auto
const int Red = 13 //Semaforo conteggio
const int maxCAR = 10 //Numero posti massimio
int STATE = 0 //Stato Attuale auto
int COUNTER = 0 //Numero auto iniziali
int lastCOUNTER = 0 //Stato auto precedente
//Conteggio Auto
const int IncreasePin = 5; //Incremento auto
const int DecreasePin = 6; //Decremento auto
const int Red = 13; //Semaforo conteggio
const int maxCAR = 10; //Numero posti massimio
int COUNTER = 0; //Numero auto iniziali
//Setup
void setup()
{
pinMode(IncreasePin, INPUT);
pinMode(DecreasePin, INPUT);
pinMode(Red, OUTPUT);
}
void loop(){
if (digitalRead(IncreasePin)==HIGH)
COUNTER++;
if (digitalRead(DecreasePin)==HIGH)
COUNTER--;
delay(10);
//aspetto che lasci i pulsanti
while(digitalRead(IncreasePin)==HIGH || digitalRead(DecreasePin)==HIGH);
//il ; significa che non esegue nulla, aspetta e basta
if(COUNTER>=maxCAR)
digitalWrite(Red, HIGH);
}
ho provato aggiungendo una trasmissione in seriale che mi riporta il dato del numero di posti attualmente occupati, il probblema è che se tengo attivo l'ingresso per troppo tempo mi conta 2 o tre volte, mi piacerebbe che il conteggio avvenisse solo dopo un on-off, vi posto il codice
//Conteggio Auto
const int IncreasePin = 2; //Incremento auto
const int DecreasePin = 3; //Decremento auto
const int Red = 13; //Semaforo conteggio
const int maxCAR = 10; //Numero posti massimio
int COUNTER = 0; //Numero auto iniziali
if (digitalRead(IncreasePin)==HIGH)
COUNTER++;
if (digitalRead(DecreasePin)==HIGH)
COUNTER--;
delay(10);
//aspetto che lasci i pulsanti
while(digitalRead(IncreasePin)==HIGH || digitalRead(DecreasePin)==HIGH);
//il ; significa che non esegue nulla, aspetta e basta
Io farei un interrupt sul RISING, cosi basta che l ingresso da basso diventi alto e aumenti il conteggio e poi lo tiri giu.
nel loop controlli il numero di macchine e nell interrupt lo incrementi.
Attento soltanto a dichiarare il numero di macchine come volatile!
Secondo me cosi sarebbe piu pulito e probabilmente anche piu piccolo come dimensioni, anche se il tuo codice andrebbe bene anche su un arduino mini.
PS solo per mia curiosita ma dove riesci a trovare gente che ti faccia lavorare su queste cose? L'unico interessato al mio arduino di solito sono io... mi piacerebbe farmi pagare qualche shield!
questo è il mioprimo arduino :), io di professione vendo sistemi TVCC.. e mio papà automazione ( è per lui che sto facendo questi test), quindi arduini si sposa bene :)... comunque se ho bisogno per qualcosa di più impegnativo ti posso contattare?
Io lo farei cosi con gli interrupt mi sembra piu leggibile, non lho provato perche non ho ancora l arduino, ma spero a breve che mi arrivi.
Attento che i valori di IRQ sono i numeri di interrupt non i numeri dei pin dove colleghi e che non tutti i pin supportano gli interrupt.
-Claudio
//Conteggio Auto
const int IRQ_IncreasePin = 5; //IRQ Incremento auto
const int IRQ_DecreasePin = 6; //IRQ Decremento auto
const int RedLight = 13; //Semaforo
const int maxCAR = 10; //Numero posti massimio
volatile int COUNTER = 0; //Numero auto iniziali
void incrementa(){
if(COUNTER<maxCAR){//lascio entrare solo se ce spazio, magari anche se pieno uno ci prova
COUNTER++;
//alza la sbarra per entrare
}
}
void decrementa(){
if(COUNTER!=0){//giusto un controllo per vedere che vada tutto bene
COUNTER--;
//alza la sbarra per uscire
}
}
//Setup
void setup()
{
//define tipology of pin
attachInterrupt(IRQ_IncreasePin,incrementa,RISING);
attachInterrupt(IRQ_DecreasePin,decrementa,RISING);
pinMode(RedLight, OUTPUT);
}
//loop
void loop(){
if (COUNTER == maxCAR) {//se e pieno
digitalWrite(RedLight, HIGH);
}
else{
digitalWrite(RedLight, LOW);//se non e pieno
}
}