Herramientas de usuario

Herramientas del sitio


personas:johnny:proyectos:indoor_diy_autosostenible

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
personas:johnny:proyectos:indoor_diy_autosostenible [2019/12/01 07:40]
kz
personas:johnny:proyectos:indoor_diy_autosostenible [2020/08/09 05:59] (actual)
kz [Actualización 9 de agosto 2020]
Línea 554: Línea 554:
   - actualizar el firmware por medio de ota   - actualizar el firmware por medio de ota
  
 +====== Actualización 13 de julio 2020 ======
  
-<code c++> +En todo este tiempo he estado aprendiendo mas que todo sobre las plantas, conociendolas y mirando como los diferentes factores que inciden en ella(Temperatura y humedad, calidad de la tierra, calidad del agua, lummens necesarios, etc...) 
-/* Library used +Entonces antes de seguir con el codigo y el prototipo de placaEstuve un tiempo pensando en la mejoras que se le arian al indoor.
- * https://github.com/PaulStoffregen/Time +
- * https://github.com/PaulStoffregen/TimeAlarms +
- * https://learn.adafruit.com/dht/using-a-dhtxx-sensor +
- *  +
- * resources from sensor +
- * https://www.switchdoc.com/2018/11/tutorial-capacitive-moisture-sensor-grove/ +
- *  +
-  config NTP +
-  this code take the time from server using NTP  +
-  https://lastminuteengineers.com/esp8266-ntp-server-date-time-tutorial/+
  
-  !!! IMPORTANT +He dispuesto un extrator de 125v para sacar el aire caliente y regular la temperatura del indoor en la parte superiorTambien arregle el espacio y le trabaje junto con mi tio para volverlo mejor.
-  You need to adjust the UTC offset for your timezone in milliseconds +
-  Refer the list of UTC time offsets Here are some examples for different timezones: +
-  https://upload.wikimedia.org/wikipedia/commons/8/88/World_Time_Zones_Map.png+
  
-  For UTC -5.00 : -5 * 60 * 60 : -18000 +ANTES
-  For UTC +1.00 : 1 * 60 * 60 : 3600 +
-  For UTC +0.00 : 0 * 60 * 60 : 0 +
-  used -> const long utcOffsetInSeconds = 3600; +
-*/+
  
-#include <Arduino.h> +{{:personas:johnny:proyectos:viejo-indoor.jpg?400|}}
-#include <NTPClient.h> +
-#include <DHT.h> +
-#include <Time.h> +
-#include <SPI.h> +
-#include <Wire.h> +
-#include <Adafruit_GFX.h> +
-#include <Adafruit_SSD1306.h> +
-#include <ESP8266HTTPClient.h> +
-#include <ESP8266WiFi.h> +
-#include <WiFiUdp.h> +
-#include <string.h>+
  
-// pin out oled ssd1306 +AHORA
-#define OLED_MOSI 14   //D5 +
-#define OLED_CLK 16    //D0 +
-#define OLED_DC 13     //D7 +
-#define OLED_CS 15     //D6 +
-#define OLED_RESET 12  //D8+
  
-#define lights D1 +{{:personas:johnny:proyectos:nuevo-indoor.jpg?400|}}
-char stateLights = 'F';+
  
-// config NTP variables +{{:personas:johnny:proyectos:habitacion.jpg?400|}}
-int time_hours = 0; +
-int time_minutes = 0; +
-int time_seconds = 0; +
-const int *ntp_hours, *ntp_minutes, *ntp_seconds; +
-const long utcOffsetInSeconds = -18000; // colombia UTC -5 +
-char daysOfTheWeek[7][12] = { +
-  "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" +
-};+
  
-const char *ssid = "TP-LINK_Extender_C464C2"; +Tambien mi tio me ayudo a construir un reflector para adaptarle hasta 6 bombillos a este mismo. Este cambio ayudo mucho a las plantas pero tambien afecto bastante otros factores que detallaremos mas adelante.
-const char *pass = "alex1988alex";+
  
-// Define NTP client to get time +{{:personas:johnny:proyectos:reflector1.jpg?400|}}
-WiFiUDP ntpUDP; +
-NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);+
  
-// config display +{{:personas:johnny:proyectos:reflector2.jpg?400|}}
-Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); +
-#if (SSD1306_LCDHEIGHT != 64) +
-//#error("Height incorrect, please fix Adafruit_SH1106.h!"); +
-#endif+
  
-// define template function +En este cultivo tambien estuve experimentando y aprendiendo sobre las podas. En especial la fim y la apical.
-void firstSync(); +
-void syncNtptoTime(); +
-void stateVegetative(); +
-void stateFlowering();+
  
-void setup() { +{{:personas:johnny:proyectos:podas.png?400|}}
-  // display +
-  Serial.begin(115200); +
-  setTime(time_hours,time_minutes,time_seconds,30,11,19); +
-  WiFi.begin(ssid, pass); +
-  display.begin(SSD1306_SWITCHCAPVCC); +
-  display.clearDisplay(); +
-  Serial.println(); +
-  Serial.println(); +
-  delay(1000); +
-  display.setTextSize(1); +
-  display.setTextColor(WHITE); +
-  display.setCursor(0,10); +
-  display.println("Init ... "); +
-  display.display(); +
-  delay(1000); +
-  while (WiFi.status() != WL_CONNECTED) { +
-    delay(500); +
-    display.clearDisplay(); +
-    display.setTextSize(1); +
-    display.setCursor(0,10); +
-    display.setTextColor(BLACK, WHITE); +
-    display.println("connecting wifi "); +
-    display.print("."); +
-    display.display(); +
-  } +
-  display.clearDisplay(); +
-  display.setTextSize(1); +
-  display.setCursor(0,10); +
-  display.setTextColor(WHITE); +
-  display.println("Wifi connected"); +
-  display.println(WiFi.localIP()); +
-  display.display(); +
-  timeClient.begin(); +
-  delay(5000); +
-  display.clearDisplay(); +
-  display.setTextSize(1); +
-  display.setTextColor(WHITE); +
-  display.setCursor(0,10); +
-  display.println("first sync NTP to Time hardware..."); +
-  display.display(); +
-  firstSync(); +
-  delay(5000); +
-  //Serial.print(WiFi.localIP());   +
-  //pinMode(ledTrigger, OUTPUT); +
-  pinMode(lights, OUTPUT); +
-}+
  
-void loop() { +Entonces esta fue mi planta experimental... a la cual le hice de todo... apicales y fim... dando espacio minimo de un mes entre poda y poda para que la planta se recuperara y finalmente siempre podando en cuarto menguante.
-  display.clearDisplay(); +
-  display.setTextSize(0.5); +
-  display.setTextColor(WHITE); +
-  display.setCursor(0,0); +
-  display.print(daysOfTheWeek[timeClient.getDay()]); +
-  if (stateLights == 'V') { +
-    display.print(" | lights Onn"); +
-  } else { +
-    display.print(" | lights Off"); +
-  } +
-  display.println(); +
-  display.setCursor(0,8); +
-  // time library +
-  display.print("rtc d: "); +
-  display.print(hour()); +
-  display.print(":"); +
-  display.print(minute()); +
-  display.print(":"); +
-  display.print(second());+
  
-  // time ntp +{{:personas:johnny:proyectos:poda-apical1.jpg?400|}} 
-  display.setCursor(0,16); +{{:personas:johnny:proyectos:poda-apical2.jpg?400|}}
-  display.print("last sync"); +
-  display.print(*ntp_hours); +
-  display.print(":"); +
-  display.print(*ntp_minutes); +
-  display.print(":"); +
-  display.print(*ntp_seconds);+
  
-  // state lights +Dadas las experimentaciones, la planta desarrollo un brazo mas grande que el otroTambien se observa como queda la cicatriz del cortepero la planta a medida que pasa el tiempo se va curando.
-  display.setCursor(0,24);+
  
-  syncNtptoTime(); +Este experimento fue para aprender a realizar un cultivo tipo scrog... donde son necesarias este tipo de podas para hacer que las plantas sean mas eficientes a la hora del cultivo... pero el unico contra es que se alarga el tiempo de vegetacion para que las plantas se recuperen.
-  // stateFlowering(); +
-  stateVegetative();+
  
-  // update display +** Pasamos la placa base a baquela y actualizaciones y fixes en el código**
-  display.display(); +
-  delay(1000); +
-+
  
-void firstSync() { +Primero hablaremos de la placa. Entonces antes teniamos este hardware, 4 reles (de los cuales solo estoy usando 1y una pantallita para ver las lecturas del dht11. 
-  // pointer update with what is in ntp + 
-  timeClient.update(); +Antes 
-  ntp_hours = &time_hours; + 
-  ntp_minutes = &time_minutes; +{{:personas:johnny:proyectos:placa-antes.jpg?400|}} 
-  ntp_seconds = &time_seconds;  + 
-  // first update ntp to time variables +Cuando teniamos este circuito. Disponiamos de problemas de interrumciones de corriente... porque como vemos los cables estan pegados con mocos y mi casa a veces se mueve el piso, ocacionando que los cables se desconenten. 
-  time_hours = timeClient.getHours(); + 
-  time_minutes = timeClient.getMinutes(); +Por otro lado estabamos haciendo un request al server **NTP** cada minuto y con esta misma hora era que se configuraba todo en el codigo... ocacionando que cuando se cae el internet... no exista hora y se volviera loca la alarma...  
-  time_seconds = timeClient.getSeconds(); + 
-  // frist sync Ntp time to local time, get values from value pointers +Otra cosa grave era que cuando se hiba la luz... entonces como la alarma del codigo estaba seteada con una hora quemada... coacionaba que los ciclos de foto periodo se corrieran o no fueran los esperados. 
-  setTime(*ntp_hours,*ntp_minutes,*ntp_seconds,30,11,19); + 
-  timeClient.end(); +Otro problema que existia era que cuando las plantas ya necesitan el cambio de fotoperiodo... era necesario ingresar de nuevo el firmware a la placa con el cambio de periodo... entonces era tedidoso cada cierto tiempo estar ingresando el codigo a la base. 
-}+ 
 +**Ahora** 
 + 
 +Circuito actualmente 
 +{{:personas:johnny:proyectos:dsc06738.jpg?400|}} 
 + 
 +{{:personas:johnny:proyectos:placa-antes-2.jpg?400|}} 
 + 
 +**Arquitectura del firmware** 
 + 
 +{{:personas:johnny:proyectos:logica-firmaware.jpg?400|}} 
 + 
 +Resumidamente cuando se trata de conectar el led parpadea amarillo, si falla entonces parpadeara rojo. Luego hara el request al NTP para sincronizar el timeAlarms y setear la alarma inicialmente. En este proceso el led parpadeara verde, si falla parpadeara rojo. 
 + 
 +Luego de esto el led cada cierto tiempo empezara a parpadear en un color especifico... inicialmente el cyan. Y cada minuto el led parpadeara amarillo, para indicar que esta inviando las lecturas del capacitivo y el dht al influxdb.  
 + 
 +**Mientras eso ocurre no es adecuado presionar el boton para cambiar el ciclo de floracion. 60%>** 
 + 
 +**Como funciona actualmente** 
 + 
 +Tenemos basicamente estos estados
 + 
 +  - **Cyan:**__Indica estado vegetativo de dia.__ Las luces se encianden a las 6 y se apagan a las 24 
 +  - **Azul:**__Indica estado vegetativo de noche__. Las luces se encienden a las 18 y se apagan a las 12 del otro dia 
 +  - **Naranja:**__Indica estado floracion de dia__. Las luces se encienden a las 6 y se apagan a las 18 
 +  - **Magenta:**__Indica estado floracion de noche__. Las luces se encienden a las 18 y se apagan a las 6 del otro dia
 +  - **Amarillo:**Indica que el esp esta haciendo un POST. **En este momento no deberiamos de cambiar el estado de fotoperiodo de las luces. (no apretar el boton)** 
 +  - **Verde:**Indica primera conexion del esp a la red, tambien primera sincronizacion del tiempo local por medio del NTP o actualizacion de este mismo. **En este momento no deberiamos de cambiar el estado de fotoperiodo de las luces. (no apretar el boton)** 
 +  - **Rojo:** Indica que el esp no se pude conectar a la red. Si el la primera vez... Si ocurre durante un update del tiempo local desde el ntp... no pasa nada... no se actualizara... este test se hizo forzozamente durante un dia sin conexion en el lugar. La alarma local siguio funcionando normalmente. 
 + 
 +Estos estados fueron ideados y pensados principamente por dos razones: 
 +  * No tener que estar programando el esp para cambiar el fotoperido de las luces. 
 +  Favorecer las condiciones de temperatura y humedad en el cuarto de cultivo. Ya que se ha investigado que apagando las luces durante el dia en lugares muy calurososse reduce la temperatura. Estos datos son corroborados mirando la trama de datos del influx db... donde se nota claramente que en el dia se superanban temperaturas de 35 grados con luces encendidas... notandose quema de hojas en las puntas. 
 + 
 +{{:personas:johnny:proyectos:factor-para-cambiar-alarmas.png?400|}} 
 + 
 +Con luces apagadas en el dia... osea configuracion azulla temperatura no supera los 2526 grados. Datos adecuados.... no ideales pero mas cercanos a los necesarios. 
 + 
 +Ahora la placa sobre la baquelita :-o 
 + 
 +{{:personas:johnny:proyectos:placa3.jpg?400|}} 
 + 
 +{{:personas:johnny:proyectos:placa-2.jpg?400|}} 
 + 
 +{{:personas:johnny:proyectos:placa-1.jpg?400|}} 
 + 
 +Finalmente estas son las planticas con el dht y el scrog 
 + 
 +{{:personas:johnny:proyectos:indoor-actual.jpg?400|}} 
 + 
 +Aun queda pendiente mucho trabajo... configurar el esp en modo sta-ap para que podamos encender o apagar ventiladores... o controlar la velocidad por medio de dimmers y una pagina web como cliente. 
 + 
 +Pero ahora lo mas importante seria el riego y poder medir con el capacitivo cuando seria un punto ideal para el riego. Asi como el dht definio puntos vitales para la configuracion de nuevas alarmas 
 + 
 +====== Actualización 9 de agosto 2020 ====== 
 + 
 +[[https://blog.usejournal.com/automated-smart-home-irrigation-system-9061c391f8e2|Inspiracion]] 
 + 
 +He arreglado las lecturas del dht haciendo 4 lecturas en un minuto y promediando ese dato. Luego es enviado al influx para arreglar las interpolaciones generadas en la grafica del influx. 
 + 
 +Ademas de eso. He añadido las lecturas de un sensor de humedad capacitivo **(Soil moisture sensor v1.2)** promediando el dato tambien y enviandolo al influx. 
 + 
 +Codigo inicial para empezar a usar el sensor. 
 + 
 +<code c++> 
 +const int numReadings = 30
 +const int sendingInterval = 1000; 
 + 
 +int capacitive_sensor = A0; 
 + 
 +int readings_capacitive_sensor[numReadings]; 
 +int readIndex = 0; 
 +int total = 0; 
 +int average = 0; 
 + 
 +void setup() { 
 +    Serial.begin(115200);
  
-void syncNtptoTime() { +  // asigned all index to 0 
-  // update local time from NTP server over get minutes and seconds +  for(int thisReading=0thisReading < numReadingsthisReading++){ 
-  // from local time hardware +    readings_capacitive_sensor[thisReading] 0;
-  if (minute() == 10 && second() == 58) ||  +
-       (minute() == 20 && second() == 58) || +
-       (minute() == 30 && second() == 58) || +
-       (minute() == 40 && second() == 58) || +
-       (minute() == 50 && second() == 58) +
-     ) { +
-    timeClient.update(); +
-    time_hours = timeClient.getHours(); +
-    time_minutes = timeClient.getMinutes(); +
-    time_seconds timeClient.getSeconds(); +
-    timeClient.end(); +
-    // TODO: how to update days, month and year ? +
-    setTime(*ntp_hours,*ntp_minutes,*ntp_seconds,30,11,19); +
-    delay(500);+
   }   }
 } }
  
-void stateVegetative() { +void loop() { 
-  // 18 hours lights, 6 hours night +  int currentReading = analogRead(capacitive_sensor); 
-  // they turn on 6 in the morning and turn off at the 12 last night +  if( currentReading > 25 && currentReading 1000) { 
-  if ( hour() ) { +    calculateAverage(currentReading);
-    digitalWrite(lights, LOW)+
-    stateLights = 'F';+
   } else {   } else {
-    digitalWrite(lights, HIGH)+    delay(10);
-    stateLights = 'V';+
   }   }
 } }
  
-void stateFlowering() { +void calculateAverage(int currentReading) { 
-  // 12 hours lights, 12 hours night +  total = total - readings_capacitive_sensor[readIndex]; 
-  //  a las 6 de la mañana se prenden y a las 6 de la tarde se apagan +  readings_capacitive_sensor[readIndex] = currentReading; 
-  if ( (hour() >= 6) && (hour() < 18) ) { +  total = total + readings_capacitive_sensor[readIndex]; 
-    digitalWrite(lights, HIGH); +  readIndex++; 
-    stateLights 'V'; +  average = total / numReadings; 
-  } else { +  if (readIndex >= numReadings) { 
-    digitalWrite(lights, LOW)+    Serial.println(average); 
-    stateLights = 'F';+    // envio dato 
 +    readIndex 0
 +    delay(sendingInterval);
   }   }
 +  delay(sendingInterval / numReadings);
 } }
- 
 </code> </code>
  
 +**Calibración amateur**
 +
 +{{:personas:johnny:proyectos:dsc06770.jpg?400|}}
 +
 +
 +{{:personas:johnny:proyectos:dsc06771.jpg?400|}}
 +
 + 
 +El resumen seria que cuando se **superen valores de 600 se deberia de regar**. Pero importante tambien **no regar que se baje hasta llegar a valores cercanos a 490-500**
 +
 +Ahora el siguiente paso serian agregar un metodo de riego con un sistema de riego automatizable.
  
  
  
personas/johnny/proyectos/indoor_diy_autosostenible.1575186014.txt.gz · Última modificación: 2019/12/01 07:40 por kz