Parking controlado por Arduino Uno

Hola, soy nuevo en el foro, tengo un problema con el proyecto que estoy realizando, se trata de un parking, el cual, lo mítico, dispone de 8 plazas,si está vacío el 7 segmentos marca 8 plazas libres y la barrera si alguien quiere entrar se abre, en cuanto ya no quedan plazas la barrera no deja acceder ningún coche hasta que no salga uno.

Pero además de eso, también quiero controlar el encendido de farolas automáticamente cuando se haga de noche, uso un ldr para ello, el problema es que mi programa al ejecutarlo el 7 segmentos no me señaliza bien los números, y si le quito la programación del ldr me los ejecuta bien, ¿alguien me puede echar una mano?

#include <Servo.h>
Servo myservo;  // creamos un objeto servo para controlar el servo

#define ServoM    12        //Pin conectado con el servomotor.
#define Brillo    11        //biblioteca servo, desactiva PWM de los pines 9 y 10.
#define Salida      9         //Pin conectado al botón de salir.
#define Entrada        8         //Pin conectado al botón de entrar.

#define BarCer    177       //posicion barrera cerrada.
#define BarAb     95        //posicion barera abierta.
#define CAPACIDAD  8         //Capacidad del parking (coches).
#define INTEN     80        //Intensidad del display en %.
int valor = 0;  //Variable recibida por el LDR.
int luces = 10; // Pin de salida a LEDS
int analogica = A2; // Pin del LDR 

//Pines conexiones a los segmentos (catodos).
#define  segA  0
#define  segB  1
#define  segC  2
#define  segD  3
#define  segE  4
#define  segF  5
#define  segG  6

//Matriz con los segmentos para representar los numeros decimales del 0 al 8.
byte segments[9] = {
// pgfedcba  <--- segmentos
  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
};

//---------------------------------

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

  pinMode(Salida, INPUT);           
  pinMode(Entrada, INPUT);          
  digitalWrite(Salida, HIGH);       
  digitalWrite(Entrada, HIGH);      
  pinMode(segA,OUTPUT);
  pinMode(segB,OUTPUT);
  pinMode(segC,OUTPUT);
  pinMode(segD,OUTPUT);
  pinMode(segE,OUTPUT);
  pinMode(segF,OUTPUT);
  pinMode(segG,OUTPUT);
  pinMode(Brillo,OUTPUT);
  analogWrite(Brillo,255*INTEN/100);
  myservo.write(BarCer);          //Barrera en la posicion bajada
//  delay(1000);
  Serial.begin(9600); 
  pinMode(luces, OUTPUT);

}

int  Available= 8;                    // Numero de plazas disponibles.

//--------------------------------------------------
void loop(){
Display(Available);
if(digitalRead(Entrada)==0)
{
  if(Available != 0){
    Available--;
    myservo.write(BarAb);
    delay(3000);
    myservo.write(BarCer);
    }
  }
if(digitalRead(Salida)==0)
{
  if(Available != CAPACIDAD){
    Available++;
    myservo.write(BarAb);
    delay(3000);
    myservo.write(BarCer);
    }
  }

  valor = analogRead(analogica); // El valor recibido por el LDR lo guardamos en la vaiable.
  Serial.println(valor); // Valor será mostrado no Serial Monitor, para calibrar el encendido del LED de iluminación
  delay(250); // Pausa de 250 ms.
  
  if (valor < 150) 
  { 
  digitalWrite(luces, HIGH); 
  } else{                       
    digitalWrite(luces, LOW); 
    } 


}

// Ponemos los segmentos de acuerdo al numero de plazas libres.

void Display(int number){
byte segs =  ~segments[number];        //"~" se usa para el anodo comun.

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

solucionado el problema gracias a surbyte por su ayuda, os dejo el video de mi proyecto final de ciclo que presentaré el lunes.

Este proyecto se me ocurrió ya que tenia que preparar un proyecto final para el ciclo, y dado que los parkings van controlados mediante plcs, controlarlo mediante arduino bajaría los costes por lo que la instalación sería más económica.

Esquema:

Doble Post, cerrar hilo

terminado y listo para exponer, gracias surbyte por tu ayuda

Entonces como norma debes poner tu código resuelto. Es el pago de todo el que consulta y recibe ayuda.
Beneficiar a los demás con tu proyecto para que sirva a la comunidad Arduino.

ok, surbyte, ahí va.

/*Parking proyecto final de ciclo 
 * Javier Monje Alonso
*/

#include <Servo.h>
Servo myservo;  // creamos un objeto servo para controlar el servo

#define ServoM    12         // Pin conectado con el servomotor.
#define Brillo    11         // biblioteca servo, desactiva PWM de los pines 9 y 10.
#define luces     10     // Pin de salida a LEDS
#define Salida     9         // Pin conectado al botón de salir.
#define Entrada    8         // Pin conectado al botón de entrar.
#define rojo     7     // Pin semáforo rojo
#define verde   13       // Pin semáforo verde
#define analogica A2     // Pin del LDR 

#define BarCer    177        // posicion barrera cerrada.
#define BarAb     95         // posicion barera abierta.
#define CAPACIDAD  8         // Capacidad del parking (coches).
#define INTEN     80         // Intensidad del display en %.

int valor     = 0;       // Variable recibida por el LDR.

//Pines conexiones a los segmentos (catodos).
#define  segA  A0
#define  segB  A1
#define  segC  2
#define  segD  3
#define  segE  4
#define  segF  5
#define  segG  6

//Matriz con los segmentos para representar los numeros decimales del 0 al 8.
byte segments[9] = {
// pgfedcba  <--- segmentos
  B00111111, // number 0
  B00000110, // number 1
  B01011011, // number 2
  B01001111, // number 3
  B01100110, // number 4
  B01101101, // number 5
  B01111101, // number 6
  B00000111, // number 7
  B11111111, // number 8
};

//---------------------------------

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

  pinMode(Salida,  INPUT_PULLUP);           
  pinMode(Entrada, INPUT_PULLUP);          
  digitalWrite(Salida, HIGH);       
  digitalWrite(Entrada, HIGH);      
  pinMode(segA,OUTPUT);
  pinMode(segB,OUTPUT);
  pinMode(segC,OUTPUT);
  pinMode(segD,OUTPUT);
  pinMode(segE,OUTPUT);
  pinMode(segF,OUTPUT);
  pinMode(segG,OUTPUT);
  pinMode(Brillo,OUTPUT);
  myservo.write(BarCer);          //Barrera en la posicion bajada
//  delay(1000);
  Serial.begin(9600); 
  pinMode(luces, OUTPUT);

}

int  Available= 8;                    // Numero de plazas disponibles.

//--------------------------------------------------
void loop(){
  Display(Available);
  
  
  if (!digitalRead(Entrada)) {
    Serial.println("Entrada");
    if(Available != 0){
        Available--;
        Serial.println(Available);
        myservo.write(BarAb);
        delay(3000);
        myservo.write(BarCer);
    }
  }
  
  if (!digitalRead(Salida)) {
    Serial.println("Salida");
      if (Available != CAPACIDAD) {
        Available++;
        Serial.println(Available);        
        myservo.write(BarAb);
        delay(3000);
        myservo.write(BarCer);
      }
  }

  valor = analogRead(analogica); // El valor recibido por el LDR lo guardamos en la vaiable.
  //.println(valor); // Valor será mostrado no Serial Monitor, para calibrar el encendido del LED de iluminación
  delay(250); // Pausa de 250 ms.
    
  if (valor < 150)  { 
      digitalWrite(luces, HIGH); 
  } else{                       
      digitalWrite(luces, LOW); 
  } 
}

// Ponemos los segmentos de acuerdo al numero de plazas libres.

void Display(int number){
  byte segs =  segments[number];        //"~" se usa para el anodo comun.

  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) );
}
1 Like

Esto es un proyecto, bien pudiste explicar algo para el novato que llega y quiere hacer algo similar..
Expone como lo pensaste, cuales son las entradas, cuales las salidas, donde ves cada auto estacionado.
Etc etc..
Asi no se entiende mas que un código que no le servirá nada mas que a alguien con mediana experiencia.
Este es el foro proyectos. El foro proyectos exige un poco mas. No es para plantear algo y me voy. Es para exponer algo mientras resuelvo mis dudas o problemas.

Asi que te dejo esa tarea para beneficio de los demás.

Hola soy nuevo en este forum y me gustaria preguntaros como hacer el parking ya que tengo que hacer un proyecto y me gustaria hacerlo del parking controlado con arduino. Me gustaría hacerlo con sensores ultrasonidos con servomotor con leds y sensores que los leds cambien de color cuando hay un coche debajo para expresar que esta ocupada. Si alguien me echa una mano estaría muy agradecido.
Gracias!!

Ahi lo tienes resuelto.