ENVIAR Y RECIBIR DATOS
Continuando con mis anteriores artículos Leer de Arduino y Escribir en Arduino, os enseñaré el sketch (programa que se ejecuta en arduino) que cierra el círculo.
Uso el sensor de temperatura LM35, que es un sensor que detecta temperaturas desde -55ºC a 150ºC, 1ºC equivale a 10mV y soporta voltajes de entre 4V y 30V. Puedes ver la ficha técnica LM35.
Al leer un sensor analógico con Arduino se utiliza la función analogRead; esto nos da un valor entre 0 y 1023, 1024 valores posibles. Si tenemos 0V nos devolverá 0 y si tenemos 5V nos devolverá 1023. Gracias a ello podemos utilizar una fórmula matemática para calcular la temperatura en función del voltaje que nos facilita el sensor.
Temperatura = Valor * 5 * 100 / 1024
El circuito que necesitamos es:

Considerando que conoces un mínimo cómo funciona arduino, es fácil seguir el código.
- setup -> inicializamos lo necesario como la comunicación por el puerto serial
- loop -> bloque de código de ejecución infinita con el delay que se especifique
- serialEvent -> leemos lo que nos envían por el puerto serial, recordad que era el nuevo intervalo para notificar la temperatura
Para escribir por el puerto serial usamos
Serial.println(temperature);
Y para leer lo que nos transmiten por el puerto serial usamos
String newInterval = Serial.readString();
Quedando un resultado un código similar a éste
const int SENSOR_PIN = A0;
const int BITS_PER_SECOND = 9600;
const long DEFAULT_PROBE_INTERVAL_IN_MILISECONDS = 10000L;
const long DEFAULT_DELAY_IN_MILISECONDS = 500L;
long probeIntervalInMiliseconds = 0;
long waitingTimeToNotify = 0;
void setup() {
Serial.begin(BITS_PER_SECOND);
if(probeIntervalInMiliseconds == 0){
probeIntervalInMiliseconds = DEFAULT_PROBE_INTERVAL_IN_MILISECONDS;
}
}
void loop() {
float temperature = (5.0 * analogRead(SENSOR_PIN) * 100.0) / 1024;
if(waitingTimeToNotify >= probeIntervalInMiliseconds){
Serial.println(temperature);
waitingTimeToNotify = DEFAULT_DELAY_IN_MILISECONDS;
}else{
waitingTimeToNotify += DEFAULT_DELAY_IN_MILISECONDS;
}
delay(DEFAULT_DELAY_IN_MILISECONDS);
}
void serialEvent() {
while(Serial.available() > 0) {
String newInterval = Serial.readString();
char newIntervalBuf[32];
newInterval.toCharArray(newIntervalBuf, sizeof(newIntervalBuf));
probeIntervalInMiliseconds = atol(newIntervalBuf);
}
}