Go Down

Topic: Solucionado: ESP8266 Lectura (Read 264 times) previous topic - next topic

Nachtmotte

Apr 21, 2018, 10:12 pm Last Edit: Apr 23, 2018, 02:53 am by Nachtmotte
Hola compañeros, disculpen las molestias tengo una duda talvez tonta para muchos, hace poco empece en el mundo de los ESP8266 usando el IDE de Arduino, para aclarar tengo el esp8266 01 color negro.
 
La cuestion es que para empezar a entender como funciona queria hacer proyectos basicos como los primeros de arduino, que lea el estado de un boton y lo imprima a traves de serial print, el problema es que no pude hacer que lea ningun estado, intente usar los gpi0 en entrada como si fuese un arduino leyendo ya sea 3.3v o 5v y nunca me funciona, en el serial print imprime toda basura.

Busque informacion en internet, algunos los conectan directamente como si fuese un arduino, otros usan resistencia pull up o pull down, otros usan transistores, otros usan el gpio0 y gpio2 juntos, otros usan el RX como un gpio de lectura, algunos dicen que con 5v no pasa nada y otros que si le mandas mas de 3.3v se quema.

La verdad es que estoy confundido, si alguno sabe como hacerlo agradeceria mucho su respuesta, si se preguntan por el esquema o el codigo no hay mucho que mostrar lo intente directamente como si fuese un arduino, primero lo probe en el arduino que tengo y todo bien luego lo hice con el esp8266 y nada.

La finalidad de esto es aprender a usar la lectura del dispositivo para luego usarlo con el wifi, gracias de antemano por la atencion.

serelguerrero

si el serial print te imprime basura es que seguramente es que no has ajustado los baudios, deben ser iguales en el serial print y en el programa

Nachtmotte

serelguerrero gracias por la respuesta pero este no es el caso, en el esp8266 inicializo el serial en 115200 al igual que en el monitor serie, tambien intente ambos con 9600 baudios y me pasa lo mismo, yo creo que se debe mas a los limites de los gpi0 del modulo combinado con mi poco conocimiento del mismo, en todo caso seguire buscando y si no encuentro la respuesta que busco me compro un nodemcu asi no me complico mas

surbyte

#3
Apr 22, 2018, 06:04 am Last Edit: Apr 22, 2018, 06:05 am by surbyte
Hiciste funcionar el Blink para ESP? Digo porque esto es básico, no sabes si funciona o no, pero tal vez no lo estes flasheándolo correctamente.

Nachtmotte

surbyte gracias por la respuesta, si ya hice funcionar varios ejemplos del esp8266 como el blink o el HelloServer, tambien si uso los gpio0 y gpio2 como salida para hacer funcionar un led o un rele todo funciona normal, ahora por ejemplo si quiero usar cualquier de los gpio para lectura no me funciona, primero probe que al presionar un boton lea el estado y prenda un led, no me funciono, por eso quise ver si podia hacer que imprima a traves del serialprint para ver que mostraba y daba todo basura, pase el mismo codigo por el arduino y funciona sin problemas, el voltage del boton primero lo hice con 3.3v pero como no me funcionaba probe con 5v y seguia el mismo problema, nose si con el esp8266 no funciona el comando digitalread o se usa otro o talvez no funcionan como entrada porque almenos en la informacion que yo busque practicamente nadie lo conectaba directamente como si fuese un arduino.

surbyte

Primero se conectan como Arduino pero de 3.3V no te olvides.
Asi que puedes usar una resistencia pull-up o pull-down externa o interna porque los ESP tienen un modo INPUT_PULLUP o INPUT_PULLDOWN que los Arduinos no tienen.

Te garantizo que funcionan porque yo uso los ESP01 y leo sensores digitales con ellos y claro usan operaciones como digitalRead, el tema esta como le dices que usas el GPIO o como identificas el pin

Coloca el código que usas  para poder opinar

Nachtmotte

surbyte te paso el codigo, use una resistencia PullUP externa, nose como se usa la interna, el codigo que use para este caso es simple, solo lee si hay voltage o no y lo imprime una primera vez y luego denuevo a los 5 seg

Code: [Select]

const int pinsensor = 2;
unsigned long previousMillis = 0;
const long interval = 5000;
int estadoactual = 0;
int estado = 0;
char estadopalabra;
void int() {
  pinMode(pinsensor, INPUT);
  Serial.begin(115200);
}

void loop() {
  unsigned long currentMillis = millis();
  estadoactual = digitalRead(pinsensor);
  if (estadoactual != estado){
    estado = estadoactual;
    if (estadoactual == HIGH){
      estadopalabra = 'Conectado';}
      else{
        estadopalabra = 'Desconectado';}
    Serial.println(estadopalabra);     
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      Serial.println(estadopalabra);
      } 
    }
}

surbyte

Si usas una resistencia pull-up como este diagrama



no tienes que esperar el estado HIGH sino el LOW


Nachtmotte

surbyte ahi arregle lo que me dijiste y un par mas de errores pequeños que cometi, igual sigue sin funcionar, te paso el codigo con las imagenes, en el monitor serie cada vez que presiono el boton me aparece varias "o" con solo presionar una vez.

Code: [Select]

const int pinsensor = 2;
unsigned long previousMillis = 0;
const long interval = 5000;
int estadoactual = 0;
int estado = 0;
char estadopalabra;

void setup() {
  pinMode(pinsensor, INPUT);
  Serial.begin(115200);}

void loop() {
  unsigned long currentMillis = millis();
  estadoactual = digitalRead(pinsensor);
  if (estadoactual != estado){
    estado = estadoactual;
    if (estadoactual == LOW){
      estadopalabra = 'Desconectado';}
      else{
        estadopalabra = 'Conectado';}
    Serial.println(estadopalabra);      
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      Serial.println(estadopalabra);
      }  
    }
}






surbyte

O sea funciona!! porque cuando presionas tu ves un LOW y LOW es 0 para tu definicion

Code: [Select]
int estadoactual = 0;

Lo que ocurre que mal interpretas las cosas.

Cuando presionas tienes un LOW o 0 en estadoactual.
Eso es "Conectado"

Cuando sueltas es 1 o "Desconectado"

Luego los carteles van entre " " no con ' ' asi que por eso no se ve o lee nada

corrige asi

Code: [Select]
if (estadoactual == LOW){
      Serial.println("Conectado");}
      else{
        Serial.println("Desconectado");}
    Serial.println("Estado :" + String(estadopalabra)); 

Nachtmotte

surbyte tienes razón, funciona y me habia equivocado en un par de cosas, muchas gracias por la ayuda, ahi dejo los ultimos cambios al codigo y las imagenes funcionando, tambien cambio al titulo como solucionado, se que para muchos son cosas basicas pero me sirvio mucho la ayuda, saludos.

Code: [Select]

const int pinsensor = 2;
unsigned long previousMillis = 0;
const long interval = 5000;
boolean cambioestado = false;
int estadoactual = 0;
int estado = 0;
String estadopalabra;

void setup() {

  pinMode(pinsensor, INPUT);
  Serial.begin(115200);}

void loop() {
  unsigned long currentMillis = millis();
  estadoactual = digitalRead(pinsensor);
  if (estadoactual != estado){
    estado = estadoactual;
    cambioestado = true;
    if (estadoactual == LOW){
      estadopalabra = "Conectado";}
      else{
        estadopalabra = "Desconectado";}
    Serial.println("Estado :" + String(estadopalabra));         
    }
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (cambioestado == true){
      cambioestado = false;
      Serial.println(estadopalabra);}
  }
}







surbyte

No entiendo para que muestras esto

 
Code: [Select]
if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (cambioestado == true){
      cambioestado = false;
      Serial.println(estadopalabra);}
  }


Te tiene que sobrar con saber que te estas conectando y en todo caso no hace falta un debounce cuando liberas el pulsador.
Entiendes que quiero decir?


Go Up