#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/interrupt.h>
#include <OneWire.h>
#include <DallasTemperature.h>
const int pinAnalogique = A0;
const int ledPin = 2;
// DS18B20
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// Pont diviseur
const float R1 = 22000.0;
const float R2 = 6800.0;
float correction = 1.000;
// Flag réveil
volatile bool wakeUpFlag = false;
// Interruption sur RX (PCINT16)
ISR(PCINT2_vect) {
wakeUpFlag = true;
}
void setup() {
Serial.begin(9600);
sensors.begin();
Serial.println("-------------------------------------------");
Serial.println(" ** Capteur T° et V par F8ASB ** V1.00");
Serial.println(" T= valeur temperature et V=valeur tension ");
Serial.println("-------------------------------------------");
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// Active l’interruption sur RX (D0)
PCICR |= (1 << PCIE2); // Active PCINT[23:16]
PCMSK2 |= (1 << PCINT16); // Active PCINT16 = RX
}
void enterSleep() {
wakeUpFlag = false;
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
noInterrupts();
EIFR = bit(PCIF2); // Efface flags
interrupts();
sleep_cpu(); // Dodo profond
sleep_disable(); // Réveil ici
}
void loop() {
// Dodo tant qu’aucune activité série
if (!wakeUpFlag) {
enterSleep();
}
// Réveil → lecture série
if (Serial.available()) {
digitalWrite(ledPin, HIGH);
char c = Serial.read();
// --- TENSION ---
if (c == 'V') {
int brut = analogRead(pinAnalogique);
float vA0 = brut * (5.0 / 1023.0);
float vIn = vA0 * ((R1 + R2) / R2) * correction;
Serial.print("V=");
Serial.print(vIn);
Serial.println(" V");
}
// --- TEMPERATURE ---
if (c == 'T') {
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
Serial.print("T=");
Serial.print(tempC);
Serial.println(" C");
}
digitalWrite(ledPin, LOW);
}
}