TempCTRL v2 firmware

Aus Open Source Ecology - Germany
Zur Navigation springen Zur Suche springen
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Hier die aktuelle Firmware-Version für TempCTRL V.2, namens "heizkreisrelais_esp_lua5". (Stand 30.01.2016)

Ganz interessant ist bei dem Arduino-LCD-keypad (ein Standard-Bauteil, das von verschiedenen Herstellern angeboten wird), dass 5 der Microtaster pin-sparend lediglich an einem ADC-Pin hängen. Die Unterscheidung der einzelnen Tasten kann dadurch rein softwaremässig anhand unterschiedlicher vom ADC gemessener Widerstandswerte erfolgen.

// include the library code:
#include <LiquidCrystal.h>


#include <Boards.h>
#include <OneWire.h>
#include <DallasTemperature.h>


// initialize the library with the numbers of the interface pins
// Standard-Connection:
// LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// LCD-Keypad-Connection:
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);   // select the pins used on the LCD panel


// define some values used by the panel and buttons
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
int lcd_key     = 0;
int adc_key_in  = 0;


int key1State = 0;         // variable for reading the pushbutton status
int key2State = 0;         // variable for reading the pushbutton status
int key3State = 0;         // variable for reading the pushbutton status
int key4State = 0;         // variable for reading the pushbutton status
int key5State = 0;         // variable for reading the pushbutton status

// int grad = 75;  // default soll-Wert für Heizung
int grad = 27;  // zum testen mit Körpertemperatur
int hysterese = 3; // erlaubte Schwankungsbreite bzw. Abweichung nach oben oder unten

// int MAXGRAD = 124; // Maximale Temp vom DS18B20 Temperatursensor
// int MINGRAD = -55; // Minimale Temp vom DS18B20 Temperatursensor
int MAXGRAD = 100; // Temperatur soll unter 100 Grad bleiben
int MINGRAD = 0; // Temperatur soll über 0 Grad bleiben

int MAXHYS = 50; // Schwankungsbreite = 1/2 MAXGRAD
int MINHYS = 0;

// Relais ist activeLow
#define RELAY_ON 0
#define RELAY_OFF 1
const int relPin =  33;      // the number of the relay pin
int rs =  0;      // the current Relais-mode as integer: 
String relState = "0";
String str;

float U = 0;
float mytemp = 0;
float temps0[8];
float temps1[8];
int i = 0;
int count0 = 0;
int count1 = 0;

// Data wire is plugged into analog port A0 on the Arduino
#define BUS0 45
#define BUS1 33


#define TEMPERATURE_PRECISION 9

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire ow_bus0(BUS0);
OneWire ow_bus1(BUS1);


// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors0(&ow_bus0);
DallasTemperature sensors1(&ow_bus1);


// arrays to hold device addresses
uint8_t sensoradresses0[8][8];
uint8_t sensoradresses1[8][8];

// refreshrate / data-logging interval

unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 1000;    // serial datalogging refreshrate in milliseconds


void setup()
{ 
   digitalWrite(relPin, RELAY_OFF);  
   // initialize the Relay pin as an output:
  pinMode(relPin, OUTPUT);      

  
  lcd.begin(16, 2);                // start the LCD library
  lcd.setCursor(0,0);              // set cursor position at start
  lcd.print("ThermoRel. ESP");
  delay(1000);
 
  Serial.begin(9600);
  Serial.println("ThermoRelay ESP");
 
  Serial1.begin(9600);
  
  
  
  //check Bus 0
  sensors0.begin();
  count0 = sensors0.getDeviceCount();
  Serial.print("Bus0 Adresses found: ");
  Serial.println(count0);


  for(i=0; i<count0; i++)
  {
    if (!sensors0.getAddress(sensoradresses0[i], i)) Serial.println("Unable to find address for Device " + i); 
  
    // show the addresses we found on the bus
    // Serial.print("Device 0 Address: ");
    printAddress(sensoradresses0[i]);
    Serial.println();

    // set the resolution to 9 bit
    sensors0.setResolution(sensoradresses0[i], 9);
 
    // sensors.requestTemperatures(); // Send the command to get temperatures
  
  } // end for
  sensors0.setWaitForConversion(false);
 
   // Startzustand: Relais ist ausgeschaltet
  relState = "0"; 
  rs=0;
 
} // end of setup()



// function to print a device address
void printAddress(uint8_t deviceAddress[])
{
  for (uint8_t i = 0; i < 8; i++)
  {
    Serial.print(deviceAddress[i], HEX);
    if (i < 7) Serial.print(" ");
  }
}



int read_LCD_buttons()                    //function for detection of pressed keypad button
{
 adc_key_in = analogRead(0);              // read the analog value from the sensor 
 if (adc_key_in > 1000) return btnNONE;   // We make this the 1st option for speed reasons since it will be the most likely result
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT; 
 if (adc_key_in < 790)  return btnSELECT;   
 return btnNONE;  // when all others fail, return this...
}


 
void loop () 
{

  
  // Serial.println(count0);
  // printAddress(sensoradresses0[0]);
 
  sensors0.requestTemperatures(); // Send the command to get temperatures
  for(i=0; i<count0; i++)
  {
    temps0[i] = sensors0.getTempCByIndex(i);
  }

  // temps0[i] = 32.5;     // Testwert


 lcd_key = read_LCD_buttons();  // read the buttons function
 switch (lcd_key)               // depending on which button was pushed, we perform an action
 { case btnRIGHT:
     { key1State = HIGH;
       break;
     }
   case btnLEFT:
     { key2State = HIGH;
       break;
     }
   case btnUP:
     { key3State = HIGH;
       break;
     }
   case btnDOWN:
     { key4State = HIGH;
       break;
     }
   case btnSELECT:
     { key5State = HIGH;
       break;
     }
     case btnNONE:
     { 
       key1State = LOW;
       key2State = LOW;
       key3State = LOW;
       key4State = LOW;
       key5State = LOW;
       break;
     }
 }
 delay(40);  //wait 40ms

  
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  
  // Sollwert erhöhen
  if (key1State == HIGH) 
  { 
    if ( grad < MAXGRAD ) grad = grad + 1; 
    else grad = 0;
  } 
    // Sollwert verringern
  if (key2State == HIGH) 
  { 
    if ( grad > MINGRAD ) grad = grad - 1; 
    else grad = MAXGRAD;
  } 
  
  
  // Schwankungsbreite erhöhen
  if (key3State == HIGH) 
  { 
    if ( hysterese < MAXHYS ) hysterese = hysterese + 1; 
    else hysterese = 0;
  } 
   // Schwankungsbreite verringern
  if (key4State == HIGH) 
  { 
    if ( hysterese > MINHYS ) hysterese = hysterese - 1; 
    else hysterese = MAXHYS;
  } 


  // Relais per Taste umswitchen
  if (key5State == HIGH) 
  { 
    if (rs == 1) { relState = "0"; rs=0; }
    else { relState = "1"; rs=1; }
    
    Serial.print("Relais: ");
    Serial.println(relState);
  } // end if(key5State)
  


  // Relais automatisch je nach Temperatur umswitchen
  if((temps0[0] >= (grad+hysterese)) & (rs==1))
  {
    rs=0;
    relState = "0";
    Serial.println("Relais off");
    // delay(10);
    digitalWrite(relPin, RELAY_OFF);
  } 

  if((temps0[0] <= (grad-hysterese)) & (rs==0))
  {
    rs=1;
    relState = "1";
    Serial.println("Relais on");
    // delay(10);
    digitalWrite(relPin, HIGH);
    digitalWrite(relPin, RELAY_ON);
  } 


if (millis() - previousMillis > interval) 
{
    previousMillis = millis();   // aktuelle Zeit abspeichern
 
  
// Serial Monitor, zB. Arduino IDE
  Serial.println("          ");
  Serial.print("Ist: ");
  Serial.println(temps0[0]);
  Serial.print("Hys: ");
  Serial.println(hysterese);
  Serial.print("Soll: ");
  Serial.println(grad);
  Serial.print("Rel: ");
  Serial.println(relState);
  Serial.println(" ");


// Serial1 is connected to ESP  
  Serial1.print(":");
  Serial1.print(temps0[0]);
  Serial1.print(":");
  Serial1.print(grad);
  Serial1.print(":");
  Serial1.print(hysterese);
  Serial1.print(":");
  Serial1.print(relState);
  Serial1.println(":");

} // end if previousMillis
 
 
  lcd.setCursor(0,0);
  lcd.print("Ist:      ");
  lcd.setCursor(4,0);
  lcd.print(temps0[0]);

  lcd.setCursor(11, 0);
  lcd.print("Rel:");  // Relais Zustände: dauer-ein, dauer-aus, dem Temperatur-Programm folgend
  lcd.setCursor(15, 0);
  // Relais Zustände: dauer-ein, dauer-aus, dem Temperatur-Programm folgend
  lcd.print(relState);   
  
  
  
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  lcd.print("Soll:    ");
  lcd.setCursor(5, 1);
  lcd.print(grad);
  lcd.setCursor(10, 1);
  lcd.print("+/-:  ");
  lcd.setCursor(14, 1);
  lcd.print(hysterese); // 1/2 Range

  delay(100);

    
    
} // end loop()