Go Down

Topic: codice da snellire (Read 191 times) previous topic - next topic

maxxmaxim

salve ragazzi...

avrei bisogno di qualche consiglio da voi esperti...

ho scritto questo semplice codice per leggere la temperatura di 3 sensori DS18B20 e gli ho dato degli intervalli per accendere e spegnere le 3 ventole con il relativo scambio visivo su lcd.

questa parte del codice funziona senza problemi però vorrei sapere se lo stesso si può snellire avendo le stesse funzioni

grazie

Code: [Select]
#include "OneWire.h"
#include "DallasTemperature.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

int temp1;
int temp2;
int temp3;
const int fanvasca=4;
const int fanplafo=5;
const int fancpu=6;

LiquidCrystal_I2C lcd(0x38,20,4);

void temperatura();

void setup (void) {
  lcd.init();
  Wire.begin();
  RTC.begin();
  sensors.begin();
  pinMode(fanvasca, OUTPUT);
  pinMode(fanplafo, OUTPUT);
  pinMode(fancpu, OUTPUT);
}

void loop(void) {
  temperatura();
}

void temperatura(){
  sensors.requestTemperatures();
  lcd.setCursor(0,2);
  lcd.print("T:");
  temp1=sensors.getTempCByIndex(0);
  lcd.print(temp1);
  lcd.print((char)223);
  lcd.print("C");
  lcd.print(" T:");
  temp2=sensors.getTempCByIndex(1);
  lcd.print(temp2);
  lcd.print((char)223);
  lcd.print("C");
  lcd.print(" T:");
  temp3=sensors.getTempCByIndex(2);
  lcd.print(temp3);
  lcd.print((char)223);
  lcd.print("C");
 
 
  if ((temp1)>=50){
    digitalWrite(fanplafo, HIGH);
    lcd.setCursor(0,3);
    lcd.print("F:-ON-");
    }
  else if ((temp1)<=45){
    digitalWrite(fanplafo, LOW);
    lcd.setCursor(0,3);
    lcd.print("F: OFF");
    }
   
    if ((temp2)>=24){
    digitalWrite(fanvasca, HIGH);
    lcd.setCursor(7,3);
    lcd.print("F:-ON-");
    }
  else if ((temp2)<=22){
    digitalWrite(fanvasca, LOW);
    lcd.setCursor(7,3);
    lcd.print("F: OFF");
    }
   
    if ((temp3)>=29){
    digitalWrite(fancpu, HIGH);
    lcd.setCursor(14,3);
    lcd.print("F:-ON-");
    }
  else if ((temp3)<=25){
    digitalWrite(fancpu, LOW);
    lcd.setCursor(14,3);
    lcd.print("F: OFF");
    }
  } 

gpb01

#1
Nov 12, 2013, 07:36 am Last Edit: Nov 12, 2013, 07:38 am by gpb01 Reason: 1
Mah ... molto dipende da cosa intendi per "snellire" ...

Sicuramente puoi risparmiare 3 bytes ( :smiley-mr-green:) cambiando :

Code: [Select]

const int fanvasca=4;
const int fanplafo=5;
const int fancpu=6;


in :

Code: [Select]

const byte fanvasca=4;
const byte fanplafo=5;
const byte fancpu=6;


e, volendo, ma proprio per pulizia, potresti fare una funzione, chiamiamola setFan, alla quale passi due valore il pin e lo stato da assumere, per fare quello che fai più volte ... un qualche cosa del tipo :

Code: [Select]
void setFan(fanPin, fanStatus) {
   byte curPos;
   
   switch (fanPin) {
       case fanplafo :
           curPos = 0;
           break;
       case fanvasca :
           curPos = 7;
           break;
       case fancpu :
          curPos = 7;
           break;
   }

   digitalWrite(fanPin, fanStatus);
   lcd.setCursor(curPos,3);
   if (fanStatus) lcd.print("F:-ON-");
   else lcd.print("F:-OFF-");
}


... così che nei tuoi if relativi alla temperatura richiami semplicemente la funzione passandogli il pin e HIGH o LOW e sfoltisci un po' il codice ...

N.B. : 1. Occhio, non l'ho provata e magari mi è scappato qualche errore ... ma spero sia chiaro il concetto  XD
         2.  Non sempre una cosa così è consigliabile ... dipende se uno deve dare priorità alle dimensioni del codice o alla velocità di esecuzione ... quindi NON è una regola generale ma va valutata a seconda dei casi ;)


Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up