Problemi con parcheggio automatizzato

Salve sono un ragazzo al quinto anno di elettronica e all'esame vorrei portare un piccolo parcheggio automatizzato tramite arduino. Ammetto che non ne capisco molto di programmazione. Il mio progetto è formato da un display 7 segmenti, diodi laser e fotoresistenze che funzionano da sensore per far aprire e chiudere le 2 sbarre sostenute dai 2 servomotori. Il mio intento e quello di contare le auto (fino a 9) per poi non far aprire più la sbarra dell'ingresso. Il problema sta nel fatto che non so come far incrementare il numero dei posti auto in quanto nel seguente codice se io mi fermo davanti ai sensori il numero dei posti sale sempre. Come posso correggere questo codice?

#include <Servo.h>
 
Servo serIN;
Servo serOUT;
 
const int a=5;  
const int b=4;  
const int c=3;  
const int d=2;  
const int e=1;  
const int f=6;  
const int g=7;
int LedV=13;
int LedR=12;
int posti_auto;
int sen4;
int sen3;
int sen2;
int sen1;

void LedAcceso(int n){  
  switch(n)  
  {  
  case 0:  
    digitalWrite(a, HIGH);  
    digitalWrite(b, HIGH);  
    digitalWrite(c, HIGH);  
    digitalWrite(d, HIGH);  
    digitalWrite(e, HIGH);  
    digitalWrite(f, HIGH);  
    digitalWrite(g, LOW);  
    break;  
 
  case 1:  
    digitalWrite(a, LOW);  
    digitalWrite(b, HIGH);  
    digitalWrite(c, HIGH);  
    digitalWrite(d, LOW);  
    digitalWrite(e, LOW);  
    digitalWrite(f, LOW);  
    digitalWrite(g, LOW);  
    break;  
 
  case 2:  
    digitalWrite(a, HIGH);  
    digitalWrite(b, HIGH);  
    digitalWrite(c, LOW);  
    digitalWrite(d, HIGH);  
    digitalWrite(e, HIGH);  
    digitalWrite(f, LOW);  
    digitalWrite(g, HIGH);  
    break;  
  case 3:  
    digitalWrite(a, HIGH);  
    digitalWrite(b, HIGH);  
    digitalWrite(c, HIGH);  
    digitalWrite(d, HIGH);  
    digitalWrite(e, LOW);  
    digitalWrite(f, LOW);  
    digitalWrite(g, HIGH);  
    break;  
 
  case 4:  
    digitalWrite(a, LOW);  
    digitalWrite(b, HIGH);  
    digitalWrite(c, HIGH);  
    digitalWrite(d, LOW);  
    digitalWrite(e, LOW);  
    digitalWrite(f, HIGH);  
    digitalWrite(g, HIGH);  
    break;  
 
  case 5:  
    digitalWrite(a, HIGH);  
    digitalWrite(b, LOW);  
    digitalWrite(c, HIGH);  
    digitalWrite(d, HIGH);  
    digitalWrite(e, LOW);  
    digitalWrite(f, HIGH);  
    digitalWrite(g, HIGH);  
    break;  
 
  case 6:  
    digitalWrite(a, HIGH);  
    digitalWrite(b, LOW);  
    digitalWrite(c, HIGH);  
    digitalWrite(d, HIGH);  
    digitalWrite(e, HIGH);  
    digitalWrite(f, HIGH);  
    digitalWrite(g, HIGH);  
    break;  
 
  case 7:  
    digitalWrite(a, HIGH);  
    digitalWrite(b, HIGH);  
    digitalWrite(c, HIGH);  
    digitalWrite(d, LOW);  
    digitalWrite(e, LOW);  
    digitalWrite(f, LOW);  
    digitalWrite(g, LOW);  
    break;  
 
  case 8:  
    digitalWrite(a, HIGH);  
    digitalWrite(b, HIGH);  
    digitalWrite(c, HIGH);  
    digitalWrite(d, HIGH);  
    digitalWrite(e, HIGH);  
    digitalWrite(f, HIGH);  
    digitalWrite(g, HIGH);  
    break;  
 
  case 9:  
    digitalWrite(a, HIGH);  
    digitalWrite(b, HIGH);  
    digitalWrite(c, HIGH);  
    digitalWrite(d, HIGH);  
    digitalWrite(e, LOW);  
    digitalWrite(f, HIGH);  
    digitalWrite(g, HIGH);  
    break;  
  }  
};  

void setup()  
{  
  serIN.attach(10);
  serOUT.attach(11);
  pinMode(a, OUTPUT);   
  pinMode(b, OUTPUT);   
  pinMode(c, OUTPUT);   
  pinMode(d, OUTPUT);   
  pinMode(e, OUTPUT);   
  pinMode(f, OUTPUT);   
  pinMode(g, OUTPUT);  
  pinMode(LedV, OUTPUT);   
  pinMode(LedR, OUTPUT);
  serIN.write(140);
  serOUT.write(140);
}  
  
void loop ()  {
  
  int sen4 = analogRead(A5);
  int sen3 = analogRead(A4);
  int sen2 = analogRead(A3);
  int sen1 = analogRead(A2); 
  
  LedAcceso(posti_auto);
  
if(posti_auto < 0){
  posti_auto=0;
}

if(posti_auto < 9){
  digitalWrite(LedR, LOW);  
  digitalWrite(LedV, HIGH); 
if(sen1 < 100){
  delay(100);
  serIN.write(60);
}    
if(sen2 < 50){
  delay(100);
  serIN.write(140);
    posti_auto++;
}  
} else{
  digitalWrite(LedV, LOW);
  digitalWrite(LedR, HIGH);
}
if(sen3 < 20){
  delay(100);
  serOUT.write(60);
}    
if(sen4 < 80){
  delay(100);
  serOUT.write(140);
   posti_auto--; 
}
}

bulldozer95:
Salve

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.
Tu che hai usato? Una tabella ?

Spiega meglio come e cosa hai collegato. Io non ho capito. Come usi le fotoresistenze ? Quante ?

Ho aggiornato il post. Ho aggiunto un immagine del circuito che ho realizzato e spero che cosi si capisce meglio.

se ho capito bene una soluzione potrebbe essere un cambio di stato, qualcosa del genere:

if sensore 1 <di soglia && state==0 //sento l'auto, se condizioni vere entro nell'if
postoAuto ++
..
state =1 //postoAuto aumenta solo di uno perchè portando state =1 la condizione sopra non è più vera

if sensore 1 > di soglia && state==1 //passata l'auto, sensore a riposo, se condizioni vere entro nell'if
state =0 //riporto state a 0, pronto per la prossima auto.......esco dall'if perchè condizione non più vera

per l'if dell'uscita cambia nome state in state2

Ciao,

qui c'è un progetto uguale a quello che vuoi realizzare tu, dagli uno sguardo e vedi se ti chiarisce le idee su come procedere.

Attilio

camperos:
se ho capito bene una soluzione potrebbe essere un cambio di stato, qualcosa del genere:

if sensore 1 <di soglia && state==0 //sento l'auto, se condizioni vere entro nell'if
postoAuto ++
..
state =1 //postoAuto aumenta solo di uno perchè portando state =1 la condizione sopra non è più vera

if sensore 1 > di soglia && state==1 //passata l'auto, sensore a riposo, se condizioni vere entro nell'if
state =0 //riporto state a 0, pronto per la prossima auto.......esco dall'if perchè condizione non più vera

per l'if dell'uscita cambia nome state in state2

Grazie Camperos ho risolto come hai detto tu infatti ora col nuovo codice va alla perfezione:

#include <Servo.h>

Servo serIN;
Servo serOUT;

const int a=5;  
const int b=4;  
const int c=3;  
const int d=2;  
const int e=1;  
const int f=6;  
const int g=7;
int LedV=13;
int LedR=12;
int posti_auto=0;
int ingresso=0;
int uscita=0;
int sen4;
int sen3;
int sen2;
int sen1;

void Display (int led){  
 switch(led){
  
   case 0:  
     digitalWrite(a, HIGH);  
     digitalWrite(b, HIGH);  
     digitalWrite(c, HIGH);  
     digitalWrite(d, HIGH);  
     digitalWrite(e, HIGH);  
     digitalWrite(f, HIGH);  
     digitalWrite(g, LOW);  
     break;  

   case 1:  
     digitalWrite(a, LOW);  
     digitalWrite(b, HIGH);  
     digitalWrite(c, HIGH);  
     digitalWrite(d, LOW);  
     digitalWrite(e, LOW);  
     digitalWrite(f, LOW);  
     digitalWrite(g, LOW);  
     break;  

   case 2:  
     digitalWrite(a, HIGH);  
     digitalWrite(b, HIGH);  
     digitalWrite(c, LOW);  
     digitalWrite(d, HIGH);  
     digitalWrite(e, HIGH);  
     digitalWrite(f, LOW);  
     digitalWrite(g, HIGH);  
     break;  
   case 3:  
     digitalWrite(a, HIGH);  
     digitalWrite(b, HIGH);  
     digitalWrite(c, HIGH);  
     digitalWrite(d, HIGH);  
     digitalWrite(e, LOW);  
     digitalWrite(f, LOW);  
     digitalWrite(g, HIGH);  
     break;  

   case 4:  
     digitalWrite(a, LOW);  
     digitalWrite(b, HIGH);  
     digitalWrite(c, HIGH);  
     digitalWrite(d, LOW);  
     digitalWrite(e, LOW);  
     digitalWrite(f, HIGH);  
     digitalWrite(g, HIGH);  
     break;  

   case 5:  
     digitalWrite(a, HIGH);  
     digitalWrite(b, LOW);  
     digitalWrite(c, HIGH);  
     digitalWrite(d, HIGH);  
     digitalWrite(e, LOW);  
     digitalWrite(f, HIGH);  
     digitalWrite(g, HIGH);  
     break;  

   case 6:  
     digitalWrite(a, HIGH);  
     digitalWrite(b, LOW);  
     digitalWrite(c, HIGH);  
     digitalWrite(d, HIGH);  
     digitalWrite(e, HIGH);  
     digitalWrite(f, HIGH);  
     digitalWrite(g, HIGH);  
     break;  

   case 7:  
     digitalWrite(a, HIGH);  
     digitalWrite(b, HIGH);  
     digitalWrite(c, HIGH);  
     digitalWrite(d, LOW);  
     digitalWrite(e, LOW);  
     digitalWrite(f, LOW);  
     digitalWrite(g, LOW);  
     break;  

   case 8:  
     digitalWrite(a, HIGH);  
     digitalWrite(b, HIGH);  
     digitalWrite(c, HIGH);  
     digitalWrite(d, HIGH);  
     digitalWrite(e, HIGH);  
     digitalWrite(f, HIGH);  
     digitalWrite(g, HIGH);  
     break;  

   case 9:  
     digitalWrite(a, HIGH);  
     digitalWrite(b, HIGH);  
     digitalWrite(c, HIGH);  
     digitalWrite(d, HIGH);  
     digitalWrite(e, LOW);  
     digitalWrite(f, HIGH);  
     digitalWrite(g, HIGH);  
     break;  
 }  
};  

void setup(){  

 serIN.attach(10);
 serOUT.attach(11);
 pinMode(a, OUTPUT);  
 pinMode(b, OUTPUT);  
 pinMode(c, OUTPUT);  
 pinMode(d, OUTPUT);  
 pinMode(e, OUTPUT);  
 pinMode(f, OUTPUT);  
 pinMode(g, OUTPUT);  
 pinMode(LedV, OUTPUT);  
 pinMode(LedR, OUTPUT);
 serIN.write(140);
 serOUT.write(140);
}  

void loop (){

 int sen4 = analogRead(A5);
 int sen3 = analogRead(A4);
 int sen2 = analogRead(A3);
 int sen1 = analogRead(A2);

 Display(posti_auto);

 if(posti_auto < 9){
   digitalWrite(LedR, LOW);  
   digitalWrite(LedV, HIGH);
   if(sen1 < 100){
     delay(100);
     serIN.write(60);
     ingresso=1;  
     }
   if((sen2 < 10) && (ingresso == 1)){
     delay(100);
     serIN.write(140);
     posti_auto++;
     ingresso=0;
   }
 }
 else{
   digitalWrite(LedV, LOW);
   digitalWrite(LedR, HIGH);
 }
 if(posti_auto > 0){
   if(sen3 < 15){
     delay(100);
     serOUT.write(60);
     uscita=1;
   }
   if((sen4 < 100) && (uscita == 1)){
     delay(100);
     serOUT.write(140);
     posti_auto--;
     uscita=0;
   }      
 }
}

dato che sei al quinto anno penso conoscerai bene gli integrati BCD, forse sarebbe meglio usarlo!
Uno fai piu figura, due diminuisci la complessità di gestione del display 7 segmenti, tre riduci il numero dei pin usati.
Spero migliorerai anche il codice usando nomi di variabili consoni al loro utilizzo e aggiungerai funzioni per aumentare la leggibilità del codice.

guarda un pò cosa ti ho trovato:

const unsigned char LUTBCD[16] = { 0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0,
                                   0xFE, 0xF6, 0xEE, 0x3E, 0x9C, 0x7A, 0x9E, 0x8E};

const unsigned char PIN7SEG[8] = {5,4,3,2,1,6,7,13};

void softBCD(unsigned char n, unsigned char point)
{
	if ( n > 15 ) return;
	unsigned char setled = LUTBCD[n] | ( point & 0x01);
	
	int i;
	for (i = 0; i < 8; ++i)
		digitalWrite(PIN7SEG[i],(setled << i) & 0x80);
}

naturalmente ora per visualizzare un numero basta scrivere:

...
softBDC(9,0);
...