Con el objetivo de escenificar un pequeño #smartSantander para echar un cable a Iberobotics en el Nautilus Lab nos hemos puesto manos a la obra, hemos hecho un sensor bastante simple que mide la intensidad lumínica con una LDR y una Arduino Ethernet, un «servidor» con una Raspberry Pi B y Node.js y un demostrador básico con otra Arduino Ethernet y un servo que hace las veces de indicador.
No nos hemos complicado mucho: cada 100mS el sensor mide la intensidad y envía al servidor un comando «guardar sensor 0 valor».
A su vez nuestro indicador envía también cada 100mS al servidor una solicitud «recoger sensor 0» por la que el servidor le devuelve el valor de la intensidad, que adapta al recorrido del servo y muestra.
Aquí abajo os dejamos el código de las 3 aplicaciones, por si queréis echar un vistazo 🙂
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 }; IPAddress ip(192,168,1,21); // initialize the library instance: EthernetClient cliente; char serverName[] = "192.168.1.37"; void setup() { Serial.begin(9600); pinMode(9, OUTPUT); Serial.println("Pidiendo IP por DHCP..."); if (!Ethernet.begin(mac)) { Serial.println("Falló, la ponemos por defecto."); Ethernet.begin(mac, ip); } Serial.print("IP Local:"); Serial.println(Ethernet.localIP()); connectToServer(); } int nSensor=0; // Que sensor tenemos void loop() { int sensorValue; sensorValue = analogRead(A0); // Leemos el valor Serial.println(sensorValue); analogWrite(9, sensorValue*2); // Representamos el valor en la intensidad de un led if (cliente.connected()) { // Si estamos conectados al servidor cliente.print('g'); // Enviamos el comando de guardar cliente.print(nSensor); // Enviamos el número de sensor cliente.println(sensorValue); // Enviamos el valor que hemos leído del sensor cliente.stop(); // Desconectamos } else { // Si no estamos conectados connectToServer(); } delay(100); } void connectToServer() { Serial.println("Conectamos con el servidor"); if (cliente.connect(servidor, puertoServidor)) { Serial.println("conectados..."); } else { delay(1500); Serial.println("esperamos..."); } }
-Servidor «nube» de mini #smartSantander:
// Load the TCP Library var net = require('net'); var datos=[0,0,0,0,0]; //Start a TCP Server net.createServer(function (socket) { // Identify this client socket.name = socket.remoteAddress + ":" + socket.remotePort ; console.log(getDateTime() + ">" + socket.name+" <Hola>"); socket.on('data', function (data) { try { data=''+data; var orden=data.substr(0,1); var nSensor=parseInt(data.substr(1, 1)); var valor=parseInt(data.substr(2)); switch (orden) { case '?': console.log(getDateTime() + ">" + socket.name+" >> Nos piden datos del sensor " + nSensor); socket.write(String.fromCharCode(datos[nSensor]+32)); break; case 'g': console.log(getDateTime() + ">" + socket.name+" >> Nos envian datos del sensor " + nSensor + ": "+ valor); datos[nSensor]=valor; break; default: console.log(getDateTime() + ">" + socket.name+" >> Comando desconocido: " + data); break; } } catch (e) { console.log(getDateTime() + ">> Error"); console.log(e); } //socket.end(); }); socket.on('end', function () { console.log(getDateTime() + ">" + socket.name+" <Adios>"); }); }).listen(8081); console.log(getDateTime() + ">" + "Escuchando..."); function getDateTime() { var date = new Date(); var hour = date.getHours(); hour = (hour < 10 ? "0" : "") + hour; var min = date.getMinutes(); min = (min < 10 ? "0" : "") + min; var sec = date.getSeconds(); sec = (sec < 10 ? "0" : "") + sec; var year = date.getFullYear(); var month = date.getMonth() + 1; month = (month < 10 ? "0" : "") + month; var day = date.getDate(); day = (day < 10 ? "0" : "") + day; return day+'/'+month+'/'+year + " " + hour + ":" + min + ":" + sec; }
#include <SPI.h> #include <Ethernet.h> #include <Servo.h> Servo servo; byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 }; IPAddress ip(192,168,1,20); // initialize the library instance: EthernetClient cliente; char servidor[] = "192.168.1.37"; int puertoServidor=8081; void setup() { // put your setup code here, to run once: Serial.begin(9600); servo.attach(9); // attempt a DHCP connection: Serial.println("Pidiendo IP por DHCP..."); if (!Ethernet.begin(mac)) { // if DHCP fails, start with a hard-coded address: Serial.println("Falló, la ponemos por defecto."); Ethernet.begin(mac, ip); } Serial.print("IP Local:"); Serial.println(Ethernet.localIP()); connectToServer(); servo.write(180); } int nSensor=0; // Que número de sensor nos interesa void loop() { if (cliente.connected()) { // Si estamos conectados Serial.println("Pedimos datos..."); cliente.print('?'); // Comando para pedir datos cliente.print(nSensor); // Enviamos el número de sensor del que queremos los datos delay(100); // Esperamos un poco if (cliente.available()) { // Comprobamos si hay datos disponibles // leemos el dato int inChar = cliente.read(); int valor=(inChar-32)*4; // Adaptamos el dato (0-40) al rango de nuestro servo (0-180) Serial.print("Valor:"); Serial.println(valor); servo.write(180-valor); // Lo mandamos al servo } cliente.stop(); // Cerramos la conexión } else { // No estamos conectados connectToServer(); // Nos conectamos } delay(100); } void connectToServer() { Serial.println("Conectamos con el servidor"); if (cliente.connect(servidor, puertoServidor)) { Serial.println("conectados..."); } else { delay(1500); Serial.println("esperamos..."); } }