contaposti

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 :slight_smile:

//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

//Setup
void setup()
{
//define tipology of pin
pinMode(IncresePin, INPUT);
pinMode(DecresePin, INPUT);
pinMode(RedLight, OUTPUT);
}

//loop
void loop(){
COUNTER = digitalRead(IncresePin)
if (COUNTER != lastCOUNTER) {
if (COUNTER == HIGH) {
STATE++}};
{
COUNTER = digitalRead(DecresePin)
if(COUNTER != lastCounter) {
if (COUNTER == HIGH) {
STATE--; }
}
}
{
if (STATE == MAXcar) {
digitalWrite(Red, HIGH);
}
}
else{
digitalWrite(Red, LOW);
}
}

nella dichiarazione dichiari il pin redlight
ma per come hai messo il codice deve essre solo red:

pinMode(Red, OUTPUT);
//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 COUNTER = 0                                   //Numero auto iniziali

 
//Setup  
void setup()
{
 //define tipology of pin
  pinMode(IncresePin, INPUT);                    
  pinMode(DecresePin, INPUT);
  pinMode(Red, OUTPUT);
}

void loop(){
   if(COUNTER<maxCAR)
   {
         if(IncresePin==1)
         {COUTER++;}

         if(DecresePin==1)
         {COUNTER--;}
    }

    else
    {
    digitalWrite(Red, HIGH);
    }

}

prova cosi , e un codice buttato giu al momento ma dovrebbe andare bene.

Ciao Camba non me lo fà compilare il tuo codice mi da un errore unqualified-id... :frowning:

Ho riscritto il codice.

//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);
   

}

Grazie Matteo

Il codice si è compilato :slight_smile: testo il tutto e Vi faccio sapere :slight_smile:

giusto nella fretta di scriverlo avevo dimenticato i digitalRead xD

Ciao

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

//Setup
void setup()
{
pinMode(IncreasePin, INPUT);
pinMode(DecreasePin, INPUT);
pinMode(Red, OUTPUT);
Serial.begin(9600);
}

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);
Serial.println(COUNTER);

}

prova cosi

//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


//Setup
void setup()
{
 pinMode(IncreasePin, INPUT);
 pinMode(DecreasePin, INPUT);
 pinMode(Red, OUTPUT);
 Serial.begin(9600);
}

void loop(){
 
 if (digitalRead(IncreasePin)==HIGH)
  {COUNTER++;
   while(digitalRead(IncreasePin)==LOW);}
 if (digitalRead(DecreasePin)==HIGH)
  {COUNTER--;
   while(digitalRead(DecreasePin)==LOW);}
   
 while(digitalRead(IncreasePin)==HIGH || digitalRead(DecreasePin)==HIGH);

   
 if(COUNTER>=maxCAR)
  digitalWrite(Red, HIGH);
  Serial.println(COUNTER);
 

}

Ciao,

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!

Ciao Claudio

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? :slight_smile:

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
   }
}

Ciao Claudio non va :)... magari sbaglio collego gli ingressi a resistenze da 2,2K che vanno a massa e do il 5V quando devo incrementare