Parcheggio automatico con Arduino

Salve sono uno studente del 5 di un ITIS Serale Ind: Elettronico e per il progetto da portare alla maturità ho pensato di realizzare un parcheggio automatico con un ingresso e un uscita, con sbarre comandate da un servomotore SG90 che si azionano mediante un pulsante sia ingresso che in uscita, in prossimità della sbarra ho pensato di mettere sia in ingresso che in uscita un trasmettitore ir 5mm 940nm e un ricevitore TSOP4838 che mi facessero aumentare/diminuire il contatore dei parcheggi disponibili in entrata/uscita e poi visualizzati su un display a 7 segmenti posto in ingresso vicino a due led uno rosso e uno verde che si dovranno azionare il verde in caso di disponibilità di posti, il rosso nel caso in cui i posti siano terminati...In aggiunta vorrei mettere 4 lampioni con dei led bianchi che si accendono solo quando una fotoresistenza rileva il buio e c'è una macchina almeno nel parcheggio...
Mi servirebbe una mano sulla realizzazione del circuito e qualche delucidazione sullo sketch di programmazione.
Grazie in anticipo e buona Giornata

ciao,

per il circuito QUI trovi tanti esempi utili.

per lo sketch...pubblica qualche cosa di tuo per inziare a ragionare.

Buonasera a tutti,
sto facendo un progetto con arduino uno per il mio esame di maturità .
Il mio progetto è un parcheggio con due pulsanti uno per l’ingresso e uno per l’ uscita che devono comandare l’ apertura( e la chiusura automatica dopo 5 secondi dall’ apertura della sbarra) relativamente la sbarra d’ingresso e quella d’uscita(Servomotore SG90) e contemporanteamente aumentare o diminuire(in caso di ingresso o di uscita) il contatore(un Display a sette segmenti a Anodo comune) e in caso di disponibilità , quindi da 1 a 7 posti lasciare acceso un led verde mentre in caso di posti a 0 quindi esauriti accendere il led rosso .
Ho tirato giu un po di codice ma non so se è corretto , ma il mio problema più grande è scrivere la parte finale dello sketch.
Qualcuno puo aiutarmi :fearful: :fearful: :fearful: :fearful:

Grazie in anticipo

#include <Servo.h>
Servo myservo1;  
Servo myservo2;
#define ServoMexit    11        
#define ServoMenter   10
#define Exit      1         
#define In        0         

#define BarLow    177      
#define BarUp     95        
#define CAPACITY  8         

#define  segA  2
#define  segB  3
#define  segC  4
#define  segD  5
#define  segE  6
#define  segF  7
#define  segG  8

//Array per rappresentare i numeri da 0-8 
byte segments[10] = {
// pgfedcba  <--- segments
 B11000000, // number 0
 B11111001, // number 1
 B10100100, // number 2
 B10110000, // number 3
 B10011001, // number 4
 B10010010, // number 5
 B10000010, // number 6
 B11111000, // number 7
 B10000000, // number 8
};

int a=2;  
int b=3;  
int c=4;  
int d=5;  
int e=6;  
int f=7;  
int g=8;  
int buttonEnter=0;
int buttonExit=1; 
int ledGreen=12;
int ledRed=9;
void setup()  
{  
 myservo1.attach(ServoMexit);         
 myservo2.attach(ServoMenter);
 pinMode(a, OUTPUT);   
 pinMode(b, OUTPUT);   
 pinMode(c, OUTPUT);   
 pinMode(d, OUTPUT);   
 pinMode(e, OUTPUT);   
 pinMode(f, OUTPUT);   
 pinMode(g, OUTPUT);  
 pinMode(buttonEnter, INPUT);
 pinMode(buttonExit, INPUT);
 pinMode(ledGreen, OUTPUT);
 pinMode(ledRed, OUTPUT);
 myservo1.write(BarLow);
 myservo2.write(BarLow);

ciao,

in primis ti consiglio di racchiudere lo sketch, quando lo posti, tra i tag code (pulsante </> sopra le faccine); secondo sei arrivato a scrivere il setup()…ma non l’hai chiuso ( manca la }).

per terzo…prova scrivere un po’ tu il loop()…postalo…poi ti aiutiamo a correggerlo/migliorarlo.

>Val9595: DUE cose …

1. ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post #2 (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

2. NON aprire più thread per lo stesso argomento, indifferentemente se prima parli di HW e poi parli di SW … sempre dello stesso progetto stai parlando e quindi tutto nello stesso thread, grazie.

Guglielmo

P.S.: Ho riunito io i tuoi due thread accodandoli uno dopo l’altro ed ho modificato il titolo del primo post così da comprendere il tutto.

Grazie per i consigli e scusatemi per i miei errori.
Questo è il mio void loop :

void loop(){
   
Display(Available);
   if( SensorIn() == 0 )
   {
      if(Available != 0){
         Available--;
         myservo1.write(BarUp);
         delay(4000);
         myservo1.write(BarLow);
      }
   }
   if(digitalRead(Exit)==0)
   {
      if(Available != CAPACITY){
         Available++;
         myservo2.write(BarUp);
         delay(4000);
         myservo2.write(BarLow);
      }
   }
}

... ok, ma fai quanto ti ho chiaramente descritto al punto 1. del mio post #4

Guglielmo

ciao...

cos'è Display(Available); ?

Salve ho cambiato il programma ora funziona… premendo un tasto in ingresso alza la sbarra e diminuisce i posti disponibili e premendo il pulsante d’uscita si apre la sbarra e aumenta i posti disponibili. mi il problema è che ho messo un condizione IF/ELSE per accendere il led verde e rosso ma (il led verde deve essere acceso quando ci sono posti disponibili e il led rosso quando sono terminati i posti )arrivato a 0 posti disponibili il rosso si accende ma rimane acceso anche il verde cosa ho sbagliato ?
Grazie ancora a preso

#include <Servo.h>
Servo myservo; 
#define ServoM 11 
#define Exit 9 
#define In 10 
#define BarLow 177 
#define BarUp 95 
#define CAPACITY 9 

#define segA 2
#define segB 3
#define segC 4
#define segD 5
#define segE 6
#define segF 7
#define segG 8
#define ledgreen 0
#define ledred 1
int SensorIn(void);     

//Array with the segments to represent the decimal numbers (0-9).
byte segments[10] = {
// pgfedcba <--- segments
   B00111111, // number 0
   B00000110, // number 1
   B01011011, // number 2
   B01001111, // number 3
   B01100110, // number 4
   B01101101, // number 5
   B01111101, // number 6
   B00000111, // number 7
   B01111111, // number 8
   B01101111  // number 9
};

void setup(){
   myservo.attach(ServoM); 

   pinMode(Exit, INPUT); 
   pinMode(In, INPUT); 

   digitalWrite(Exit, HIGH); 
   digitalWrite(In, HIGH); 
   pinMode(segA,OUTPUT);
   pinMode(segB,OUTPUT);
   pinMode(segC,OUTPUT);
   pinMode(segD,OUTPUT);
   pinMode(segE,OUTPUT);
   pinMode(segF,OUTPUT);
   pinMode(segG,OUTPUT);

   pinMode(ledgreen,OUTPUT);
   pinMode(ledred,OUTPUT);
   
      myservo.write(BarLow);
// delay(1000);
}
int Available= 9; 
//================================================================
void loop(){
   if( SensorIn() == 0 )
   {
      if(Available != 0){
         Available--;
         myservo.write(BarUp);
         delay(3000);
         myservo.write(BarLow);
      }
   }
   if(digitalRead(Exit)==0)
   {
      if(Available != CAPACITY){
         Available++;
         myservo.write(BarUp);
         delay(3000);
         myservo.write(BarLow);
      }
   }
if(Available != 0) 
{
  digitalWrite(ledred,LOW);
  digitalWrite(ledgreen,HIGH);
  
}
else
{
  digitalWrite(ledgreen,LOW);
  digitalWrite(ledred,HIGH);
}




  
}
/*-------------------------------------------------------------------
  Put the segments according to the number.
  --------------------------------------------------------------------*/
void Display(int number){
   byte segs = ~segments[number]; //"~" is used for commom anode.
   digitalWrite(segA, bitRead(segs, 0) );
   digitalWrite(segB, bitRead(segs, 1) );
   digitalWrite(segC, bitRead(segs, 2) );
   digitalWrite(segD, bitRead(segs, 3) );
   digitalWrite(segE, bitRead(segs, 4) );
   digitalWrite(segF, bitRead(segs, 5) );
   digitalWrite(segG, bitRead(segs, 6) );
}



int SensorIn(void){
   return( digitalRead(In) );
}

**>Val9595: ** ancora una volta, nel rispetto del regolamento, punto 7, ti chiedo di editare il tuo post #2 (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Ti informo che, al tuo prossimo post senza aver corretto la cosa, mi verò costretto a prendere provvedimenti !

Guglielmo