// LIBRERIAS
#include <DHT.h> //Librería para usar sensores DHT.
#include <Servo.h> // librería para poder controlar el servo
#include <SoftwareSerial.h> //Libreria Software Serial para Bluetooth, en esta caso usamos el HC-06 que sirve para usarse de Esclavo
#include <Keypad.h> // Librerí para el Keypad.
// PINES ESPECIALES
int DHTPIN = 2; //Se define el pin del DHT.
int trig = 14; // Emisor de pulso o señal.
int eco = 15; // Receptor "del eco" del pulso o señal.
int ESTADO = 0;
int estadoAlarma = 0;
bool alarmaActivada = false; // Variable para rastrear el estado de la alarma.
#define DHTTYPE DHT11 // Se define el tipo de sensor que se usara para medir la temperatura y humedad, en este caso sera el DHT-11
int estadoalarma;
// OBJETOS DE LIBRERIA
SoftwareSerial BT(10, 11);
DHT dht(DHTPIN, DHTTYPE);
Servo ServoPuerta;
Servo ServoGaraje;
//CREACION KEYPAD
int Keyestado = 0; // 0 = Cerrado y 1= Abierto
const byte FILAS = 4; // Define numero de filas
const byte COLUMNAS = 4; // Define numero de columnas
char keys[FILAS][COLUMNAS] = { // define la distribucion d elas teclas
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
byte pinesFilas[FILAS] = { 22, 24, 26, 28 }; // Pines correspondientes a las filas
byte pinesColumnas[COLUMNAS] = { 30, 32, 34, 36 }; // Pines correspondeinetes a las columnas
Keypad teclado = Keypad(makeKeymap(keys), pinesFilas, pinesColumnas, FILAS, COLUMNAS); // Crear teclado
char TECLA; // Almacena la tecla presionada
char CLAVE[5]; // Almacena en un array 4 digitos integrados
char CLAVE_MAESTRA[5] = "0000"; //Almacena en un arraybla contraseña inicial
byte INDICE = 0; //Indice del array
//int pos = 0;
// Bocina o Buzzer
int Buzzer = 16;
// Sensor PIR ()
int PIR = 5;
int LedAlarma = 6;
// SISTEMAS DE LUCES
int Habitacion1 = 9;
int Habitacion2 = 8;
int Habitacion3 = 7;
int Salon = 6;
int Cocina = 5;
int Bano = 4;
int Garaje = 3;
int jardin = 50;
int Pexterior = 53;
int potval;
int potpin = A1;
int dt = 200;
int light;
int lightpin = A2;
int lightval;
int DISTANCIA =0;
long readUltrasonicDistance( int trig, int eco){
pinMode(trig, OUTPUT);
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig, HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
pinMode(eco, INPUT);
return pulseIn(eco, HIGH);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("Listo");
BT.begin(9600);
dht.begin();
ServoPuerta.attach(38); //Se conecta la variable del Servo Garage al pin
ServoGaraje.attach(40); //Se conecta la variable del Servo Garage al pin
//limpia();
pinMode(A3, INPUT);
// Se establecen los pnes como entradas o salidas(PRODUCCION)
// Entradas(PRODUCCION)
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
pinMode(trig, OUTPUT);
pinMode(jardin, OUTPUT);
// pinMode(, OUTPUT);
// Salidas()
pinMode(eco, INPUT);
pinMode(potval, INPUT);
pinMode(PIR, INPUT);
pinMode(lightpin, INPUT);
}
char recepcion;
void loop() {
if (BT.available() > 0) {
recepcion = BT.read();
if (recepcion == 'X') {
alarmaActivada = true;
Serial.println("ACTIVADA ALARMA");
} else if (recepcion == 'Z') {
alarmaActivada = false;
Serial.println("DESACTIVADA ALARMA");
digitalWrite(LedAlarma, LOW);
digitalWrite(Buzzer, LOW);
}
// Comprobar el estado del sensor PIR solo si la alarma está activada
if (alarmaActivada) {
if (ESTADO == HIGH) {
//Alarma activada por movimiento detectado
digitalWrite(LedAlarma, HIGH);
digitalWrite(Buzzer, HIGH);
}
}
//---------------------------------- ILUMINACION-------------------------
if (recepcion == '0') {
Serial.println("ENCENDER HABITACION 1");
digitalWrite(Habitacion1, HIGH);
}
if (recepcion == '1') {
Serial.println("APAGAR HABIRACION 1");
digitalWrite(Habitacion1, LOW);
}
if (recepcion == '2') {
Serial.println("ENCENDER HABITACION 2");
digitalWrite(Habitacion2, HIGH);
}
if (recepcion == '3') {
Serial.println("APAGAR HABITACION 2");
digitalWrite(Habitacion2, LOW);
}
if (recepcion == '4') {
Serial.println("ENCENDER HABITACION 3");
digitalWrite(Habitacion3, HIGH);
}
if (recepcion == '5') {
Serial.println("APAGAR HABITACION 3");
digitalWrite(Habitacion3, LOW);
}
if (recepcion == '6') {
Serial.println("ENCENDER GAREJE");
digitalWrite(Garaje, HIGH);
}
if (recepcion == '7') {
Serial.println("APAGAR GARAJE");
digitalWrite(Garaje, LOW);
}
if (recepcion == '8') {
Serial.println("ENCENDER SALON");
digitalWrite(Salon, HIGH);
}
if (recepcion == '9') {
Serial.println("APAGAR SALON");
digitalWrite(Salon, LOW);
}
if (recepcion == 'U') {
Serial.println("ENCENDER BAÑO");
digitalWrite(Bano, HIGH);
}
if (recepcion == 'T') {
Serial.println("APAGAR BAÑO");
digitalWrite(Bano, LOW);
}
if (recepcion == 'W') {
Serial.println("ENCENDER COCINA");
digitalWrite(Cocina, HIGH);
}
if (recepcion == 'P') {
Serial.println("APAGAR COCINA");
digitalWrite(Cocina, LOW);
}
//-----------------------PUERTAS DE LA CASA ------------------------------
if (recepcion == 'A') {
Serial.println("ABRIR PUERTA PRINCIPAL");
ServoPuerta.write(90);
}
if (recepcion == 'B') {
Serial.println("CERRAR PUERTA PRINCIPAL");
ServoPuerta.write(90);
}
if (recepcion == 'F') {
Serial.println("ABRIR PUERTA GARAJE");
ServoGaraje.write(90);
}
if (recepcion == 'E') {
Serial.println("CERRAR PUERTA GARAJE");
ServoGaraje.write(90);
}
//-------------------------- DIMERS--------------------
map(9, 0, 255, 0, 1023);
if (recepcion == 's') { // Dimer 1 conectado al pin 5
analogWrite(9, 0);
}
if (recepcion == 't') {
analogWrite(9, 0);
}
if (recepcion == 'u') {
analogWrite(9, 75);
}
if (recepcion == 'v') {
analogWrite(9, 105);
}
if (recepcion == 'w') {
analogWrite(9, 140);
}
if (recepcion == 'x') {
analogWrite(9, 175);
}
if (recepcion == 'y') {
analogWrite(9, 210);
}
if (recepcion == 'z') {
analogWrite(9, 255);
}
//-------------------------------------------------------------
/*if(estado=='1'){ // Dimer 2 conectado al pin 3
analogWrite(3,0);
}
if(estado=='2'){
analogWrite(3,35);
}
if(estado=='3'){
analogWrite(3,70);
}
if(estado=='4'){
analogWrite(3,105);
}
if(estado=='5'){
analogWrite(3,140);
}
if(estado=='6'){
analogWrite(3,175);
}
if(estado=='7'){
analogWrite(3,210);
}
if(estado=='8'){
analogWrite(3,255);
}
*/
// --------------------------VIZUALIZACION TEMPERATURA-----------------------
delay(1000);
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
return;
}
Serial.print(t);
Serial.print(";");
Serial.print(h);
Serial.print(";");
BT.print(t);
BT.print(";");
BT.print(h);
BT.print(";");
}
if (Serial.available()) {
BT.write(Serial.read());
}
// -------------------(Control intensidad de las luces manual)------------------
potval = analogRead(A1);
Serial.println(potval);
Serial.println(light);
light = map(potval, 0, 1023, 0, 255);
analogWrite(9, light);
delay(dt);
------------------------- porton exterior y foco------------------------
lightval = analogRead(lightpin);
Serial.println(lightval);
//delay(dt);
DISTANCIA = 0.01723 * readUltrasonicDistance( trig, eco);
if(lightval > 700){
digitalWrite(jardin, 1);
//Serial.println(DISTANCIA);
if (DISTANCIA < 20) {
Serial.println(DISTANCIA);
digitalWrite(Pexterior, HIGH);
}
else {
digitalWrite(Pexterior, LOW);
}
delay(10);
}
if(lightval <650){
digitalWrite(jardin, 0);
}
// KEYPAD--------------------------------------------------
TECLA = teclado.getKey(); // Obtiene tecla presionada. y asigna a variable
Serial.println(TECLA);
if (TECLA) //Comprueba que se haya presioando una tecla
{
CLAVE[INDICE] = TECLA; // Almacena en un array la tecla presioanda
INDICE++;
Serial.println(CLAVE); // Incrementa indice en uno
}
if (INDICE == 4) {
if (strcmp(CLAVE_MAESTRA, CLAVE) == 0) // Compara clave ingresado con clave maestro
{
abierto();
} // Subproceso funcion Abierto
else
error();
{ // Subproceso Funcion Error
INDICE = 0;
}
}
if (Keyestado == 1 && (digitalRead(A3) == 0)) // Si esta abierta y se pulsa boton Nueva clave
nueva_clave();
}
void error() {
Serial.print("ERROR DE CLAVE");
limpia();
}
void abierto() {
if (Keyestado == 0) {
Keyestado = 1;
Serial.print("PUERTA ABIERTA"); // Se vizualiza en el monitor serie
ServoPuerta.write(30); // Gira el servo a 30 grados
} else {
Keyestado = 2;
Serial.print("PUERTA CERRADA"); // Se vizualiza en el monitor serie
ServoPuerta.write(150); // Gira el servo a 150 cerrada
Keyestado = 0;
}
limpia();
}
void nueva_clave() {
Serial.print("NUEVA CLAVE");
INDICE = 0;
while (INDICE <= 3) {
TECLA = teclado.getKey();
if (TECLA)
{
CLAVE_MAESTRA[INDICE] = TECLA;
CLAVE[INDICE] = TECLA;
INDICE++;
Serial.println(TECLA);
}
}
Keyestado = 0;
Serial.println("CLAVE CAMBIADA");
delay(2000);
limpia();
}
void limpia() {
Serial.print("CLAVE");}
Me explico.
Este codigo consta de dos partes, la primera parte fue creada para poder ser controlada por una app creada gracias a Appinventor mientras el resto sirve medinate automatismos. La cosa es que los sensores funcionan perfectamente de forma individual pero al trabajar juntos surgen errores.
Los sensores utilizados son un pir, un ldr, un sensor dth11 y un sensor de ultrasonido.
1 El pir funciona mediante la app al pulsar un boton envia una determinada letra que hace que el sensor empiece a leer, una vez este detecta movimineto un led se enciende y si no pues no pasa nada, tambien esta el boton de apagarlo de forma defnitiva(como mencione antes este sensor funciona bien de forma aislada).
2 Despues esta la parte del ldr y el sensor ultrasonico. Al bajar la intencidad de la luz se enciende un led debidoal ldr y si te acercas al sensor de ultrasonido mientras la luz esta baja este enciende otro led.Para que se entienda el ldr representaria a la luces de un jardin y el sensor de ultrasindo a la luz de un porton que solo se enciende cuando es de noche y detecta personas en un rango aproximado.
No se como hacer que funcionen todos de forma simultanea y que no se interrumpan cada uno de ellos, soy consiente que delay no es la solucion y no se si millis solucionaria el problema, si es asi, por favor, me gustaria saber como aplicarlo.
Por convención, los nombres de las variables se escriben con minúsculas.
—-
Esta instrucción está de más e interfiere con Serial. Hay que borrarla
—-
Esta instrucción no hace nada. Hay que borrarla:
—-
OUTPUT son salidas, no entradas
—-
INPUT son entradas, no salidas
—-
¿Hay alguna instrucción que cambie el valor de la variable ESTADO?
—-
Esto no tiene mucho sentido:
—-
Finalmente, antes de hacer cambios reales al programa cambia tus secuencias de If por switch…case
Esto limpiará un poco el código y lo hará más fácil de entender. Entonces moveremos algunas instrucciones a funciones que lo simplificarán todavía más y la solución saltará a la vista.
Definir un pin analógico como entrada lo pone en modo digital, aunque al hacer la lectura analógica se cambiará de modo durante dicha lectura, es agregar trabajo innecesario al micro.
Es innecesaria esta sentencia, de todos modos lo correcto sería
pinMode(potpin, INPUT);
ya que potpin define cual es el pin conectado al potenciómetro (A1) y potval es la variable que guarda el valor leído en el pin A1.
Debe haber sido un error de dedo, como decimos acá.
Cuando se ejecuta esa instrucción, potVal vale 0 y esto define el pin 0 como INPUT. Como más tarde utiliza Serial, aquí habría un conflicto.
Seguramente quería decir
pinMode(potPin, INPUT);
Lo cual, como bien dices, es innecesario si se va a usar analogRead()
Sí, pero un error de dedos que hace que parte del programa no se ejecute como debe entonces deja de ser un error menor.
![]()
if (recepcion == 'A') {
Serial.println("ABRIR PUERTA PRINCIPAL");
ServoPuerta.write(90);
}
if (recepcion == 'B') {
Serial.println("CERRAR PUERTA PRINCIPAL");
ServoPuerta.write(90);
}
if (recepcion == 'F') {
Serial.println("ABRIR PUERTA GARAJE");
ServoGaraje.write(90);
}
if (recepcion == 'E') {
Serial.println("CERRAR PUERTA GARAJE");
ServoGaraje.write(90);}
Como puse cree una app en appinventor y eso quiere decir que cada vez que envíe una letra entrara en esa condición y por lo tanto realizara la acción corres pondiente.
lightval = analogRead(lightpin);
Serial.println(lightval);
//delay(dt);
DISTANCIA = 0.01723 * readUltrasonicDistance( trig, eco);
if(lightval > 700){
digitalWrite(jardin, 1);
//Serial.println(DISTANCIA);
if (DISTANCIA < 20) {
Serial.println(DISTANCIA);
digitalWrite(Pexterior, HIGH);
}
else {
digitalWrite(Pexterior, LOW);
}
delay(10);
}
if(lightval <650){
digitalWrite(jardin, 0);
}
Los servos siempre se mueven a 90°. O sea, no se mueven de ahí.
¿Error de copy/paste?
Esta parte del programa simula las luces del jardín que se encienden al llegar la noche, al sensor fotoeléctrico detectar poca luz enciende su led como se puede apreciar, el sensor ultrasónico que simula un foco de un portón que se enciende solo si es de noche y si alguien esta a menos de 20, que pasa ? pues que las dos luces se me encienden sin yo nisiquera estar a menos de 20 cuando sole se me tendria que iluminar una ya que solo se cumple una condición y no las dos.
JAJAJAJJAJAJ, si , un error al copiar y pegar. Podrías ponerme un ejemplo rápidos de switch... case para poder hacer los cambios pertinentes ?
switch (recepción) {
case ‘X')
alarmaActivada = true;
Serial.println("ACTIVADA ALARMA");
if (ESTADO == HIGH) { //Alarma activada por movimiento detectado
digitalWrite(LedAlarma, HIGH);
digitalWrite(Buzzer, HIGH);
break;
case ‘Z’:
alarmaActivada = false;
Serial.println("DESACTIVADA ALARMA");
digitalWrite(LedAlarma, LOW);
digitalWrite(Buzzer, LOW);
break;
case ‘0':
Serial.println("ENCENDER HABITACION 1");
digitalWrite(Habitacion1, HIGH);
break;
case '1':
Serial.println("APAGAR HABIRACION 1");
digitalWrite(Habitacion1, LOW);
break;
case '2':
Serial.println("ENCENDER HABITACION 2");
digitalWrite(Habitacion2, HIGH);
break;
case '3':
Serial.println("APAGAR HABITACION 2");
digitalWrite(Habitacion2, LOW);
break;
…etc
}
Trabajando desde el celular, es lento y no puedo compilar ni probar programas.
En general, mi estilo es usar códigos cortos, donde se pueda entender qué se hace, no cómo se hace. Los cómos se envían a funciones, a donde van a dar los detalles.
Más adelante creamos algunas funciones para eso.
El punto es que si un programa es difícil de entender, es más difícil de modificar y de depurar.
Simple is beautiful…
#include <SoftwareSerial.h>
SoftwareSerial BT(10,11);
int PIR = 46;
int LedAlarma =53;
int alarmaActivada;
int recepcion;
int ESTADO;
int Habitacion1 = 9;
int Habitacion2 = 8;
int Habitacion3 = 7;
int Salon = 6;
int Cocina = 5;
int Bano = 4;
int Garaje = 3;
void setup() {
Serial.begin(9600);
pinMode(LedAlarma, OUTPUT);
pinMode(PIR, INPUT);
BT.begin(9600);
}
void loop() {
if (BT.available() > 0) {
switch (recepción) {
case 'X'
alarmaActivada = true;
Serial.println("ACTIVADA ALARMA");
if (ESTADO == HIGH) { //Alarma activada por movimiento detectado
digitalWrite(LedAlarma, HIGH);}
//digitalWrite(Buzzer, HIGH);
break;
case 'Z':
alarmaActivada = false;
Serial.println("DESACTIVADA ALARMA");
digitalWrite(LedAlarma, LOW);
//digitalWrite(Buzzer, LOW);
break;
case '0':
Serial.println("ENCENDER HABITACION 1");
digitalWrite(Habitacion1, HIGH);
break;
case '1':
Serial.println("APAGAR HABIRACION 1");
digitalWrite(Habitacion1, LOW);
break;
case '2':
Serial.println("ENCENDER HABITACION 2");
digitalWrite(Habitacion2, HIGH);
break;
case '3':
Serial.println("APAGAR HABITACION 2");
digitalWrite(Habitacion2, LOW);
break;
}}}
me da este error ->Compilation error: stray '\303' in program
los errores los tengo en el sweitch y en alarmaActicada = true
cuando hables de un error copia el error y lo pegas como código incluyendo la línea en la que ocurre dicho error.
Ese error se debe a que alguien tomó codigo de una página web y arrastró un caracter no permitido para el compilador.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.