Go Down

Topic: codice da snellire (Read 210 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy