pleasedontcode

Smart Automation rev_01

Nov 19th, 2025
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 10.32 KB | None | 0 0
  1. /********* Pleasedontcode.com **********
  2.  
  3.     Pleasedontcode thanks you for automatic code generation! Enjoy your code!
  4.  
  5.     - Terms and Conditions:
  6.     You have a non-exclusive, revocable, worldwide, royalty-free license
  7.     for personal and commercial use. Attribution is optional; modifications
  8.     are allowed, but you're responsible for code maintenance. We're not
  9.     liable for any loss or damage. For full terms,
  10.     please visit pleasedontcode.com/termsandconditions.
  11.  
  12.     - Project: Smart Automation
  13.     - Source Code NOT compiled for: ESP32 DevKit V1
  14.     - Source Code created on: 2025-11-19 21:19:09
  15.  
  16. ********* Pleasedontcode.com **********/
  17.  
  18. /****** SYSTEM REQUIREMENTS *****/
  19. /****** SYSTEM REQUIREMENT 1 *****/
  20.     /* relé umidificatore On se rh da dht11 <82 e off se */
  21.     /* rh da dht11 >85. relé ventole (AC e DC) on 6 volte */
  22.     /* in 24 ore per 74 secondi ogni volta. relé luci 12 */
  23.     /* ore on e 12 ore off */
  24. /****** END SYSTEM REQUIREMENTS *****/
  25.  
  26.  
  27. /* START CODE */
  28.  
  29. /*******************************************************
  30.  * ESP32 + Blynk IoT + DHT11 + Fototransistor + 4 Relè + Buzzer
  31.  * - Umidificatore: isteresi RHmin/RHmax (editabili da app)
  32.  * - Ventole: 6 cicli/24h, ON 74 s ciascuno (2 relè: DC e AC)
  33.  * - Luci: 12 h ON / 12 h OFF (ciclo relativo all'avvio)
  34.  * - Fototransistor: verifica accensione luci (soglia editabile)
  35.  * - Allarmi (buzzer attivo):
  36.  *    A) RH < RHmin per 30 min: 1 min beep 1 s ON / 1 s OFF
  37.  *    B) Luci dovrebbero essere ON ma luce < soglia per 30 min:
  38.  *       1 min beep 2 s ON / 2 s OFF
  39.  *   Dopo 1 min l'allarme si ferma; la finestra 30 min riparte.
  40.  *******************************************************/
  41.  
  42. #define BLYNK_TEMPLATE_ID "TMPL4X0xNGkPD"
  43. #define BLYNK_TEMPLATE_NAME "Camera Fruttificazione"
  44. #define BLYNK_AUTH_TOKEN "yu5gwTTfR31Gf1GBrGyEn8i2rxM7Ie9y"
  45.  
  46. #define BLYNK_PRINT Serial
  47.  
  48. #include <WiFi.h>
  49. #include <BlynkSimpleEsp32.h>  // Blynk IoT per ESP32  (Virtual Pins, BlynkTimer)
  50. #include <DHT.h>               // Adafruit DHT library
  51.  
  52. // ---- Credenziali Wi-Fi ----
  53. char ssid[] = "WiFi";
  54. char pass[] = "azz";
  55. // ====== Pinout ======
  56. #define PIN_DHT          4
  57. #define PIN_PHOTO        34   // ADC1 (necessario con WiFi attivo)
  58. #define PIN_RELAY_HUM    26
  59. #define PIN_RELAY_FAN_DC 27
  60. #define PIN_RELAY_FAN_AC 25
  61. #define PIN_RELAY_LIGHT  33
  62. #define PIN_BUZZER       32
  63.  
  64. // Moduli relè spesso "active LOW"
  65. #define RELAY_ACTIVE_ON   LOW
  66. #define RELAY_ACTIVE_OFF  HIGH
  67.  
  68. // ====== DHT ======
  69. #define DHTTYPE DHT11
  70. DHT dht(PIN_DHT, DHTTYPE);
  71.  
  72. // ====== Blynk ======
  73. BlynkTimer timer;
  74.  
  75. // Virtual Pins
  76. #define VP_HUM       V0
  77. #define VP_TMP       V1
  78. #define VP_HUM_RLY   V2
  79. #define VP_FAN_DC    V3
  80. #define VP_FAN_AC    V4
  81. #define VP_LIGHT_RLY V5
  82. #define VP_PHOTO     V6
  83. #define VP_RH_MIN    V7
  84. #define VP_RH_MAX    V8
  85. #define VP_LUX_THR   V9
  86. #define VP_EMERG     V10
  87. #define VP_ALARM     V11
  88.  
  89. // ====== Parametri editabili da app (default) ======
  90. volatile float rhMin = 82.0;   // % RH
  91. volatile float rhMax = 85.0;   // % RH
  92. volatile int   lightThreshold = 200; // ADC 0..4095
  93.  
  94. // ====== Stati ======
  95. bool emergency = false;
  96. bool humidifierOn = false;
  97. bool fanDCOn = false;
  98. bool fanACOn = false;
  99. bool lightsOn = false;
  100.  
  101. // Scheduli
  102. const unsigned long FAN_PERIOD     = 4UL * 60UL * 60UL * 1000UL; // ogni 4 h (6 volte/24h)
  103. const unsigned long FAN_ON_TIME    = 74UL * 1000UL;              // 74 s
  104. unsigned long nextFanMillis = 0;
  105.  
  106. const unsigned long LIGHT_HALF_DAY = 12UL * 60UL * 60UL * 1000UL; // 12 h
  107. unsigned long nextLightToggle = 0;
  108.  
  109. // Allarmi (finestre 30 min)
  110. const unsigned long WINDOW_30M = 30UL * 60UL * 1000UL;
  111. unsigned long lowRHStart = 0;
  112. unsigned long darkStart = 0;
  113.  
  114. // ====== Buzzer / allarme ======
  115. enum AlarmType { ALARM_NONE, ALARM_HUM_LOW, ALARM_LIGHT_FAIL };
  116. AlarmType currentAlarm = ALARM_NONE;
  117.  
  118. bool alarmActive = false;
  119. bool buzzerState = false;         // stato ON/OFF corrente del buzzer
  120. uint16_t buzzerPeriodMs = 1000;   // 1000 o 2000
  121. int buzzerToggleTimerId = -1;
  122. int alarmStopTimerId = -1;
  123.  
  124. // ====== Prototipi funzioni ======
  125. void setRelay(int pin, bool on);
  126. void publishStates();
  127. void startBuzzer(AlarmType t, uint16_t periodMs, const char* logEventCode, const char* msg);
  128.  
  129. void readAndPublishSensors();
  130. void controlHumidifier();
  131. void fanScheduler();
  132. void lightScheduler();
  133. void checkAlarms();
  134.  
  135. // Callback timer (no lambda)
  136. void buzzerToggleTask();
  137. void alarmStopTask();
  138. void fanOffTask();
  139.  
  140. // ====== Utility ======
  141. void setRelay(int pin, bool on) {
  142.   digitalWrite(pin, on ? RELAY_ACTIVE_ON : RELAY_ACTIVE_OFF);
  143. }
  144.  
  145. void publishStates() {
  146.   Blynk.virtualWrite(VP_HUM_RLY, humidifierOn);
  147.   Blynk.virtualWrite(VP_FAN_DC,  fanDCOn);
  148.   Blynk.virtualWrite(VP_FAN_AC,  fanACOn);
  149.   Blynk.virtualWrite(VP_LIGHT_RLY, lightsOn);
  150. }
  151.  
  152. // ====== Blynk ======
  153. BLYNK_CONNECTED() {
  154.   Blynk.syncVirtual(VP_RH_MIN, VP_RH_MAX, VP_LUX_THR, VP_EMERG);
  155. }
  156.  
  157. BLYNK_WRITE(VP_RH_MIN) { rhMin = param.asFloat(); }
  158. BLYNK_WRITE(VP_RH_MAX) { rhMax = param.asFloat(); }
  159. BLYNK_WRITE(VP_LUX_THR){ lightThreshold = param.asInt(); }
  160.  
  161. BLYNK_WRITE(VP_EMERG)  {
  162.   emergency = param.asInt();
  163.   if (emergency) {
  164.     // spegni tutto
  165.     humidifierOn = fanDCOn = fanACOn = lightsOn = false;
  166.     setRelay(PIN_RELAY_HUM,   false);
  167.     setRelay(PIN_RELAY_FAN_DC,false);
  168.     setRelay(PIN_RELAY_FAN_AC,false);
  169.     setRelay(PIN_RELAY_LIGHT, false);
  170.     publishStates();
  171.   } else {
  172.     // riavvia scheduler da ora
  173.     nextFanMillis   = millis() + FAN_PERIOD;
  174.     nextLightToggle = millis() + LIGHT_HALF_DAY;
  175.   }
  176. }
  177.  
  178. // ====== Sensori e logiche ======
  179. void readAndPublishSensors() {
  180.   float h = dht.readHumidity();
  181.   float t = dht.readTemperature();
  182.  
  183.   if (!isnan(h) && !isnan(t)) {
  184.     Blynk.virtualWrite(VP_HUM, h);
  185.     Blynk.virtualWrite(VP_TMP, t);
  186.   }
  187.  
  188.   int raw = analogRead(PIN_PHOTO); // 0..4095
  189.   Blynk.virtualWrite(VP_PHOTO, raw);
  190.  
  191.   // Gestione finestre 30 min
  192.   unsigned long now = millis();
  193.  
  194.   if (!isnan(h)) {
  195.     if (h < rhMin) {
  196.       if (lowRHStart == 0) lowRHStart = now;
  197.     } else {
  198.       lowRHStart = 0;
  199.     }
  200.   }
  201.  
  202.   if (lightsOn) {
  203.     if (raw < lightThreshold) {
  204.       if (darkStart == 0) darkStart = now;
  205.     } else {
  206.       darkStart = 0;
  207.     }
  208.   } else {
  209.     darkStart = 0;
  210.   }
  211. }
  212.  
  213. void controlHumidifier() {
  214.   if (emergency || alarmActive) return;
  215.  
  216.   float h = dht.readHumidity();
  217.   if (isnan(h)) return;
  218.  
  219.   if (!humidifierOn && h < rhMin) {
  220.     humidifierOn = true;
  221.   } else if (humidifierOn && h > rhMax) {
  222.     humidifierOn = false;
  223.   }
  224.   setRelay(PIN_RELAY_HUM, humidifierOn);
  225.   Blynk.virtualWrite(VP_HUM_RLY, humidifierOn);
  226. }
  227.  
  228. void fanScheduler() {
  229.   if (emergency || alarmActive) return;
  230.  
  231.   unsigned long now = millis();
  232.   if (now >= nextFanMillis) {
  233.     // Avvia ON di 74 s per entrambe le ventole
  234.     fanDCOn = fanACOn = true;
  235.     setRelay(PIN_RELAY_FAN_DC, true);
  236.     setRelay(PIN_RELAY_FAN_AC, true);
  237.     publishStates();
  238.  
  239.     // Spegni dopo 74 s (callback senza lambda)
  240.     timer.setTimeout(FAN_ON_TIME, fanOffTask);
  241.  
  242.     nextFanMillis = now + FAN_PERIOD;
  243.   }
  244. }
  245.  
  246. void lightScheduler() {
  247.   if (emergency || alarmActive) return;
  248.  
  249.   unsigned long now = millis();
  250.   if (now >= nextLightToggle) {
  251.     lightsOn = !lightsOn; // 12 h ON / 12 h OFF
  252.     setRelay(PIN_RELAY_LIGHT, lightsOn);
  253.     Blynk.virtualWrite(VP_LIGHT_RLY, lightsOn);
  254.     nextLightToggle = now + LIGHT_HALF_DAY;
  255.   }
  256. }
  257.  
  258. void checkAlarms() {
  259.   if (alarmActive || emergency) return;
  260.  
  261.   unsigned long now = millis();
  262.  
  263.   // A) Umidità bassa persistente 30 min
  264.   if (lowRHStart != 0 && (now - lowRHStart >= WINDOW_30M)) {
  265.     lowRHStart = 0;
  266.     startBuzzer(ALARM_HUM_LOW, 1000, "humidity_low_30m", "Umidità sotto soglia per 30 minuti");
  267.     return;
  268.   }
  269.  
  270.   // B) Luci ON attese ma non rilevate per 30 min
  271.   if (darkStart != 0 && (now - darkStart >= WINDOW_30M)) {
  272.     darkStart = 0;
  273.     startBuzzer(ALARM_LIGHT_FAIL, 2000, "light_fail_30m", "Luci attese ON ma non rilevate per 30 minuti");
  274.     return;
  275.   }
  276. }
  277.  
  278. // ====== Buzzer ======
  279. void startBuzzer(AlarmType t, uint16_t periodMs, const char* logEventCode, const char* msg) {
  280.   if (alarmActive) return;
  281.  
  282.   alarmActive = true;
  283.   currentAlarm = t;
  284.   buzzerPeriodMs = periodMs;
  285.  
  286.   if (logEventCode) {
  287.     Blynk.logEvent(logEventCode, msg); // Richiede eventi creati nel Template
  288.   }
  289.  
  290.   Blynk.virtualWrite(
  291.     VP_ALARM,
  292.     (t == ALARM_HUM_LOW)    ? "ALLARME: Umidità bassa" :
  293.     (t == ALARM_LIGHT_FAIL) ? "ALLARME: Luci non rilevate" : ""
  294.   );
  295.  
  296.   pinMode(PIN_BUZZER, OUTPUT);
  297.   buzzerState = true;
  298.   digitalWrite(PIN_BUZZER, HIGH);
  299.  
  300.   // Toggle periodico (1 s o 2 s)
  301.   buzzerToggleTimerId = timer.setInterval(buzzerPeriodMs, buzzerToggleTask);
  302.  
  303.   // Stop dopo 60 s
  304.   alarmStopTimerId = timer.setTimeout(60UL * 1000UL, alarmStopTask);
  305. }
  306.  
  307. void buzzerToggleTask() {
  308.   buzzerState = !buzzerState;
  309.   digitalWrite(PIN_BUZZER, buzzerState ? HIGH : LOW);
  310. }
  311.  
  312. void alarmStopTask() {
  313.   if (buzzerToggleTimerId != -1) {
  314.     timer.disable(buzzerToggleTimerId);
  315.     timer.deleteTimer(buzzerToggleTimerId);
  316.     buzzerToggleTimerId = -1;
  317.   }
  318.   digitalWrite(PIN_BUZZER, LOW);
  319.   alarmActive = false;
  320.   currentAlarm = ALARM_NONE;
  321.   Blynk.virtualWrite(VP_ALARM, "");
  322. }
  323.  
  324. void fanOffTask() {
  325.   fanDCOn = fanACOn = false;
  326.   setRelay(PIN_RELAY_FAN_DC, false);
  327.   setRelay(PIN_RELAY_FAN_AC, false);
  328.   publishStates();
  329. }
  330.  
  331. // ====== Setup/Loop ======
  332. void setup() {
  333.   Serial.begin(115200);
  334.  
  335.   // Relè
  336.   pinMode(PIN_RELAY_HUM,    OUTPUT);
  337.   pinMode(PIN_RELAY_FAN_DC, OUTPUT);
  338.   pinMode(PIN_RELAY_FAN_AC, OUTPUT);
  339.   pinMode(PIN_RELAY_LIGHT,  OUTPUT);
  340.   // Tutto OFF
  341.   setRelay(PIN_RELAY_HUM,   false);
  342.   setRelay(PIN_RELAY_FAN_DC,false);
  343.   setRelay(PIN_RELAY_FAN_AC,false);
  344.   setRelay(PIN_RELAY_LIGHT, false);
  345.   publishStates();
  346.  
  347.   // ADC: 12 bit e attenuazione 11 dB (~0..3.1 V)
  348.   analogReadResolution(12);
  349.   analogSetPinAttenuation(PIN_PHOTO, ADC_11db);
  350.  
  351.   dht.begin();
  352.  
  353.   Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  354.  
  355.   // Timers (funzioni senza lambda)
  356.   timer.setInterval(2000, readAndPublishSensors); // ogni 2 s
  357.   timer.setInterval(1000, controlHumidifier);     // ogni 1 s
  358.   timer.setInterval(1000, fanScheduler);          // ogni 1 s
  359.   timer.setInterval(1000, lightScheduler);        // ogni 1 s
  360.   timer.setInterval(5000, publishStates);         // ogni 5 s
  361.   timer.setInterval(10000, checkAlarms);          // ogni 10 s
  362.  
  363.   // Inizializza scheduler da "adesso"
  364.   unsigned long now = millis();
  365.   nextFanMillis   = now;                  // prima accensione ventole subito
  366.   lightsOn        = true;                 // avvia con 12 h ON
  367.   setRelay(PIN_RELAY_LIGHT, lightsOn);
  368.   Blynk.virtualWrite(VP_LIGHT_RLY, lightsOn);
  369.   nextLightToggle = now + LIGHT_HALF_DAY;
  370. }
  371.  
  372. void loop() {
  373.   Blynk.run();
  374.   timer.run();
  375. }
  376.  
  377. /* END CODE */
  378.  
Advertisement
Add Comment
Please, Sign In to add comment