Como contaba en mi post anterior, estuve trabajando con una NodeMCU para hacer un proyectito con Twitter.

[Parte I] [Parte II]

Hice las primeras pruebas con un Arduino UNO y salieron bien.

¿Qué hace falta para que funcione en la NodeMCU?

Similitudes

  • La NodeMCU también tiene un pin analógico A0.
  • Todas las instrucciones son válidas también en la NodeMCU.

Diferencias

  • La NodeMCU tiene un watchdog (“perro guardián”) que resetea la placa cuando detecta un loop muy rápido (la placa necesita ciclos libres para administrar el wifi). Solución: agregar delays de 10ms en los loops de bool esperar_luz(int, bool) y void esperar_oscuridad().

  • Aparentemente el pin A0 de la NodeMCU es más sensible que el del Arduino UNO, así que el fotorresistor del post anterior marca siempre 1024 (tiene 10 bits). Solución: conseguir un fotorresistor que tenga más rango o poner una resistencia para bajar el voltaje de salida. La que me funcionó es la primera.

Materiales:

  • 3 cables de protoboard macho-macho
  • 1 protoboard, puede ser chiquita
  • 1 fotorresistor
  • 1 resistencia de 1KΩ
  • 1 NodeMCU

Esquema

Esquema fotorresistor NodeMCU

Código modificado

const int pin_sensor = A0;
const int largo_punto = 300;
const int tiempo_maximo =  1000;
const int largo_silencio = 750;
const String punto = ".";
const String raya = "-";
String palabra = "";
int luz_ambiente;

void fijar_luz_ambiente(){
  luz_ambiente = analogRead(pin_sensor);
}

void esperar_luz(bool con_tiempo) {
  int luz_sensor;
  int inicio = millis();
  do {
    luz_sensor = analogRead(pin_sensor);
    if(con_tiempo && (millis() > inicio + tiempo_maximo)) {
      return;
    }
    delay(10);
  } while (luz_sensor < luz_ambiente + 10);
}

void esperar_oscuridad() {
  int luz_sensor;
  do {
    luz_sensor = analogRead(pin_sensor);
    delay(10);
  } while (luz_sensor > luz_ambiente);
}

void setup() {
  Serial.begin(9600);
  pinMode(pin_sensor, INPUT);
  fijar_luz_ambiente();
  Serial.print("Luz ambiente: ");
  Serial.println(luz_ambiente);
}

void loop() {
  esperar_luz(false);  
  const int inicio_luz = millis();
  esperar_oscuridad();
  int duracion_luz = millis() - inicio_luz;
  if(duracion_luz > largo_punto) {
    palabra = palabra + raya;
  } else {
    palabra = palabra + punto;
  }
  Serial.print(".");
  const int inicio_oscuridad = millis();
  esperar_luz(true);
  int duracion_oscuridad = millis() - inicio_oscuridad;
  if(duracion_oscuridad >= largo_silencio) {
    Serial.println();
    Serial.print("La palabra es:");
    Serial.print("[");
    Serial.print(palabra);
    Serial.println("]");
    palabra = "";    
  }
}

Conclusión

Este código es bastante simple, pero es interesante escribir código que funcione en varias plataformas (el código de este post es compatible con el Arduino UNO).


Por comentarios o sugerencias mi correo está al final de la página. También pueden levantar un issue en el repo de GitHub del sitio.