const int analogPin = A0; // Pin analogico di input
volatile int adcValue = 0; // Variabile volatile per memorizzare il valore analogico
volatile bool newData = false; // Flag per indicare la presenza di nuovi dati
volatile int cicli=10, cicli2=10000;
#define DHT_EST 3
#define DHT_INT 6
int TemperaturaMassima,TemperaturaMinima, UmiditaMassima, UmiditaMinima;
volatile int UmiditaInt, UmiditaEst, TemperaturaInt, TemperaturaEst;
void setup() {
Serial.begin(9600);
Serial.print("Inserire Temperatura Massima: ");
while(!Serial.available());
TemperaturaMassima=Serial.read();
Serial.print("Inserire Temperatura Minima: ");
while(!Serial.available());
TemperaturaMinima=Serial.read();
Serial.print("Inserire Umidita Massima: ");
while(!Serial.available());
UmiditaMassima=Serial.read();
Serial.print("Inserire Umidita Minima: ");
while(!Serial.available());
UmiditaMinima=Serial.read();
int range = ((TemperaturaMassima-TemperaturaMinima)+(UmiditaMassima-UmiditaMinima));
int TemId = ((TemperaturaMassima-TemperaturaMinima)/2);
int UmId = ((UmiditaMassima-UmiditaMinima)/2);
// Configurazione del Timer 1
// Disabilita gli interrupt temporaneamente
TCCR1A = 0; // Imposta il registro di controllo A del Timer 1 a 0
TCCR1B = 0; // Imposta il registro di controllo B del Timer 1 a 0
TCNT1 = 0; // Inizializza il contatore del Timer 1 a 0
OCR1A = 15624; // Imposta il valore di confronto per ottenere un intervallo di 1 secondo
TCCR1B |= (1 << WGM12); // Abilita la modalità di conteggio CTC (Clear Timer on Compare Match)
TCCR1B |= (1 << CS12) | (1 << CS10); // Imposta il prescaler a 1024
TIMSK1 |= (1 << OCIE1A); // Abilita l'interrupt quando si raggiunge il valore di confronto
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0; // Inizializzo il contatore
OCR2A = 249; // Imposto il registro di confronto
TCCR2A |= (1 << WGM21); // Attivo la modalità CTC
TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20); // ImpostO il prescaler a 1024
TIMSK2 |= (1 << OCIE2A); // Abilito l'interrupt su confronto con il registro A
interrupts(); // Abilita gli interrupt
}
void loop() {
if (newData) {
// Leggi il valore analogico
int sensorValue = adcValue;
// Fai qualcosa con il valore letto, ad esempio invialo via seriale
Serial.println(sensorValue);
// Resetta la flag dei nuovi dati
newData = false;
}
}
// Interrupt del Timer 1
ISR(TIMER1_COMPA_vect) {
if(--cicli==0){
// Inizia la comunicazione con il sensore
pinMode(DHT_EST, OUTPUT);
digitalWrite(DHT_EST, LOW);
delay(20);
digitalWrite(DHT_EST, HIGH);
delayMicroseconds(40);
pinMode(DHT_EST, INPUT);
// Aspetta la risposta del sensore
while (digitalRead(DHT_EST) == HIGH);
// Aspetta che il sensore inizi la trasmissione
while (digitalRead(DHT_EST) == LOW);
// Aspetta che il sensore trasmetta i dati
while (digitalRead(DHT_EST) == HIGH);
// Leggi i dati dal sensore
int data[40];
for (int i = 0; i < 40; i++) {
while (digitalRead(DHT_EST) == LOW);
delayMicroseconds(30);
if (digitalRead(DHT_EST) == HIGH) {
data[i] = 1;
while (digitalRead(DHT_EST) == HIGH);
} else {
data[i] = 0;
}
}
// Elabora i dati ricevuti
int UmiditaEst = (data[0] << 8 | data[1]);
int TemperaturaEst = (data[2] << 8 | data[3]);
cicli=10;
}
}
ISR(TIMER2_COMPA_vect) {
if(--cicli2==0){
// Inizia la comunicazione con il sensore
pinMode(DHT_INT, OUTPUT);
digitalWrite(DHT_INT, LOW);
delay(20);
digitalWrite(DHT_INT, HIGH);
delayMicroseconds(40);
pinMode(DHT_INT, INPUT);
// Aspetta la risposta del sensore
while (digitalRead(DHT_INT) == HIGH);
// Aspetta che il sensore inizi la trasmissione
while (digitalRead(DHT_INT) == LOW);
// Aspetta che il sensore trasmetta i dati
while (digitalRead(DHT_INT) == HIGH);
// Leggi i dati dal sensore
int data[40];
for (int i = 0; i < 40; i++) {
while (digitalRead(DHT_INT) == LOW);
delayMicroseconds(30);
if (digitalRead(DHT_INT) == HIGH) {
data[i] = 1;
while (digitalRead(DHT_INT) == HIGH);
} else {
data[i] = 0;
}
}
// Elabora i dati ricevuti
int UmiditaEst = (data[0] << 8 | data[1]);
int TemperaturaEst = (data[2] << 8 | data[3]);
cicli2=10000;
}
}