timer arduino con sensore termico

ciao a tutti sono Fabrizio nuovo iscritto del forum!!!

innanzitutto complimenti per la passione che mettete nei vostri progetti e soluzioni!!!

mi sono avvicinato da molto poco al mondo arduino incuriosito dalle mille funzionalità,

purtroppo non sono pratico nella programmazione!!! per iniziare ho realizzato questo:

e successivamente il codice è stato modificato tramite aiuto con :

#include <LiquidCrystal.h>
//source: http://www.electroschematics.com/9540/arduino-fan-speed-controlled-temperature/
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int tempPin = A1;   // the output pin of LM35
int fan = 11;       // the pin where fan is
int led = 8;        // led pin
int temp;
int tempMin = 20;   // the temperature to start the fan
int tempMax = 24;   // the maximum temperature when fan is at 100%
int fanSpeed;
int fanLCD;
int timer;

void setup() {
 pinMode(fan, OUTPUT);
 pinMode(led, OUTPUT);
 pinMode(tempPin, INPUT);
 lcd.begin(16, 2);
}

int timer(){
 
 digitalWrite(fan, LOW);
 delay (1000);
 digitalWrite(fan, HIGH);
 delay (1000);
}


#define SPEED_MIN 15 // impostare valori adeguati tra 0 e 255
#define SPEED_MAX 255


void loop() {
 temp = readTemp();
 if (temp < tempMin) {
   analogWrite(fan, SPEED_MIN);
 } else if ((temp >= tempMin) && (temp <= tempMax)) {
   fanSpeed = map(temp, tempMin, tempMax, 32, 255);
   fanLCD = map(temp, tempMin, tempMax, 0, 100);
   analogWrite(fan, fanSpeed);
   digitalWrite(led, LOW);
 } else {
   analogWrite(fan, SPEED_MAX);
   digitalWrite(led, HIGH);
 }

 lcd.print("TEMPERATURE: ");
 lcd.print(temp);      // display the temperature
 lcd.print("C");
 lcd.setCursor(0, 1);  // move cursor to next line
 lcd.print("FANS DUTY:   ");
 lcd.print(fanLCD);    // display the fan speed
 lcd.print("%");
 delay(1000);
 lcd.clear();
}

int readTemp() {  // get the temperature and convert it to celsius
 temp = analogRead(tempPin);
 return temp * 0.48828125;
}

funziona abbastanza bene, vorrei inserire un timer che attivi, indipendentemente dalla temperatura, e quindi "svincolato" dal software, il pin 11 dove ho collegato la ventola per un tempo di x minuti ogni x ore. potete aiutarmi?

leggevo delle funzioni delay e millis.

da quello che ho capito serve un interrupt (non uccidetemi se dico stupidaggini non sono molto pratico!!!!) che appunto inserisca una funzione a se, non dipendente dal resto del software

grazie in aticipo a tutti!!

Ciao e benvenuto sul forum.

Essendo il tuo primo post Ti invitiamo cortesemente a presentarti QUI (dicci quali conoscenze hai di elettronica e di programmazione) e a leggere attentamente il regolamento QUI
se non lo hai già fatto.

Inoltre, in conformità con il punto 7 del regolamento, dovresti editare il tuo post e racchiudere il codice negli appositi "tag code" usando il pulsante in alto a sinistra, quello con il simbolo "</>"

Attilio

provvedo subito!! grazie

Per quanto riguarda quello che chiedi direi che hai due strade:

1- utilizzare la funzione millis (QUI trovi un esempio)

2- acquistare un modulo rtc (tipo QUESTO) e usare quello per gestire gli orari di funzionamento della ventola.

Non ti consiglio di usare la funzione delay dal momento che è bloccante e ferma lo schetch, impedendo altre operazioni, fino a che non è tarscorso il tempo impostato.

Attilio

grazie attilio,

cercavo di usarlo l'rtc in quanto non mi occorre una precisione alta dato che il circuito la sera lo spengo quindi se anche i tempi sono leggermente più lunghi o corti non è un problema.

facendo un po di prove in effetti escludo il delay in quanto blocca tutto il sw per tot ms, ora cerco di capire la funzione millis. grazie

ho visto vari esempi sul millis ma sinceramente non riesco a capire dove e come posizionarlo nel codice, nei vari esempi è sempre preso singolo come parametro!

rieccomi qui!!!

ho provato a fare dei tentativi con i timer ma non mi riescono... ufff. chiedo aiuto !!! devo implementare un timer ciclico che ogni 3 ore (a prescindere dallo stato del pic ) attivi per circa 5 minuti il pin X arduino.

potete aiutarmi?

questo è il mio codice aggiornato :

#include <LiquidCrystal.h>
//source: http://www.electroschematics.com/9540/arduino-fan-speed-controlled-temperature/
//lcd connection: vss -> gnd, vdd->+5, rs ->7, rw-> gnd, E->6, d4-d7 -> 5-2.
//lm35 conn. out -> A1.
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int tempPin = A1;   // the output pin of LM35
int fan = 11;       // the pin where fan is
int led = 8;        // led pin
int temp;
int tempMin = 20;   // the temperature to start the fan
int tempMax = 24;   // the maximum temperature when fan is at 100%
int fanSpeed;
int fanLCD;
int timer;

void setup() {
  pinMode(fan, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(tempPin, INPUT);
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("Microprocessor");
  lcd.setCursor(0, 1);
  lcd.print("growing Control");
  delay(2000);
  lcd.clear();  
}


#define SPEED_MIN 5 // impostare valori adeguati tra 0 e 255
#define SPEED_MAX 255


void loop() {
  temp = readTemp();
  if (temp < tempMin) {
    analogWrite(fan, SPEED_MIN);
  } else if ((temp >= tempMin) && (temp <= tempMax)) {
    fanSpeed = map(temp, tempMin, tempMax, 32, 255);
    fanLCD = map(temp, tempMin, tempMax, 0, 100);
    analogWrite(fan, fanSpeed);
    digitalWrite(led, LOW);
  } else {
    analogWrite(fan, SPEED_MAX);
    digitalWrite(led, HIGH);
  }

  lcd.print("TEMPERATURE: ");
  lcd.print(temp);      // display the temperature
  lcd.print("C");
  lcd.setCursor(0, 1);  // move cursor to next line
  lcd.print("FANS DUTY:   ");
  lcd.print(fanLCD);    // display the fan speed
  lcd.print("%");
  delay(1000);
  lcd.clear();
}

int readTemp() {  // get the temperature and convert it to celsius
  temp = analogRead(tempPin);
  return temp * 0.48828125;
}

Per capire bene come si applica la millis(), studia prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti sarà tutto più chiaro :wink:

Guglielmo

si avevo letto questi esempi, però io devo fare in modo che se il pin X è ad es al 50% pwm il timer deve portarlo tutto su HIGH , e dopo la durata di Ton rilasci il pin X nello stato in qui si trovava prima

Non mi sembra complicato ...
... ti salvi il valore del PWM in una variabile (... così sai a che valore riportarlo), fai una analogWrite(pin, 255) e lo porti HIGH e, passato il dovuto tempo, rifai la analogWrite() con il valore che avevi salvato.

Guglielmo

ad esempio su questo codice :

const byte ledPin =  13; // the number of the LED pin
byte ledState = 0; // ledState used to set the LED
unsigned long previousMillis1 = 0; //will store last time LED was updated
unsigned long interval1 = 100;  //interval at which to blink (milliseconds)
unsigned long previousMillis2 = 0;
unsigned long interval2 = 1000;
unsigned int counter = 0;
void setup() {
  Serial.begin(19200);
  delay(2000);
  pinMode(ledPin, OUTPUT); //set the digital pin as output
}

//main loop
void loop() {
  blinkLed();
  printCounter();
}

//blink the led
void blinkLed() {
  //check if it's time to blink the led
  if (millis() - previousMillis1 > interval1) {
    previousMillis1 = millis(); //save the last time I blinked the LED
    // if the LED is off turn it on and vice-versa:
    ledState ^= 1;
    digitalWrite(ledPin, ledState);
  }
}

//print on the serial the value of a counter
void printCounter() {
  //check if it's time to print the new value of the counter
  if (millis() - previousMillis2 > interval2) {
    previousMillis2 = millis(); //save the last time I printed on the serial
    Serial.println(++counter); //increment the counter and print it on the serial
  }
}

usa 2 funzioni una per il blink e una x la seriale e ok. se tolgo la sezione della seriale dove devo inserire il mio codice?

grazie!!

gpb01:
Non mi sembra complicato ...
... ti salvi il valore del PWM in una variabile (... così sai a che valore riportarlo), fai una analogWrite(pin, 255) e lo porti HIGH e, passato il dovuto tempo, rifai la analogWrite() con il valore che avevi salvato.

Guglielmo

però sto vedendo che la funzione millis mi da tempo di Ton = a Toff (nel codice che ho postato per ultimo) come faccio ad avere un timer "asimmetrico" lasciando il main svincolato dal timer?

musicman86:
però sto vedendo che la funzione millis mi da tempo di Ton = a Toff (nel codice che ho postato per ultimo) come faccio ad avere un timer "asimmetrico" lasciando il main svincolato dal timer?

Con la stessa tecnica, solo che ne devi fare due, con tempi diversi, ... una per mettere il LED a on (se è off) ed una per metterlo ad OFF (se è on).

Guglielmo

ok la logica l 'ho capita!

il problema è che non sono capace :sweat_smile: :sweat_smile: . potresti farmi un esempio ? (scusatemi ma sono quasi a digiuno di arduino)

Allora, ti metto un esempio che avevo già postato qui sul forum e che accende e spegne un LED (ed un motore) con tempi di ON/OFF diversi ... cerca di capire il trucco e di applicarlo al tuo caso ...

const byte ledPIN = 13;

byte  MotorOnOff;

unsigned long Ton     = 1000; // un secondo acceso
unsigned long Toff    = 3000; // due secondi spento
unsigned long lastOn  = 0;
unsigned long lastOff = 0;

void setup() {
 MotorOnOff = HIGH;          // si inizia con motore acceso
 pinMode(ledPIN, OUTPUT);
 digitalWrite(ledPIN, MotorOnOff);
 lastOn = millis();
}

void loop() {
 if ( MotorOnOff == HIGH) {
   // Qui il motore è acceso
   if (millis() - lastOn > Ton) {
     // superato il tempo di ON
     MotorOnOff = LOW;
     digitalWrite(ledPIN, MotorOnOff);
     lastOff = millis();      
   }    
 }
 else {
   // Qui il motore è spento 
   if ( millis() - lastOff > Toff) {
     // superato il tempo di OFF
     MotorOnOff = HIGH;
     digitalWrite(ledPIN, MotorOnOff);
     lastOn = millis();      
   }    
 }
}

Guglielmo