Buenas Compañeros,
Estoy haciendo un trabajo de simulación de un área de museografia para un curso el cual trata de :
-
Encender 6 LEDs a través de botones ON/OF y ENCENDER TODOS/APAGAR TODOS(a través de Ethernet)
-
Encender 6 LEDs con el sensor PIR(Se enciendan de forma secuencial cuando detecte movimiento)
-
Encender 6 LEDs con el sensor LDR(Se enciendan de forma secuencial cuando detecte oscuridad)
-
A través de Appinventor controlar los los 6 LEDs en cuanto encendido y apagado , ademas de activar y desactivar los sensores(luz y movimiento) para demostrar la simulación coherente y por defecto no tener conflictos con los sensores( se activen sin una orden)
Ahora he logrado hacer las pruebas exitosas por consola de los puntos 1,2,3. Asimismo de completar
con éxito el punto numero 1 y realizar el punto 4(solamente encendido y apagado de los LEDs).
El trabajo final es controlar desde un celular con appinventor los led ademas de activar los sensores para una respectiva simulación en un área de museografia
Los inconvenientes que tengo y les agradecería que me apoyen para despejar dudas u orienten para realizar este trabajo son:
-
Los codigos están separado en 3 sketch / Deseo agregar las funciones de los sensores al sketch del punto 1 y agregarlos al codigo html del mismo.
-
Como podría desactivar y activar los sensores para que no se activen sin una orden/ Deseo activarlos con un boton ON/OFF
-
En AppInventor , como puedo realizar que con un solo botón se pueda encender y apagar un led.
Adjunto los códigos :
Codigo Punto 1 . Encendido LEDs a traves de ethernet
////LIBRERIAS/////////////
#include <SPI.h>
#include <WString.h>
#include <Ethernet.h>
//////VARIABLES////////
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xEE}; // direccion MAC de tu Ethernet
byte ip[] = {192, 168, 1, 177}; // ip que le pones dentro de tu red como fija y configurada en tu router
EthernetServer server(80); // 80 puerto por el accedemos al servidor. Normalmente seria la 80
int dig[] = {4,5,6,7,8,9}; // pines digitales a usar. No uso 0 y 1 que son de transmisin serie
// Tampoco uso el 10,11,12 y 13 ya que los uso para la ethernet
int digTotal = 8; // Numero de pines a usar
int vdig[] = {0,0,0,0,0,0}; // valores iniciales (Tantos como pines usemos)
int pin;
int nivel;
String cad = String(100);
void setup()
{
Ethernet.begin(mac, ip); // inicio la Ethernet
server.begin(); // inicio el servidor
Serial.begin(9600); // inicio el serial monitor
for (int i=0; i < digTotal; i++)
{
pinMode(dig[i], OUTPUT); // inicializo los pines digitales como salida
digitalWrite(dig[i],vdig[i]); // los pongo a nivel bajo LOW=0
}
}
void loop()
{
cad = ""; // inicializo la cad donde almaceno los datos recibidos
EthernetClient cliente = server.available();
if (cliente)
{
while(cliente.connected())
{
if(cliente.available())
{
char c = cliente.read();
cad = cad + c;
Serial.print(c);
if(c == '\n')
{
if (cad.lastIndexOf("dig") > -1) // si la variable cad contiene 'dig' hacer ...
{
pin = pinElegido(cad);
int posicionPin;
for (int i=0; i <digTotal; i++)
{
if (dig[i] == pin)
{
posicionPin = i;
break;
}
}
nivel = nivelElegido(cad);
vdig[posicionPin] = nivel;
Serial.print(pin); // comprobamos que el pin elegido es el correcto
Serial.println(" pin. -- ");
Serial.print(nivel); // comprobamos su nivel 0=LOW y 1=HIGH
Serial.println(" nivel ");
digitalWrite(pin, nivel); // activamos o desactivamos el pin elegido
} // ... hasta aqui 'dig'
if (cad.lastIndexOf("apaga") > -1) // si la variable cad contiene 'apaga' ejecuta
{ // la funcion apagaTodos()
apagaTodos();
}
if (cad.lastIndexOf("encender") > -1) // si cad contiene 'encender' ejecuta
{ // la funcion enciendeTodos()
enciendeTodos();
}
// Comienza la transmision de datos desde el servidor al cliente
cliente.println("HTTP/1.1 200 OK");
cliente.println("Content-Type: text/html");
cliente.println("background:#333");
cliente.println();
for (int i=0; i < digTotal; i++)
{
cliente.print("Cajon ");
cliente.print(dig[i]);
cliente.print(" ");
if (vdig[i]==1)
{
cliente.println("<font color='green'>ON</font>");
cliente.print("<form method=get><input type=hidden name=dig");
cliente.print(dig[i]);
cliente.print(" value=0><input type=submit value=OFF></form>");
}
if (vdig[i]==0)
{
cliente.println("<font color='grey'>apagado</font>");
// cliente.println("<td>");
cliente.print("<form method=get>");
cliente.print("<input type=hidden name=dig");
cliente.print(dig[i]);
cliente.print(" value=1>");
cliente.print("<input type=submit value=ON>");
cliente.print("</form>");
}
}
cliente.print("<form method=get><input type=hidden name=apaga");
cliente.println(" value=1><input type=submit value=APAGA_TODOS></form>");
cliente.println("<form method=get><input type=hidden name=encender");
cliente.println(" value=1><input type=submit value=ENCENDER_TODOS></form>");
cliente.stop();
}
}
}
}
}
////////////// FUNCIONES /////////////////7
// Funcion: Extrae el pin del array cad (contiene la lectura de lo que el cliente devuelve)
int pinElegido(String cad)
{
int pos_dig = cad.lastIndexOf("dig");
int pos_igual = cad.lastIndexOf("=");
char vpin1 = cad.charAt(pos_dig+3);
char vpin2 = cad.charAt(pos_dig+4);
if (vpin2 != '=')
{
vpin1 += vpin2;
}
int pinElegido = vpin1 - 48; //.toInt();
return pinElegido;
}
// Funcion: Extrae en nivel de la cadena cad
int nivelElegido(String cad)
{
int pos_igual = cad.lastIndexOf("=");
char v = cad.charAt(pos_igual+1) - 48;
if (v == 0) return 0;
if (v == 1) return 1;
}
// Funcion para apagar todos los leds al tiempo
void apagaTodos()
{
for (int i=0; i < digTotal; i ++)
{
vdig[i] = 0;
digitalWrite(dig[i], vdig[i]);
}
}
// Funcion para encender todos los leds al tiempo
void enciendeTodos()
{
for (int i=0; i < digTotal; i ++)
{
vdig[i] = 1;
digitalWrite(dig[i], vdig[i]);
}
}
Codigo Punto 2 . Sensor PRI
int valor= analogRead(A0);
#define SENSOR 0
#define LED1 9
#define LED2 8
#define LED3 7
#define LED4 6
#define LED5 5
#define LED6 4
int var1= 200;
int var2= 300;
int var3= 400;
int var4= 480;
int var5= 550;
int var6=600;
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly: (valor> var6){
valor = analogRead(SENSOR);
Serial.print(valor);
delay(100);
if (valor> var1){
digitalWrite(LED6,HIGH);
} else{
digitalWrite(LED6,LOW);
delay(SENSOR);
}
if (valor> var2){
digitalWrite(LED5,HIGH);
} else{
digitalWrite(LED5,LOW);
delay(SENSOR);
}
if (valor> var3){
digitalWrite(LED4,HIGH);
} else{
digitalWrite(LED4,LOW);
delay(SENSOR);
}
if (valor> var4){
digitalWrite(LED3,HIGH);
} else{
digitalWrite(LED3,LOW);
delay(SENSOR);
}
if (valor> var5){
digitalWrite(LED2,HIGH);
} else{
digitalWrite(LED2,LOW);
delay(SENSOR);
}
if (valor> var6){
digitalWrite(LED1,HIGH);
} else{
digitalWrite(LED1,LOW);
delay(SENSOR);
}
}