remote ctl via serialmon

This commit is contained in:
Stefan Kögl 2012-10-26 08:45:05 +02:00
parent 7e8bd83523
commit 501ea3995e
4 changed files with 202 additions and 118 deletions

View File

@ -11,8 +11,8 @@ Profile _profile;
OvenCtl::OvenCtl() { OvenCtl::OvenCtl() {
time = 0; time = 0;
temperature = 25; temperature = 0;
last_temperature = 25; last_temperature = 0;
actual_dt = 0; actual_dt = 0;
// timestamps of event beginnings/ends // timestamps of event beginnings/ends
Ts_time_start = 0; Ts_time_start = 0;
@ -34,19 +34,31 @@ OvenCtl::OvenCtl() {
// ui stuff // ui stuff
led_on = false; led_on = false;
disable_checks = true; disable_checks = false;
lcd = &_lcd; lcd = &_lcd;
keypad = &_keypad; keypad = &_keypad;
profile = &_profile; profile = &_profile;
lcd->begin(16, 2); lcd->begin(16, 2);
} }
void OvenCtl::reset() {
digitalWrite(7, LOW);
}
void OvenCtl::send_state() { void OvenCtl::send_state() {
Serial.write(time); Serial.write(time & 0xff);
Serial.write(temperature); Serial.write((time>>8) & 0xff);
Serial.write(last_temperature); Serial.write(temperature & 0xff);
Serial.write(state); Serial.write((temperature >> 8) & 0xff);
Serial.write(error_condition); Serial.write(last_temperature & 0xff);
Serial.write((last_temperature >> 8) & 0xff);
Serial.write(state & 0xff);
Serial.write((state >> 8) & 0xff);
Serial.write(error_condition & 0xff);
Serial.write((error_condition >> 8) & 0xff);
Serial.write(is_oven_heating);
Serial.flush();
} }
void OvenCtl::send_config() { void OvenCtl::send_config() {
@ -57,22 +69,52 @@ void OvenCtl::send_config() {
Serial.write(tmp & 0xff); Serial.write(tmp & 0xff);
Serial.write((tmp >> 8 ) & 0xff); Serial.write((tmp >> 8 ) & 0xff);
} }
// Serial.print("\n"); Serial.flush();
}
void OvenCtl::dispatch_input_config(int cmd) {
if (cmd == 255)
send_config();
else if (cmd == 254)
recv_config();
else if (cmd == 250)
reset();
else if (cmd == 253)
;
}
void OvenCtl::recv_config() {
} }
void OvenCtl::handle_states() { void OvenCtl::handle_states() {
if (state > 0) int cmd = -1;
time++;
get_temp(); if (state > 0)
check_dt(); {
time++;
get_temp();
check_dt();
}
if (error_condition != 0) {
set_error_state();
}
if (Serial.available() > 0) {
cmd = Serial.read();
if (cmd == 255)
send_config();
else if (cmd == 254)
send_state();
else if (cmd == 253)
recv_config();
else if (cmd == 252)
reset();
else if (cmd == 251)
set_start_state();
}
// if (!error_condition) {
// print_debug();
// }
// else {
// set_error_state();
// }
//
switch (state) { switch (state) {
case CONFIG_STATE: case CONFIG_STATE:
if (profile->handle_config_state(lcd, keypad)) if (profile->handle_config_state(lcd, keypad))
@ -113,55 +155,74 @@ void OvenCtl::handle_states() {
control_oven(); control_oven();
if (state > 0) { if (state > 0) {
print_status(); print_status();
send_state();
delay(1000); delay(1000);
} }
} }
void OvenCtl::print_profile_state() {
}
void OvenCtl::print_status() { void OvenCtl::print_status() {
String tmp("T: "); if (error_condition == 0) {
if (time < 10) String tmp("T: ");
tmp += "00"; if (time < 10)
else if (time < 100) tmp += "00";
tmp += "0"; else if (time < 100)
tmp += time; tmp += "0";
tmp += " Tmp: "; tmp += time;
if (temperature < 10) tmp += " Tmp: ";
tmp += "00"; if (temperature < 10)
else if (temperature < 100) tmp += "00";
tmp += "0"; else if (temperature < 100)
tmp += temperature; tmp += "0";
lcd->setCursor(0, 0); tmp += temperature;
lcd->print(tmp); lcd->setCursor(0, 0);
lcd->print(tmp);
tmp = "Profile: "; tmp = "Profile: ";
tmp += state; tmp += state;
tmp += "/"; tmp += "/";
tmp += END_STATE; tmp += END_STATE;
lcd->setCursor(0, 1); lcd->setCursor(0, 1);
lcd->print(tmp); lcd->print(tmp);
lcd->setCursor(13, 1); lcd->setCursor(13, 1);
if (is_oven_heating) if (is_oven_heating)
lcd->print("on "); lcd->print("on ");
else else
lcd->print("off"); lcd->print("off");
}
else {
lcd->clear();
lcd->print("Error:");
lcd->setCursor(0, 1);
if (error_condition & E_DT_MIN)
lcd->print("K/s too low");
if (error_condition & E_DT_MAX)
lcd->print("K/s too high");
if (error_condition & E_TIME_MAX)
lcd->print("reflow too long");
if (error_condition & E_TS_TOO_SHORT)
lcd->print("ts too short");
if (error_condition & E_TS_TOO_LONG)
lcd->print("ts too long");
if (error_condition & E_TL_TOO_SHORT)
lcd->print("tal too short");
if (error_condition & E_TL_TOO_LONG)
lcd->print("tal too long");
if (error_condition & E_TP_TOO_LONG)
lcd->print("peak too short");
if (error_condition & E_TP_TOO_SHORT)
lcd->print("peak too long");
}
} }
void OvenCtl::control_oven() { void OvenCtl::control_oven() {
if (temperature < set_min && !is_oven_heating) { if (temperature < set_min && !is_oven_heating) {
is_oven_heating = true; is_oven_heating = true;
Serial.println("Oven turned on"); // Serial.println("Oven turned on");
} }
else if (temperature > set_min && is_oven_heating) { else if (temperature > set_min && is_oven_heating) {
is_oven_heating = false; is_oven_heating = false;
Serial.println("Oven turned off");
} }
} }
@ -194,11 +255,9 @@ void OvenCtl::check_dt() {
void OvenCtl::check_max_duration() { void OvenCtl::check_max_duration() {
if (disable_checks) if (disable_checks)
return; return;
Serial.println(time);
if (time > profile->data[PI_TIME_MAX]) { if (time > profile->data[PI_TIME_MAX]) {
error_condition |= E_TIME_MAX; error_condition |= E_TIME_MAX;
} }
Serial.println(time);
} }
void OvenCtl::check_Ts_duration_min() { void OvenCtl::check_Ts_duration_min() {
@ -252,7 +311,6 @@ void OvenCtl::check_Tp_duration_max() {
} }
void OvenCtl::set_config_state() { void OvenCtl::set_config_state() {
send_config();
profile->print_config_state_0(lcd); profile->print_config_state_0(lcd);
} }
@ -270,51 +328,44 @@ void OvenCtl::set_start_state() {
void OvenCtl::set_preheat_state() { void OvenCtl::set_preheat_state() {
Serial.println("Changing state to PREHEAT_STATE"); // Serial.println("Changing state to PREHEAT_STATE");
state++; state++;
} }
void OvenCtl::set_ramp_up_state() { void OvenCtl::set_ramp_up_state() {
Serial.println("Changed state to RAMP_UP_STATE");
state++; state++;
} }
void OvenCtl::set_tal_first_state() { void OvenCtl::set_tal_first_state() {
Serial.println("Changed state to TAL_FIRST_STATE");
state++; state++;
} }
void OvenCtl::set_peak_state() { void OvenCtl::set_peak_state() {
Serial.println("Changed state to PEAK_STATE");
state++; state++;
} }
void OvenCtl::set_tal_second_state() { void OvenCtl::set_tal_second_state() {
Serial.println("Changed state to TAL_SECOND_STATE"); set_temp(0, 25, -3, -6);
set_temp(25, 25, -3, -6);
state++; state++;
} }
void OvenCtl::set_ramp_down_state() { void OvenCtl::set_ramp_down_state() {
Serial.println("Changed state to RAMP_DOWN_STATE");
state++; state++;
} }
void OvenCtl::set_end_state() { void OvenCtl::set_end_state() {
Serial.println("Changed state to END_STATE");
state++; state++;
} }
void OvenCtl::set_error_state() { void OvenCtl::set_error_state() {
if (state != ERROR_STATE) { if (state != ERROR_STATE) {
Serial.println("Changed state to ERROR_STATE");
set_temp(0, 0, 0, 0); set_temp(0, 0, 0, 0);
state = ERROR_STATE; state = ERROR_STATE;
} }
@ -328,8 +379,7 @@ void OvenCtl::handle_config_state() {
void OvenCtl::handle_start_state() { void OvenCtl::handle_start_state() {
check_max_duration(); check_max_duration();
Serial.println(time); if (temperature > profile->data[PI_TS_MIN]) {
if (temperature > profile->data[PI_TS_MIN]) {
Ts_time_start = time; Ts_time_start = time;
set_preheat_state(); set_preheat_state();
} }
@ -391,13 +441,9 @@ void OvenCtl::handle_ramp_down_state() {
void OvenCtl::handle_end_state() { void OvenCtl::handle_end_state() {
// while(true) {
// continue;
// }
} }
void OvenCtl::handle_error_state() { void OvenCtl::handle_error_state() {
if (led_on) { if (led_on) {
digitalWrite(13, LOW); digitalWrite(13, LOW);
@ -407,22 +453,4 @@ void OvenCtl::handle_error_state() {
digitalWrite(13, HIGH); digitalWrite(13, HIGH);
led_on = true; led_on = true;
} }
// if (error_condition & E_DT_MIN)
// Serial.println(PSTR("Error: delta °K/second too low"));
// if (error_condition & E_DT_MAX)
// Serial.println("Error: delta °K/second too big");
// if (error_condition & E_TIME_MAX)
// Serial.println("Error: reflow process does take too long");
// if (error_condition & E_TS_TOO_SHORT)
// Serial.println("Error: heatup duration was too short");
// if (error_condition & E_TS_TOO_LONG)
// Serial.println("Error: heatup duration was too long");
// if (error_condition & E_TL_TOO_SHORT)
// Serial.println("Error: temperature above liquidus duration was too short");
// if (error_condition & E_TL_TOO_LONG)
// Serial.println("Error: temperature above liquidus duration was too long");
// if (error_condition & E_TP_TOO_LONG)
// Serial.println("Error: peak temperature duration was too short");
// if (error_condition & E_TP_TOO_SHORT)
// Serial.println("Error: peak temperature duration was too long");
} }

View File

@ -35,6 +35,12 @@ class Profile;
class OvenCtl { class OvenCtl {
public: public:
OvenCtl();
void handle_states();
void set_config_state();
private:
// system time, timestamps and temperatures from sensors // system time, timestamps and temperatures from sensors
int time; // profile seconds int time; // profile seconds
int temperature; // actual oven temp int temperature; // actual oven temp
@ -68,10 +74,6 @@ public:
DFR_Key * keypad; DFR_Key * keypad;
Profile * profile; Profile * profile;
OvenCtl();
void handle_states();
void print_profile_state();
void print_status(); void print_status();
void control_oven(); void control_oven();
void set_temp(int, int, int, int); void set_temp(int, int, int, int);
@ -79,7 +81,6 @@ public:
void check_dt(); void check_dt();
void check_max_duration(); void check_max_duration();
void set_config_state();
void set_start_state(); void set_start_state();
void set_preheat_state(); void set_preheat_state();
void set_tal_first_state(); void set_tal_first_state();
@ -110,6 +111,11 @@ public:
void send_state(); void send_state();
void send_config(); void send_config();
void reset();
void recv_config();
void dispatch_input_config(int);
}; };
#endif #endif

View File

@ -43,7 +43,7 @@ Profile::Profile() :
180, 180,
60, 60,
150, 150,
20, 1,
40}), 40}),
config_index(0), config_index(0),
config_state(0), config_state(0),

View File

@ -1,31 +1,81 @@
#!/usr/bin/python #!/usr/bin/python
# -*- coding: utf-8 -*-
import serial, struct import serial, struct, time
try: ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
ser = serial.Serial('/dev/ttyUSB0', 9600)
i = ser.read(30)
data = list(struct.unpack("hhhhhhhhhhhhhhh", i))
print "ts_min", data[0]
print "ts_max", data[1]
print "tl", data[2]
print "tp", data[3]
print "time_max", data[4]
print "ramp_up_min", data[5]
print "ramp_up_max", data[6]
print "ramp_down_min", data[7]
print "ramp_down_max", data[8]
print "ts_duration_min", data[9]
print "ts_duration_max", data[10]
print "tl_duration_min", data[11]
print "tl_duration_max", data[12]
print "tp_duration_min", data[13]
print "tp_duration_max", data[14]
buf = ""
alles = []
#def parse():
#buffer = list()
#while 1: #while 1:
#print ser.read(5) #try:
except Exception, e: #i = ser.read(1)
pass #if ord(i) == 255:
#except Exception, e:
#print e
#else:
def recv_config():
ser.write(chr(255))
ser.flush()
read(30)
ser.flushInput()
data = struct.unpack("hhhhhhhhhhhhhhh", buf)
print
print "Profile:"
print "ts_min:", data[0]
print "ts_max:", data[1]
print "tl:", data[2]
print "tp:", data[3]
print "time_max:", data[4]
print "ramp_up_min:", data[5]
print "ramp_up_max:", data[6]
print "ramp_down_min:", data[7]
print "ramp_down_max:", data[8]
print "ts_duration_min:", data[9]
print "ts_duration_max:", data[10]
print "tl_duration_min:", data[11]
print "tl_duration_max:", data[12]
print "tp_duration_min:", data[13]
print "tp_duration_max:", data[14]
print
def recv_state():
ser.write(chr(254))
ser.flush()
read(11)
data = struct.unpack("hhhhhb", buf)
print "time: %ds, temperature: %d°C, last temperature: %d°C, state: %d, error condition: %d, heating: %d" % data
def send_config():
ser.write(chr(253))
ser.write(buf)
ser.flushInput()
def read(l):
global buf
global alles
buf = ""
while len(buf) < l:
try:
buf += ser.read(l)
alles.append(buf)
except Exception, e:
print e
ser.flushInput()
time.sleep(2)
recv_config()
while 1:
recv_state()
time.sleep(1)