Hola comunidad de arduino, saludos desde Chile
Debido a la pandemia, hemos tenido que parar y quedarnos en casa, a reflexionar. Mi acercamiento a las
entidades de estudio no ha sido muy buena(como para estudiar una ingeniería), pero siempre he intentado aprender de manera independiente. Y en esta oportunidad me gustaría aprender a automatizar algunos procesos y a programar arduino, no esperar el codigo listo, sino comprender la magia detras.
A favor de esto, estoy dispuesto a leer toda la internet con tal de aprender, me gustaria que me recomendaran informacion ad hoc para esta mision
Me ha cautivado un proyecto que esta cerrado el dia de hoy que es el cutivo autonomo de Hiddennotebook
(https://forum.arduino.cc/index.php?topic=303135.0)
Cuento con el mismo Hardware:
-
Arduino Mega
-
ESP8266-01 Modulo wifi
-
Display QVGA 2.2 TFT SPI 240x320
-
DHT22 digital temperature and humidity sensor
-
Soil Hygrometer Humidity Detection Module
-
5V two 2 Channel Relay Module With optocoupler
-
Dispenser Flowmeter Flow Sensor. Inner diameter 3mm DC 5-24v
-
DS3231 AT24C32 Reloj en tiempo real de precisión.
-
Bomba de riego a 12v 60w 5L/min
-
Una bomba peristáltica, para mezclar fertilizantes.
He armado el sistema y me ha funcionado de lo mejor, y a lo largo del tiempo he descubierto que los soil sensor son toxicos y dejan de funcionar, asi que intente darle un upgrade, sacando los sensores y cambiando la fuente de poder por un YwRobot mb102. Haciendo esto me di cuenta que todo el sistema estaba en funcion de la humedad de suelo.
y ha quedado esto
//Se retira ATX,LED,BOTON
//5-7-20: se retiran sensores de suelo, por toxicidad
// TFT:
#include "Adafruit_GFX.h" // Librerias para pantalla QVGA 2.2 TFT SPI 240*320
#include "Adafruit_ILI9341.h"
// RTC:
#include "RTClib.h" // Cargar Libreria RTC.
#include <Wire.h> // Cargar Libreria comunicacion I2C.
#include "SPI.h" // Cargar Libreria comunicacion SPI.
RTC_DS1307 RTC; // Crear RTC
const char* DayTXT[7]= {"Domingo ", "Lunes ", "Martes ", "Miercoles ","Jueves ", "Viernes ", "Sabado "};
// DHT22
#include "DHT.h" // Cargar Librería DHT.
#define DHTPIN 25 // Seleccionamos el pin en el que se conectará el sensor.
#define DHTTYPE DHT22 // Se selecciona el DHT22(hay otros DHT).
DHT dht(DHTPIN, DHTTYPE); // Variable usada para comunicarse con el sensor DHT22.
// ARDUINO MEGA:
#define TFT_DC 47
#define TFT_CS 48
#define TFT_RST 49
Adafruit_ILI9341 tft = Adafruit_ILI9341 (TFT_CS, TFT_DC, TFT_RST);
// RELAY PUMP1
#define RELAY_ON 0 // Rele encendido en estado 0
#define RELAY_OFF 1 // Rele apagado en estado 1
#define RELAY_1 39 // Rele pin 1 al 39
// END RELAY PUMP1
char textBuff[50]; // Buffer Para imprimir datos de sensores en TFT.
int botonAnt;
unsigned long updateScreen; // Creamos variable para refrescar la pantalla
unsigned long moistureTest; // Variable para refrescar datos del sensor de suelo
void setup() {
//-------------- RELAY PUMP1 ------------------------
pinMode(RELAY_1, OUTPUT); // define el pin 39 como salida activa rele 1 para la bomba.
//-------------- TFT SETTINGS -----------------------
tft.begin(); // Inicia TFT 2.2"
tft.setRotation(3); // Rotación de pantalla.
tft.setTextWrap(true); // Si el texto no cabe pasarlo a la siguiente linea.
tft.fillScreen(ILI9341_BLACK); // Rellenar la pantalla con fondo negro.
//-------------- RTC --------------------------------
Wire.begin(); // Inicia el puerto I2C.
RTC.begin(); // Inicia la comunicacion con el RTC.
//RTC.adjust(DateTime(2000,001,01, 00,00,00));
//-------------- DHT --------------------------------
dht.begin(); //Se inicia el sensor DHT22.
}
void loop() {
if (millis() - updateScreen > 1000UL) //refrescamos la pantalla cada segundo
{
display();
updateScreen = millis();
}
}
void display() { // Rutina para mostrar datos en TFT
//-------------- RTC --------------------------------
DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC.
//-------------- DHT --------------------------------
int h = dht.readHumidity(); // Lee la humedad DHT22.
int t = dht.readTemperature(); // Lee la temperatura DHT22.
//-------------- TFT DISPLAY DATA --------------------
//(header)
// DAY ON TEXT:
tft.setTextColor(ILI9341_GREEN, ILI9341_BLACK);
tft.setTextSize(2);
tft.setCursor(0, 0);
tft.println(DayTXT[now.dayOfTheWeek()]); // Aqui tengo que arreglar la sobreescritura de caracteres
tft.setCursor(160, 0);
tft.println("ArduIndoor");
// DATE:
char DateBuffer[16];
sprintf(DateBuffer, "%02d:%02d:%02d", now.day(), now.month(), now.year());
tft.print(DateBuffer);
tft.setCursor(160, 30);
// CLOCK RTC:
char ClockBuffer[16]; // Creamos myBuffer para mostrar bien los digitos del 1 al 9.
sprintf(ClockBuffer, "%02d:%02d", now.hour(), now.minute());
tft.setTextSize(3);
tft.println(ClockBuffer);
// DATA:
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.setTextSize(2);
tft.println("\nDatos del ambiente:\n");
//(body)
// DHT:
tft.setTextSize(2);
sprintf(textBuff, "Humedad aire: %3d%", h);
tft.print(textBuff);
tft.println("%");
sprintf(textBuff, "\nTemperatura aire:%3d%cC\n", t, (char)247);
tft.println(textBuff);
//(footer)
// REFERENCES:
tft.setTextColor(ILI9341_CYAN);
tft.setTextSize(2);
tft.setCursor(15, 200);
tft.print("Te amo Lulita Hermosita");
//-------------- END TFT ----------------------------
}
Como en realidad no funciona muy bien este proyecto sin esas partes, he decidido replantearlo en base a esta tabla:
Realmente me ha costado centrar mis ideas y mi intencion hacia este proyecto, ya que con youtube (una de mis fuente de documentacion y tutoriales) me surgen ideas locas y no puedo concentrarme en solucionar mi problema. Como por ejemplo, tengo la idea de tener un estanque para el agua donde se mezclen los fertilizantes (todos medidos con un sensor de flujo y la cantidad de agua con un sensor ultrasonico)y el riego sea por goteo (controlado por otro sensor de flujo y una bomba de diafragma)
Info:
medidor de flujo: https://naylampmechatronics.com/blog/47_tutorial-sensor-de-flujo-de-agua.html
medidor de nivel:https://programarfacil.com/blog/arduino-blog/sensor-de-nivel-de-agua-con-arduino/
Mi duda es como debería afrontar este problema, he visto videos de maquinas de estados finitos, time sheduler y time alarms. Pero realmente no se muy bien como aplicarlos a este topico.
Tampoco se si deberia cambiar de pantalla a una lcd, no he encontrado mucha informacion sobre la tft screen, no se si se pueden configurar diferentes pantallas para mostrar la informacion.
(He tenido en cuenta este post: https://forum.arduino.cc/index.php?topic=346755.0)
Esta es mi idea de la informacion mostrada en tft:
Info:
maquina de estados finitos:Implementar una máquina de estados finitos en Arduino
time alarms: TimeAlarms Library, Run Functions At Specific Times
Tengo un intento de estados finitos en papel, pero esta en proceso de arreglos
Estoy estancado, confundido y un poco desmotivado.
Cualquier ayuda es bien recibida.