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: