/* * TipTop - Moniteur de température * Board : Adafruit Feather ESP32-S2 * Capteur: DS18B20 (OneWire sur broche A2) * Rouge → 3V * Jaune → A2 (données) + résistance 4.7kΩ entre jaune et rouge * Noir → GND * LED : NeoPixel intégré (broche 33) * Seuil : 57 °C → vert si < 57 | rouge si ≥ 57 * Telegram: message envoyé quand la température repasse sous 57 °C */ #include #include #include #include #include #include // ───────────────────────────────────────────── // CONFIGURATION → remplissez ces valeurs // ───────────────────────────────────────────── const char* WIFI_SSID = "iPhone"; const char* WIFI_PASSWORD = "tortue2000"; const String BOT_TOKEN = "8699409267:AAEIkSJwbAoe6kpGztx5k-FugjZc4S_q148"; const String CHAT_ID = "8797119126"; const float SEUIL_TEMP = 57.0; // seuil en °C // ───────────────────────────────────────────── // NeoPixel intégré du Feather ESP32-S2 #define NEOPIXEL_PIN 33 #define NEOPIXEL_COUNT 1 Adafruit_NeoPixel pixel(NEOPIXEL_COUNT, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800); // DS18B20 sur la broche A2 #define ONE_WIRE_PIN A2 OneWire oneWire(ONE_WIRE_PIN); DallasTemperature capteur(&oneWire); // État précédent pour détecter le passage sous le seuil bool etaitChaud = false; // ───────────────────────────────────────────── void setup() { Serial.begin(115200); delay(500); Serial.println("\n== TipTop démarrage =="); // NeoPixel pixel.begin(); pixel.setBrightness(80); pixel.show(); // DS18B20 capteur.begin(); if (capteur.getDeviceCount() == 0) { Serial.println("DS18B20 non trouvé ! Vérifiez le câblage."); // Bleu clignotant = erreur capteur while (true) { pixel.clear(); pixel.show(); delay(300); setCouleur(0, 0, 50); delay(300); } } Serial.print("DS18B20 détecté — "); Serial.print(capteur.getDeviceCount()); Serial.println(" capteur(s) trouvé(s)."); // WiFi Serial.print("Connexion WiFi"); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi connecté — IP : " + WiFi.localIP().toString()); } // ───────────────────────────────────────────── void loop() { capteur.requestTemperatures(); float temperature = capteur.getTempCByIndex(0); // Valeur invalide retournée par le capteur if (temperature == DEVICE_DISCONNECTED_C) { Serial.println("Erreur : capteur déconnecté !"); setCouleur(0, 0, 50); // bleu = erreur delay(2000); return; } Serial.print("Température : "); Serial.print(temperature, 1); Serial.println(" °C"); if (temperature >= SEUIL_TEMP) { // ── Trop chaud → LED rouge ── setCouleur(255, 0, 0); etaitChaud = true; } else { // ── En dessous du seuil → LED verte ── setCouleur(0, 255, 0); // Envoi Telegram uniquement lors du passage chaud → froid if (etaitChaud) { Serial.println("Passage sous le seuil → envoi Telegram…"); envoyerTelegram("🍵 Votre boisson est prête. Signé TipTop."); etaitChaud = false; } } delay(2000); // lecture toutes les 2 secondes } // ───────────────────────────────────────────── // Allume le NeoPixel avec la couleur RGB // ───────────────────────────────────────────── void setCouleur(uint8_t r, uint8_t g, uint8_t b) { pixel.setPixelColor(0, pixel.Color(r, g, b)); pixel.show(); } // ───────────────────────────────────────────── // Envoie un message via l'API Telegram Bot // ───────────────────────────────────────────── void envoyerTelegram(String message) { if (WiFi.status() != WL_CONNECTED) { Serial.println("WiFi déconnecté, message non envoyé."); return; } HTTPClient http; String url = "https://api.telegram.org/bot" + BOT_TOKEN + "/sendMessage?chat_id=" + CHAT_ID + "&text=" + urlencode(message); http.begin(url); int code = http.GET(); if (code == 200) { Serial.println("Message Telegram envoyé ✓"); } else { Serial.println("Erreur Telegram : HTTP " + String(code)); } http.end(); } // ───────────────────────────────────────────── // Encode une chaîne pour URL (espaces, accents…) // ───────────────────────────────────────────── String urlencode(String str) { String encoded = ""; char c; for (int i = 0; i < str.length(); i++) { c = str.charAt(i); if (isAlphaNumeric(c) || c == '-' || c == '_' || c == '.' || c == '~') { encoded += c; } else { encoded += '%'; if ((uint8_t)c < 16) encoded += '0'; encoded += String((uint8_t)c, HEX); } } return encoded; }