import time import board import busio import adafruit_ds18b20 from digitalio import DigitalInOut, Direction import RPi.GPIO as GPIO import csv from datetime import datetime import smtplib from email.mime.text import MIMEText from flask import Flask, render_template app = Flask(__name__) i2c = busio.I2C(board.SCL, board.SDA) ds18 = adafruit_ds18b20.DS18B20(i2c, 0x28) GPIO.setmode(GPIO.BCM) PUMP_PIN = 18 GPIO.setup(PUMP_PIN, GPIO.OUT) TEMP_MAX = 25 PUMP_SPEED = 0 ALERT_EMAIL = "ton_email@example.com" SMTP_SERVER = "smtp.gmail.com" SMTP_USER = "ton_email@gmail.com" SMTP_PASS = "ton_mot_de_passe" def log_data(temp, pump_state): with open("/home/pi/solar_log.csv", "a") as f: writer = csv.writer(f) writer.writerow([datetime.now(), temp, pump_state]) def send_alert(subject, message): msg = MIMEText(message) msg["Subject"] = subject msg["From"] = SMTP_USER msg["To"] = ALERT_EMAIL with smtplib.SMTP_SSL(SMTP_SERVER, 465) as server: server.login(SMTP_USER, SMTP_PASS) server.sendmail(SMTP_USER, ALERT_EMAIL, msg.as_string()) def control_pump(temp): global PUMP_SPEED if temp > TEMP_MAX + 10: GPIO.output(PUMP_PIN, GPIO.HIGH) PUMP_SPEED = 1 print(f"Temp: {temp}°C - Pompe ON") time.sleep(60) # Timeout 1 min GPIO.output(PUMP_PIN, GPIO.LOW) PUMP_SPEED = 0 print(f"Temp: {temp}°C - Pompe OFF (timeout)") send_alert("Surchauffe Panneau", f"Temp: {temp}°C") elif temp > TEMP_MAX + 5: GPIO.output(PUMP_PIN, GPIO.HIGH) PUMP_SPEED = 1 print(f"Temp: {temp}°C - Pompe ON") elif temp < TEMP_MAX: GPIO.output(PUMP_PIN, GPIO.LOW) PUMP_SPEED = 0 print(f"Temp: {temp}°C - Pompe OFF") @app.route("/") def dashboard(): temp = ds18.temperature return render_template("dashboard.html", temp=temp, pump=PUMP_SPEED) with open("templates/dashboard.html", "w") as f: f.write("""
Température: {{ temp }}°C
Pompe: {{ 'ON' if pump else 'OFF' }}
""") try: from threading import Thread Thread(target=lambda: app.run(host="0.0.0.0", port=5000)).start() while True: temp = ds18.temperature control_pump(temp) log_data(temp, PUMP_SPEED) time.sleep(10) except KeyboardInterrupt: GPIO.cleanup() print("Arrêt du SolarShield")