personas:johnny:proyectos:indoor_diy_autosostenible
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previaPróxima revisiónAmbos lados, revisión siguiente | ||
personas:johnny:proyectos:indoor_diy_autosostenible [2019/11/13 06:34] – kz | personas:johnny:proyectos:indoor_diy_autosostenible [2020/07/13 10:05] – kz | ||
---|---|---|---|
Línea 524: | Línea 524: | ||
{{: | {{: | ||
- | <code c++> | + | [[https://gist.github.com/ |
- | /* Librerias usadas | + | |
- | | + | |
- | * https://github.com/PaulStoffregen/ | + | |
- | * https:// | + | |
- | * | + | |
- | * Recursos | + | |
- | * https:// | + | |
- | */ | + | |
- | // import libraries | ||
- | #include < | ||
- | #include < | ||
- | #include < | ||
- | #include < | ||
- | #include < | ||
- | #include < | ||
- | #include < | ||
- | #include < | ||
- | #include < | ||
- | // defines and variables globals sensors | + | ====== Actualización nov 9 2019 ====== |
- | // dth11 | + | |
- | #define DHTPIN 4 // D2 | + | |
- | #define DHTTYPE DHT11 | + | |
- | #define HTTP_TIMEOUT 4000 | + | |
- | // screen oled | + | Hasta ahora la libreria time.h a funcionado muy bien, reemplazandome por completo un rtc. |
- | #define OLED_MOSI 14 // D5 | + | |
- | #define OLED_CLK 16 // D0 | + | |
- | #define OLED_DC 13 // D7 | + | |
- | #define OLED_RESET 12 // D6 | + | |
- | #define OLED_CS 15 // D8 | + | |
- | // lights- relay IN4 | + | === Los datos se puede ver en:=== |
- | int lights | + | |
- | // ventilador - relay IN3 | + | [[http://aqa.unloquer.org: |
- | int air = 0; | + | |
- | // capacitive sensor | + | ====== Actualización nov 12 2019 ====== |
- | const int waterValue | + | |
- | int soilMoistureValue | + | |
- | Adafruit_SSD1306 display(OLED_MOSI, | + | Logro adjuntar a la trama de datos la humedad en la tierra de un sensor de humedad capacitivo. |
- | DHT dht(DHTPIN, DHTTYPE); | + | |
- | void setup() { | + | ====== Actualización 1 diciembre 2019 ====== |
- | Serial.begin(115200); | + | |
- | display.begin(SSD1306_SWITCHCAPVCC); | + | |
- | display.clearDisplay(); | + | |
- | display.setTextSize(0.5); | + | |
- | display.setTextColor(WHITE); | + | |
- | display.setCursor(0, | + | |
- | Serial.println(); | + | |
- | Serial.println(); | + | |
- | // | + | |
- | for(uint8_t t = 4; t > 0; t--) { | + | |
- | Serial.printf(" | + | |
- | Serial.flush(); | + | |
- | delay(1000); | + | |
- | } | + | |
- | // | + | |
- | display.setTextColor(WHITE); | + | |
- | display.setCursor(0, | + | |
- | + | ||
- | // casa del negro | + | |
- | // WiFi.begin(" | + | |
- | + | ||
- | while (WiFi.status() != WL_CONNECTED) { | + | |
- | delay(500); | + | |
- | display.println(" | + | |
- | display.print(" | + | |
- | } | + | |
- | display.display(); | + | Por alguna razón con el código que tengo aqui ... se presenta el problema de que el modulo funciona bien 5 o 6 dias y despues deja de funcionar bien... no apagando la luz cuando debe de estar apagada o viceversa, dejando la luz prendida cuando debe de estar apagada. El problema es que solo se fija una vez el tiempo |
- | delay(3000); | + | en el esp... si estre se reinicia o se va la energia... esto causa que el tiempo se reinicie... ocacionando que el tiempo de las alarmas de las luces no este sincronizado con el tiempo real. |
- | // H, M, S, D, M, A | + | |
- | setTime(14,6,0, | + | |
- | pinMode(lights, | + | |
- | pinMode(air, | + | |
- | dht.begin(); | + | |
- | } | + | |
- | void loop() { | + | *Solución: *Se usan las librerias NTP y Time simultaneamente... en resumen se fija al inicio el tiempo local (libreria |
- | display.clearDisplay(); | + | |
- | display.setTextSize(0.5); | + | |
- | display.setTextColor(WHITE); | + | |
- | display.setCursor(0, | + | |
- | display.print(" | + | |
- | display.print(hour()); | + | |
- | display.print(":" | + | |
- | display.print(minute()); | + | |
- | display.print(":" | + | |
- | display.print(second()); | + | |
- | display.print(" | + | |
- | display.setCursor(0, | + | |
- | // display alarms lights state | + | |
- | lucesFloracion(); | + | |
- | // display capacitive himudity | + | |
- | display.setCursor(0, | + | |
- | soilMoistureValue = analogRead(A0); | + | |
- | display.print(" | + | |
- | display.println(soilMoistureValue); | + | |
- | delay(500); | + | |
- | // display dht sensor | + | |
- | display.setCursor(0, | + | |
- | int h = dht.readHumidity(); | + | |
- | int t = dht.readTemperature(); | + | |
- | if (isnan(h) || isnan(t)) { | + | |
- | display.println(F(" | + | |
- | return; | + | |
- | } | + | |
- | display.print(F(" | + | |
- | display.print(h); | + | |
- | display.print(F(" | + | |
- | display.print(t); | + | |
- | display.print(F(" | + | |
- | display.println("" | + | |
- | // run air at inddor | + | |
- | ventilacion(); | + | |
- | display.display(); | + | |
- | sendDataInflux(String(h), | + | |
- | } | + | |
- | void lucesVegetativo() { | + | *TODO* |
- | // 18 horas luz, 6 horas oscuridad | + | |
- | // se prenden a las 6 de la mañana y se apagan a las 12 de la noche | + | |
- | if ( hour() < 6 ) { | + | |
- | digitalWrite(lights, | + | |
- | display.println(" | + | |
- | } else { | + | |
- | digitalWrite(lights, | + | |
- | display.println(" | + | |
- | } | + | |
- | } | + | |
- | void lucesFloracion() { | + | - *RAPIDO*: integrar al código actual al actualizacion con el servidor NTP |
- | | + | |
- | // a las 6 de la mañana se prenden | + | - pensar en una interfaz para pedir al usuario la programacion |
- | if ( (hour() >= 6) && (hour() < 18) ) { | + | |
- | digitalWrite(lights, | + | |
- | display.println(" | + | |
- | | + | |
- | digitalWrite(lights, LOW); | + | |
- | display.println(" | + | |
- | | + | |
- | } | + | |
- | void ventilacion() { | + | ====== |
- | // se prende cada 15 min 1 min | + | |
- | if ( (minute() | + | |
- | digitalWrite(air, | + | |
- | } else { | + | |
- | digitalWrite(air, | + | |
- | } | + | |
- | } | + | |
- | String influxFrame( String dht11_humidity, String dht11_temperature, String soilCapacitiveSensor) { | + | 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 |
- | const String SENSOR_ID = " | + | Entonces antes de seguir con el codigo y el prototipo |
- | const String STR_COMMA = ","; | + | |
- | const String STR_SLASH = "/"; | + | |
- | const String STR_DOT = "."; | + | |
- | const String STR_COLON = ":"; | + | |
- | const String STR_NULL = " | + | |
- | const String STR_ZERO = " | + | |
- | const String STR_SPACE = " "; | + | |
- | + | ||
- | // El primer dato en el squema | + | |
- | String frame = SENSOR_ID + STR_COMMA + " | + | |
- | + | ||
- | // Add GPS data | + | |
- | frame += " | + | |
- | frame += "6.2563143" | + | |
- | frame += " | + | |
- | frame += " | + | |
- | frame += " | + | |
- | frame += STR_ZERO + STR_COMMA; | + | |
- | frame += " | + | |
- | frame += STR_ZERO + STR_COMMA; | + | |
- | frame += " | + | |
- | frame += STR_ZERO + STR_COMMA; | + | |
- | + | ||
- | //Add DHT11 data | + | |
- | //if | + | |
- | frame += " | + | |
- | frame += dht11_humidity + STR_COMMA; | + | |
- | frame += " | + | |
- | frame += dht11_temperature + STR_COMMA; | + | |
- | // } else { | + | |
- | // frame += " | + | |
- | // } | + | |
- | // ADD capacitive sensor data | + | He dispuesto un extrator |
- | frame += " | + | |
- | frame += soilCapacitiveSensor + STR_COMMA; | + | |
- | + | ||
- | // Add Plantower data | + | |
- | // if | + | |
- | frame += " | + | |
- | frame += STR_ZERO + STR_COMMA; | + | |
- | frame += " | + | |
- | frame += STR_ZERO + STR_COMMA; | + | |
- | frame += " | + | |
- | frame += STR_ZERO; | + | |
- | // } else { | + | |
- | // frame += " | + | |
- | // } | + | |
- | + | ||
- | return frame; | + | |
- | } | + | |
- | + | ||
- | // función que envía la trama de datos | + | |
- | void sendDataInflux ( String humidity, String temperature, | + | |
- | // El post a la base de datos tiene una trama siguiente: | + | |
- | // volker0001, | + | |
- | // Para nuestro caso que SOLO es el envío de datos del dht_11 que es humedad | + | |
- | // DHT11_llanadas, | + | |
- | | + | |
- | HTTPClient http; | + | |
- | // _testsensorhumedad es el nombre de la DB donde se almacenan estos datos | + | |
- | http.begin(" | + | |
- | http.setTimeout(HTTP_TIMEOUT); | + | |
- | http.addHeader(" | + | |
- | // esto se debe de integrar con el soil capacitive sensor | + | ANTES |
- | // String frame = influxFrame(humidity, | + | |
- | String frame = influxFrame(humidity, | + | |
- | + | ||
- | int httpCode = http.POST(frame); | + | |
- | + | ||
- | if(httpCode > 0) { | + | |
- | String payload = http.getString(); | + | |
- | Serial.println(payload); | + | |
- | Serial.println(" | + | |
- | } else { | + | |
- | Serial.print(" | + | |
- | Serial.println(http.errorToString(httpCode).c_str()); | + | |
- | } | + | |
- | | + | |
- | } | + | |
- | delay(60000); | + | |
- | } | + | |
- | </ | + | |
+ | {{: | ||
- | ====== Actualización nov 9 2019 ====== | + | AHORA |
- | Hasta ahora la libreria time.h a funcionado muy bien, reemplazandome por completo un rtc. | + | {{: |
- | === Los datos se puede ver en:=== | + | 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. |
- | [[http:// | + | {{:personas:johnny: |
- | ====== Actualización nov 12 2019 ====== | + | {{: |
- | Logro adjuntar a la trama de datos la humedad en la tierra de un sensor de humedad capacitivo. | + | En este cultivo tambien estuve experimentando y aprendiendo sobre las podas. En especial |
+ | {{: | ||
- | Tareas | + | 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. |
- | <WRAP center round alert 60%> | + | {{: |
- | En esta imlementación de POST hacia una base de datos, se cae el esp y hace que reinice | + | {{: |
- | </ | + | |
- | - Enviar trama de datos al influx: HECHO | + | Dadas las experimentaciones, |
- | - integrar una web en la flash para programar | + | |
- | - pensar | + | 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 |
- | - sacar una tarjetica | + | |
- | - actualizar el firmware por medio de ota | + | ** Pasamos la placa base a baquela y actualizaciones y fixes en el código** |
+ | |||
+ | Primero hablaremos de la placa. Entonces antes teniamos este hardware, 4 reles (de los cuales solo estoy usando 1) y una pantallita | ||
+ | |||
+ | Antes | ||
+ | |||
+ | {{: | ||
+ | |||
+ | 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. | ||
+ | |||
+ | Por otro lado estabamos haciendo un request | ||
+ | |||
+ | 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 | ||
+ | |||
+ | 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 | ||
+ | {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | **Arquitectura del firmware** | ||
+ | |||
+ | {{: | ||
+ | |||
+ | 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 | ||
+ | |||
+ | **Mientras eso ocurre no es adecuado presionar el boton para cambiar el ciclo de floracion. 60%>** | ||
+ | |||
+ | **Como funciona actualmente** | ||
+ | |||
+ | Tenemos basicamente 4 estados. | ||
+ | |||
+ | 1 - Cyan: Indica estado vegetativo de dia. Las luces se encianden | ||
+ | 2 - Azul: Indica estado vegetativo de noche. Las luces se encienden a las 18 y se apagan a las 12 del otro dia | ||
+ | 3 - Naranja: Indica estado floracion de dia. Las luces se encienden a las 6 y se apagan a las 18 | ||
+ | 4 - Magenta: indica estado floracion de noche. Las luces se encienden a las 18 y se apagan a las 6 del otro dia. | ||
+ | |||
+ | Estos estados fueron ideados y pensados principamente por dos razones: | ||
+ | 1. No tener que estar programando el esp para cambiar el fotoperido de las luces. | ||
+ | 2. favoreces 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 calurosos, se 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 | ||
+ | |||
+ | Con luces apagadas en el dia... osea configuracion azul, la temperatura no supera los 25, 26 grados. Datos adecuados.... no ideales pero mas cercanos a los necesarios. | ||
+ | |||
+ | Ahora la placa sobre la baquelita :-o | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{: | ||
- | |||
personas/johnny/proyectos/indoor_diy_autosostenible.txt · Última modificación: 2020/08/13 06:00 por kz