viernes, 11 de noviembre de 2016

(IOT) Arduino/Thingspeak/1sheeld/Matlab(en construcción)




Objetivo general:

  • Desarrollar un prototipo de control, para controlar a distancia un invernadero en el desierto de Atacama.


Objetivos específicos:

  • Subir datos de temperatura y humedad a la nube de thingspeak.
  • Encender relevadores para activar electrovalvulas u otro con una solicitud HTTP.
  • Subir una foto al correo electronico.
  • Analizar los datos.

desarrollo:
El desarrollo de este prototipo tiene como fin implementarlo en un invernadero real, que a futuro se espera construirlo en el desierto de Atacama.

1) Creación de tres canales en Thingspeak: Temperatura, humedad y ON/OFF

2) Apertura de canales y creación de campos:



3) Capturamos las API's keys, de lectura y escritura.

4) El montaje electrónico comprende un sensor DHT22, la placa arduino, la placa 1sheeld y un smartphone, se utilizo este método pues en el lugar de instalación no existe red Wifi por lo cual se usa la red movil 3G local.



5) Básicamente el código de programación subirá los datos de temperatura y humedad a la plataforma de Thingspeak y realizará una solicitud de lectura del campo N°3 para que la placa determine si enciende el led o no.

code:
       
#define CUSTOM_SETTINGS
#define INCLUDE_INTERNET_SHIELD
#define INCLUDE_TERMINAL_SHIELD

#include <OneSheeld.h>
#include "DHT.h"
#define DHTPIN 2 
#define DHTTYPE DHT22  

DHT dht(DHTPIN, DHTTYPE);

char temperatura[10];
char humedad[10];
HttpRequest request("https://api.thingspeak.com/update");
HttpRequest solicitud("https://api.thingspeak.com/channels/aqui_va_el_canal/feeds.json?&results=1"); // put where 9 your channel number


int led = 10;
void setup()
{
  Serial.begin(9600);
 OneSheeld.begin();

 
  pinMode(led, OUTPUT); 
 request.addParameter("key","Xxxxxxxxxxxxxxxxxxxxxxxxxxxx"); //  key de escritura

   solicitud.setOnSuccess(&onSuccess);
  /* Subscribe to json value replies. */
  solicitud.getResponse().setOnJsonResponse(&onJsonReply);
  /* Subscribe to response errors. */
  solicitud.getResponse().setOnError(&onResponseError);
  /* Subscribe to Internet errors. */
  Internet.setOnError(&onInternetError);
  /* LED pin modes OUTPUT.*/
}

void loop()
{
  float h = dht.readHumidity(); 
  float t = dht.readTemperature();
  dtostrf(t, 3, 2, temperatura);            // convert from int to char array
  dtostrf(h, 3, 2, humedad);
  // add the value of the temperature as the other parameter for the URL
  request.addParameter("field1",temperatura);
  request.addParameter("field2",humedad);
  
  Internet.performGet(request);                // Perform get to the request
                      
//Serial.println(temperatura);
//Serial.println(humedad);
 solicitud.addParameter("key","4xxxxxxxxxxxxxxxxxxxxxxx");//key de lectura
 Internet.performGet(solicitud);
  OneSheeld.delay(10000);  
   
}

void onSuccess(HttpResponse & response)
{

  response["feeds"][0]["field3"].query(); 
  
  
  
  
}

void onJsonReply(JsonKeyChain & hell,char * output)
{
  /* 1Sheeld responds using text-to-speech shield. */
 // TextToSpeech.say(output);
  /* Check if the LED must turn ON. */
  //if (!strcmp("1",output)) //werkt bij 1 tm 4;
  if (!strcmp("1",output))
    blueRGB();
  
     /* Check if the LED must be OFF. */
  else if (!strcmp("0",output))
    off();
}


/* Set the pins of the blue LED to ON. */
void blueRGB()
{
  digitalWrite(led, HIGH);
  Terminal.println("on");
}

/* Set the pins of the blue LED to OFF. */

void off()
{
  digitalWrite(led, LOW);
  Terminal.println("off");

}

void onResponseError(int errorNumber)
{
  /* Print out error Number.*/
  Terminal.print("Response error:");
  switch(errorNumber)
  {
    case INDEX_OUT_OF_BOUNDS: Terminal.println("INDEX_OUT_OF_BOUNDS");break;
    case RESPONSE_CAN_NOT_BE_FOUND: Terminal.println("RESPONSE_CAN_NOT_BE_FOUND");break;
    case HEADER_CAN_NOT_BE_FOUND: Terminal.println("HEADER_CAN_NOT_BE_FOUND");break;
    case NO_ENOUGH_BYTES: Terminal.println("NO_ENOUGH_BYTES");break;
    case REQUEST_HAS_NO_RESPONSE: Terminal.println("REQUEST_HAS_NO_RESPONSE");break;
    case SIZE_OF_REQUEST_CAN_NOT_BE_ZERO: Terminal.println("SIZE_OF_REQUEST_CAN_NOT_BE_ZERO");break;
    case UNSUPPORTED_HTTP_ENTITY: Terminal.println("UNSUPPORTED_HTTP_ENTITY");break;
    case JSON_KEYCHAIN_IS_WRONG: Terminal.println("JSON_KEYCHAIN_IS_WRONG");break;
  }
}

void onInternetError(int requestId, int errorNumber)
{
  /* Print out error Number.*/
  Terminal.print("Request id:");
  Terminal.println(requestId);
  Terminal.print("Internet error:");
  switch(errorNumber)
  {
    case REQUEST_CAN_NOT_BE_FOUND: Terminal.println("REQUEST_CAN_NOT_BE_FOUND");break;
    case NOT_CONNECTED_TO_NETWORK: Terminal.println("NOT_CONNECTED_TO_NETWORK");break;
    case URL_IS_NOT_FOUND: Terminal.println("URL_IS_NOT_FOUND");break;
    case ALREADY_EXECUTING_REQUEST: Terminal.println("ALREADY_EXECUTING_REQUEST");break;
    case URL_IS_WRONG: Terminal.println("URL_IS_WRONG");break;
  }
}
 

6) datos en Thingspeak:


7) Para activar el led se introduce el siguiente link, variando el 0 o 1 para apagarlo o encenderlo respectivamente. Esta entrada analógica remota podría ser util para activar la cámara y obtener una imagen o para cortar el suministro eléctrico o resetear alguna placa. 

https://api.thingspeak.com/update?api_key=key_de_escritura&field3=1 

8) Desarrollo del análisis de los datos con MatLab:
En una primera instancia se recogen los datos para estudiarlos y establecer relaciones entre la diferentes variables que permitan optimizar el crecimiento de los cultivos en la zona desértica, muy en especial la Quinoa. Si se llegase a encontrar relaciones entre variables que logren este objetivo debería ser implementado en el algoritmo de MatLab, por lo tanto el programa automáticamente debería ejecutar acciones para esto MatLab debería tener la capacidad de escribir entradas digitales en thingspeak para que la placa arduino lea, interprete y ejecute las acciones.

desarrollo:

0 comentarios:

Publicar un comentario