Go Down

Topic: Como hacer que un interruptor (palanca) funcione como pulsador (boton) (Read 1 time) previous topic - next topic

tecnopak

Sep 22, 2017, 12:41 am Last Edit: Sep 22, 2017, 04:06 am by tecnopak Reason: agregar diagrama
Hola, estoy haciendo un proyecto usando un ESP8266  1.0 y un Arduino UNO R3
el programa del ESP funciona perfectamente el encendido y apagado.
cuando recibe la instruccion via remota de un dispositivo android acciona el mecanismo ya sea encender o apagar, pero de igual forma quiero accionarlo manualmente. ahora bien

el modulo esp va con conexion tx y rx cruzados para su comunicacion
lo que se pretende hacer es que el esp accione el relay cuando en el servidor o en android reciba la url correcta (explicada en el codigo)

y que cuando se accione manualmente del apagador mande el comando por tx, rx  al modulo esp y este se accione o se apague.

con arduino probe con un pulsador y si esta HIGH hace la accion para cambiar a LOW.
sin embargo con un pulsador se mantiene HIGH para cambiarlo a LOW pero al estar en constante HIGH por medio del modulo inalambrico no puede ser cambiado a LOW. no se si me explico.



es decir quiero que de ambas formas pueda encender y apagar ya sea con una aplicacion y de forma manual como cuando se usa una compuerta xor



Code: [Select]
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>





const char* ssid = "wifigratis";
const char* password = "Totoro666";

ESP8266WebServer server(80);

const int output1 = 16;
const int output2 = 5;
const int output3 = 4;
const int output4 = 0;
const int output5 = 2;
const int output6 = 14;
const int output7 = 12;
const int output8 = 13;

boolean device1 = false;
boolean device2 = false;
boolean device3 = false;
boolean device4 = false;
boolean device5 = false;
boolean device6 = false;
boolean device7 = false;
boolean device8 = false;

void handleRoot() {
  //digitalWrite(led, 1);
  //server.send(200, "text/plain", "hello from esp8266!");
  //digitalWrite(led, 0);

  String cmd;    
      cmd += "<!DOCTYPE HTML>\r\n";
      cmd += "<html>\r\n";
      //cmd += "<header><title>ESP8266 Webserver</title><h1>\"ESP8266 Web Server Control\"</h1></header>";
      cmd += "<head>";
      cmd += "<meta http-equiv='refresh' content='5'/>";
      cmd += "</head>";
      
      if(device1){
        cmd +=("<br/>Device1  : APAGADO");
      }
      else{
        cmd +=("<br/>Device1  : ENCENDIDO");
      }
      
      if(device2){
        cmd +=("<br/>Device2  : APAGADO");
      }
      else{
        cmd +=("<br/>Device2  : ENCENDIDO");
      }
          
       if(device3){
        cmd +=("<br/>Device3  : APAGADO");
      }
      else{
        cmd +=("<br/>Device3  : ENCENDIDO");
      }
      
      if(device4){
        cmd +=("<br/>Device4  : APAGADO");
      }
      else{
        cmd +=("<br/>Device4  : ENCENDIDO");
      }
      if(device5){
        cmd +=("<br/>Device5  : APAGADO");
      }
      else{
        cmd +=("<br/>Device5  : ENCENDIDO");
      }
      if(device6){
        cmd +=("<br/>Device6  : APAGADO");
      }
      else{
        cmd +=("<br/>Device6  : ENCENDIDO");
      }
      if(device7){
        cmd +=("<br/>Device7  : APAGADO");
      }
      else{
        cmd +=("<br/>Device7  : ENCENDIDO");
      }
      if(device8){
        cmd +=("<br/>Device8  : APAGADO");
      }
      else{
        cmd +=("<br/>Device8  : ENCENDIDO");
      }

          
      cmd += "<html>\r\n";
      server.send(200, "text/html", cmd);
}

void handleNotFound(){
  //digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET)?"GET":"POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i=0; i<server.args(); i++){
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  //digitalWrite(led, 0);
}

void setup(void){
  pinMode(output1, OUTPUT);
  pinMode(output2, OUTPUT);
  pinMode(output3, OUTPUT);
  pinMode(output4, OUTPUT);
  pinMode(output5, OUTPUT);
  pinMode(output6, OUTPUT);
  pinMode(output7, OUTPUT);
  pinMode(output8, OUTPUT);

  digitalWrite(output1, LOW);
  
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  Serial.println("");


  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  //Serial.begin(SSD1306
  Serial.println("  ESP8266");

  Serial.println("Control");
    
  Serial.println("Version 0.1");
 
  delay(2000);

    Serial.println("Connecting");
  

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");

    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
       Serial.println(ssid);  
       Serial.println(WiFi.localIP());
  //Serial.setCursor(0,36);      Serial.println(WiFi.localIP());
  

  

  if (MDNS.begin("esp8266")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);

  server.on("/status1=1", [](){
    server.send(200, "text/plain", "device1 = APAGADO");
    digitalWrite(output1, HIGH);
    device1 = true;
    Serial.println('a');
  });

  server.on("/status1=0", [](){
    server.send(200, "text/plain", "device1 = ENCENDIDO");
    digitalWrite(output1, LOW);
    device1 = false;
    Serial.println('b');
  });
  
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP server started");
}

void loop(void){
  server.handleClient();
  if(Serial.available()>0){
    int datos = Serial.read();
    if(datos == 'a'){
      server.send(200, "text/plain", "device1 = APAGADO");
      digitalWrite(output1, HIGH);
      device1 = true;
      Serial.println("ok"+datos);
    }
    if(datos == 'b'){
      server.send(200, "text/plain", "device1 = ENCENDIDO");
      digitalWrite(output1, LOW);
      device1 = false;
      Serial.println("ok"+datos);
    }
  }
}


ese codigo es del ESP 8266 y en el servidor y en android va perfecto pero quiero combiar arduino el codigo de este es

Code: [Select]

int boton1 = 2;
int foco1 = 0;
int salida = 0;
int estado = 0;
void setup() {
  Serial.begin(115200);
  Serial.println("Hola mundo por tecnopak");
  delay(1000);
  digitalWrite(boton1, INPUT);
}
void loop() {
  //enviar datos

  if (Serial.available() > 0) {
    char datos2 = Serial.read();
    estado = digitalRead(boton1);
    if (datos2 == 'b') {
      foco1 = 0;
      Serial.println("Esta encendido el foco");
      if(estado==HIGH){
        Serial.println("a");
       delay(1000);
      }
    }
    if (datos2 == 'a') {
      foco1 = 1;
      Serial.println("esta apagado el foco");
      if(estado==HIGH){
        Serial.println("b");
        delay(1000);
      }
    }    
  }  
}



el diagrama improvisado que hize es
basicamente el esp controla la conexion y el relay
arduino debe controlar unicamente el interruptor manual que es un switch simple de casa.



StringCGE

Según lo que entiendo.
Quieres tener el mando de por ejemplo un foco(FOCO) desde un dispositivo android (ANDROID) y desde un Pulsador físico en una pared (PULSADOR).

ANDROID, PULSADOR y FOCO los uso como nombres propios de objetos para no repetir constantemente Dispositivo android y cosas asi

Ahora si enciendes la luz desde el PULSADOR.

Según lo que dices Aqui
pero de igual forma quiero accionarlo manualmente. ahora bien
con arduino probe con un pulsador y si esta HIGH hace la accion para cambiar a LOW.
sin embargo con un pulsador se mantiene HIGH para cambiarlo a LOW pero al estar en constante HIGH por medio del modulo inalambrico no puede ser cambiado a LOW. no se si me explico.
que no termino de entender bien lo que sucede entonces expongo las dos situaciones que me imagino que puede estar pasando:

Situación A:
Pulsas el PULSADOR, se ve que la acción de cambiar de estado se realiza pero, como ANDROID esta en HIGH, el FOCO no se apaga ya que prevalece la orden de ANDROID.
Posibles causas y soluciones.
El control del FOCO se lo debe hacer desde ARDUINO y no desde una variable en ANDROID.
ANDROID debe funcionar como un pulsador y no como un SWITCH.
ANDROID si se quiere que informe al usuario que si el FOCO esta encendido o apagado, deberá tener un método que le pida a ARDUINO el estado del FOCO.


Situación B:
Usas un SWITCH en lugar de un pulsador y ANDROID no puede controlar el FOCO cuando el SWITCH mantiene el foco encendido.

Que valga la redundancia donde sea necesario.
Espero y esto te sirva de ayuda.

surbyte

Quote
si alguien me puede pasar un codigo para darme una idea lo agradeceria
Yo no se si tienes todo lo que dices tener,  porque la ultima frase pone en duda todo tu comentario previo ( o al menos asi lo veo yo).
Desde ya veo que no has leído las normas del foro porque de lo contrario hubieras colocado tu código y como esta conectado tu switch o pulsador y el control de la lampara o lo que controles.

Para responderte tengo que imaginarme todo a riesgo de equivocarme, y por esa razón esperaré a que leas las normas, postees código y esquema y entonces si te daré algún consejo.

tecnopak

gracias ya agregue el codigo

surbyte

Bien agradezco qeu colocaras el código.
Aun no termino de entender bien el esquema.

En el UNO no hay mucho para ver, hablas de buton1 y foco1 pero cuales son los elementos en el ESP?

tecnopak

Bien agradezco qeu colocaras el código.
Aun no termino de entender bien el esquema.

En el UNO no hay mucho para ver, hablas de buton1 y foco1 pero cuales son los elementos en el ESP?
agregue el diagrama espero puedas ayudarme.
perdon los dibujos y el diagrama improvisado. pero el modulo esp va comunicado con rx y tx con arduino y si pasan bien los datos.

cuando se recibe "a" apaga el foco y cuando se recibe "b" lo enciende.
eso en cuanto a la aplicacion de windows y android que tengo funcionan muy bien con los botones que se programaron.

pero con el boton fisico es donde me atore

surbyte

Bueno esta claro que el problema es el switch fisico vs el switch virtual

Sin embargo el switch físico conectado al UNO siempre será como mandatario y por ello no veo como pretendes resolver el tema.
Si en cambio tuvieras un pulsador y cada vez que pulsas cambias el estado del foco, entonces si, pq no importa que estado tenga el pulsador físico ya que esto se traduce en una variable que tu podras controlar tambien via Android.

Resumiendo: debes llevar todo a que el estado físico no sea fijo como pasa con un switch y si lo es entonces tienes que armar un sistema escalera con dos reles. tu switch fisico cambia un rele y el android otro rele

Mira este hilo rele e interruptor independientes.
En este hilo PeterKanTropus propone un ingenioso esquema de escalera donde el interruptor (del tipo escalera) esta fisicamente de un lado y del otro esta el arduino controlando un rele.  Ambos físicamente conectados.


Que es lo mismo que propuso en este hilo https://forum.arduino.cc/index.php?topic=326904.0




Bueno son algunas ideas. Analiza a ver que opinas.
Tiense la opcion pulsador tal como esta ahora pero no con switch
O con interruptor escalera de un lado pero fisicamente conectado al rele del ESP cosa que creo no será de tu agrado.
En ese caso casi podrias prescindir del UNO y que el ESP haga todo.

tecnopak

Es interesante la idea. y realmente dejar que el esp haga todo es sencillo, estuve usando el sistema con el esp y una simple xor. funcionaba bien, se ahorra al no implementar el UNO.

pero gracias por la idea. hare pruebas y estare publicando cualquier avance para la comunidad.

Go Up