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)
yvoid 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
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.