arduino2/termoskanne/termoskanne.ino
2020-11-06 13:17:55 +01:00

171 lines
4.1 KiB
C++

#include <Wire.h> //I2C Bus
#include <DS1631.h>
DS1631 Temp1(0); // initialize DS1631 object, with bus address
// A bus address of 0 means pins A2,A1,A0 are all tied to
// ground.ä
// Thermoskanne besteht aus
//Pumpe pin 5~ 0 bei 130 max 255
int pumpepin = 5;
int pumpe =0;
int aktpumpe = 0;
//Relaissatz + Peltiersteuerung
int relaispin = 4;
boolean relais = false; // true = heizen false = kühlen
boolean aktrelais = false;
int powerpin = 6;
int power = 1; // Vorseinstellung für die Power
int aktpower=0;
//Thermistor zum Schutz
int t1apin = 0;
int t1max = 45; // maximale Temperatur des Systems
int t1 =0;
//DS1631 für die Umlauftemperatur
int tsoll = 0;
int tist =0;
// An Aus Schalter für alles
boolean onoff = false;
int vstatus = 0; //Aus = 0 | An = 1 | Error = 2
int command = 0;
void setup() {
pinMode(pumpepin,OUTPUT);
pinMode(relaispin,OUTPUT);
pinMode(powerpin,OUTPUT);
Serial.begin(115200);
Wire.begin(); // start up I2C bus
delay(500);
scan();
int config = Temp1.readConfig();
Temp1.writeConfig(13); // Set to 12-bit, 1-shot mode
config = Temp1.readConfig();
vstatus=1;
}
void loop(){
while (Serial.available()>0){
Serial.println("1)info 2)powerOn 3)powerOff 4)relaisOn 5)relaisOff 6)doit");
command = Serial.parseInt();
if (Serial.read() == '\n') {
Serial.println(command);
switch (command) {
case 1 : info();
break;
case 2 :aktpower = HIGH;
digitalWrite(powerpin,aktpower);
break;
case 3 :aktpower = LOW;
digitalWrite(powerpin,aktpower);
break;
case 4 :relais = HIGH;
digitalWrite(relaispin,relais);
break;
case 5 :relais = LOW;
digitalWrite(relaispin,relais);
break;
}
}
}
}
void info(){
t1 = int(Thermistor(analogRead(0)));
tist = (int)Temp1.readTempOneShot();
// put your main code here, to run repeatedly:
Serial.print("termistor ");
Serial.print(t1);
Serial.print(" I2C Temp ");
Serial.print(tist);
Serial.print(" status ");
Serial.println(vstatus);
}
void do_loop() {
t1 = int(Thermistor(analogRead(0)));
tist = (int)Temp1.readTempOneShot();
if(t1>t1max){
vstatus = 2; // zu heiß -> error
}
switch (vstatus){
case 0 : //aus
aktpumpe = 0;
aktpower = LOW;
aktrelais = false;
//displayInteger(tist);
break;
case 1: //an
aktpumpe = pumpe;
aktrelais = relais;
if (relais==true) { // heizen
if( tsoll > tist){
aktpower = HIGH;
} else {
aktpower = LOW;
}
} else { // kühlen
if (tsoll < tist){
aktpower = HIGH;
} else {
aktpower = LOW;
}
}
// displayInteger(aktpower);
break;
case 2: //error
aktpower = LOW;
aktrelais =0;
//displayInteger(1111);
break;
}
analogWrite(pumpepin, aktpumpe);
digitalWrite(relaispin,aktrelais);
digitalWrite(powerpin,aktpower);
// put your main code here, to run repeatedly:
Serial.print("termistor ");
Serial.print(t1);
Serial.print(" I2C Temp ");
Serial.print(tist);
Serial.print(" status ");
Serial.println(vstatus);
delay(1000);
}
void scan(){
Serial.println(" Scanning I2C Addresses");
uint8_t cnt=0;
for(uint8_t i=0;i<128;i++){
Wire.beginTransmission(i);
uint8_t ec=Wire.endTransmission(true);
if(ec==0){
if(i<16)Serial.print('0');
Serial.print(i,HEX);
cnt++;
}
else Serial.print("..");
Serial.print(' ');
if ((i&0x0f)==0x0f)Serial.println();
}
Serial.print("Scan Completed, ");
Serial.print(cnt);
Serial.println(" I2C Devices found.");
}
double Thermistor(int RawADC) {
double Temp;
Temp = log(10000.0*((1024.0/RawADC-1)));
// =log(10000.0/(1024.0/RawADC-1)) // for pull-up configuration
Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
Temp = Temp - 273.15; // Convert Kelvin to Celcius
//Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit
return Temp;
}