X-Git-Url: https://git.realraum.at/?p=svn42.git;a=blobdiff_plain;f=rf433ctl%2Frf433ctl.pde;h=5b3c4b2f8e8876365a429d43be7f1339db2f3d9f;hp=16b9a47b9ddc5959af2ff705126928bc417e2302;hb=a34e51d757fe52cb19de2937ae1b211894167524;hpb=729ca83dba7574ee6b20a578cca419ce8c88cdeb diff --git a/rf433ctl/rf433ctl.pde b/rf433ctl/rf433ctl.pde index 16b9a47..5b3c4b2 100644 --- a/rf433ctl/rf433ctl.pde +++ b/rf433ctl/rf433ctl.pde @@ -16,8 +16,8 @@ #define BLUELED_PWM_PIN 11 #define PHOTO_ANALOGPIN 0 //movement is reported if during IR_SAMPLE_DURATION at least IR_TRESHOLD ir signals are detectd -#define IR_SAMPLE_DURATION 8000 -#define IR_TRESHOLD 7500 +#define IR_SAMPLE_DURATION 6000 +#define IR_TRESHOLD 5900 //duration PanicButton needs to be pressed before status change occurs (i.e. for two PanicButton Reports, the buttons needs to be pressed 1000 cycles, releases 1000 cycles and again pressed 1000 cycles) #define PB_TRESHOLD 1000 #define PHOTO_SAMPLE_INTERVAL 4000 @@ -27,8 +27,8 @@ OneWire onewire(ONE_WIRE_PIN); DallasTemperature dallas_sensors(&onewire); DeviceAddress onShieldTemp = { 0x10, 0xE7, 0x77, 0xD3, 0x01, 0x08, 0x00, 0x3F }; -IRsend irsend; -#define TEMPC_OFFSET_ARDUINO_GENEREATED_HEAT +IRsend irsend; +#define TEMPC_OFFSET_ARDUINO_GENEREATED_HEAT //********************************************************************// // IR Codes, 32 bit, NEC @@ -83,162 +83,17 @@ const char YAMAHA_P5 =0xFB; //P5 PRT (1 Main Bypass)? (1587674115) //********************************************************************// -typedef struct { - byte offset; - byte state; -} rf_bit_t; - -// offset is number of alphas (0.08ms) - -const rf_bit_t zero_bit[] = { { 4, 1 }, - { 16, 0 }, - { 20, 1 }, - { 32, 0 }, - { 0, 0 } }; - -const rf_bit_t one_bit[] = { { 12, 1 }, - { 16, 0 }, - { 28, 1 }, - { 32, 0 }, - { 0, 0 } }; - -const rf_bit_t float_bit[] = { { 4, 1 }, - { 16, 0 }, - { 28, 1 }, - { 32, 0 }, - { 0, 0 } }; - -const rf_bit_t sync_bit[] = { { 4, 1 }, - { 128, 0 }, - { 0, 0 } }; - -// whole word duration: ~46.80 ms -// pause duration: ~14.9ms - 1.86ms = ~13ms -// bit duration: 1.860 ms - -// in theory better but non-working timings @ alpha=0.0775ms -//const rf_bit_t pwm_0_bit[] = { {6, 1}, {18, 0}, { 0, 0 } }; // 1.86ms gesamt: { 0.46ms HIGH , 1.4ms LOW } -//const rf_bit_t pwm_1_bit[] = { {18, 1}, {6, 0}, { 0, 0 } }; //// 1.86ms gesamt: { 1.4ms HIGH , 0.46ms LOW } -//const rf_bit_t pwm_pause_bit[] = { {167, 0}, { 0, 0 } }; //// 13ms pause - -// somewhat working timings @ alpha=0.0775ms -const rf_bit_t pwm_0_bit[] = { {7, 1}, {17, 0}, { 0, 0 } }; // 1.86ms gesamt: { 0.46ms HIGH , 1.4ms LOW } -const rf_bit_t pwm_1_bit[] = { {18, 1}, {6, 0}, { 0, 0 } }; //// 1.86ms gesamt: { 1.4ms HIGH , 0.46ms LOW } -const rf_bit_t pwm_pause_bit[] = { {168, 0}, { 0, 0 } }; //// 13ms pause - -// // exact but non-working timings @ alpha=0.02ms -// const rf_bit_t pwm_0_bit[] = { {23, 1}, {70, 0}, { 0, 0 } }; // 1.86ms gesamt: { 0.46ms HIGH , 1.4ms LOW } -// const rf_bit_t pwm_1_bit[] = { {70, 1}, {23, 0}, { 0, 0 } }; //// 1.86ms gesamt: { 1.4ms HIGH , 0.46ms LOW } -// const rf_bit_t pwm_pause_bit[] = { {215, 0}, { 0, 0 } }; //// 1/3* 12.9ms pause - -//default: -// almost as good somwhat working approximate timings @ alpha=0.08ms -//const rf_bit_t pwm_0_bit[] = { {6, 1}, {17, 0}, { 0, 0 } }; // 1.86ms gesamt: { 0.46ms HIGH , 1.4ms LOW } -//const rf_bit_t pwm_1_bit[] = { {18, 1}, {6, 0}, { 0, 0 } }; //// 1.86ms gesamt: { 1.4ms HIGH , 0.46ms LOW } -//const rf_bit_t pwm_pause_bit[] = { {162, 0}, { 0, 0 } }; //// 13ms pause - -typedef enum { ZERO = 0, ONE , FLOAT , SYNC , PWM0, PWM1, PWM_PAUSE, WORD_END } adbit_t; -typedef byte ad_bit_t; -#define WORD_LEN 13 -#define MAX_WORD_LEN 27 -typedef ad_bit_t word_t[MAX_WORD_LEN]; - -const rf_bit_t* bit_defs[] = { zero_bit, one_bit, float_bit, sync_bit, pwm_0_bit, pwm_1_bit, pwm_pause_bit }; - -byte alpha_cnt = 0; -byte bit_cnt = 0; -byte current_word_len = WORD_LEN; -byte chunk_cnt = 0; -byte word_cnt = 0; -const ad_bit_t* current_word; -byte volatile frame_finished = 1; - -#define FRAME_LEN 10 - -#define A1_ON 0 -#define A1_OFF 1 -#define A2_ON 2 -#define A2_OFF 3 - -#define B1_ON 4 -#define B1_OFF 5 -#define B2_ON 6 -#define B2_OFF 7 - -#define C1_ON 8 -#define C1_OFF 9 -#define C2_ON 10 -#define C2_OFF 11 - -#define D1_ON 12 -#define D1_OFF 13 -#define D2_ON 14 -#define D2_OFF 15 - -#define BLACK_A1_ON 16 -#define BLACK_A1_OFF 17 -#define BLACK_A2_ON 18 -#define BLACK_A2_OFF 19 -#define BLACK_A3_ON 20 -#define BLACK_A3_OFF 21 - -#define BLACK_B1_ON 22 -#define BLACK_B1_OFF 23 -#define BLACK_B2_ON 24 -#define BLACK_B2_OFF 25 -#define BLACK_B3_ON 26 -#define BLACK_B3_OFF 27 - - -const word_t words[] = { -{ ZERO, ZERO, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC, WORD_END, WORD_END,WORD_END}, // A1_ON -{ ZERO, ZERO, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC, WORD_END, WORD_END,WORD_END}, // A1_OFF -{ ZERO, ZERO, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC, WORD_END, WORD_END,WORD_END }, // A2_ON -{ ZERO, ZERO, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC, WORD_END, WORD_END,WORD_END }, // A2_OFF - -{ FLOAT, ZERO, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC, WORD_END, WORD_END,WORD_END }, // B1_ON -{ FLOAT, ZERO, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC, WORD_END, WORD_END,WORD_END }, // B1_OFF -{ FLOAT, ZERO, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC, WORD_END, WORD_END,WORD_END }, // B2_ON -{ FLOAT, ZERO, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC, WORD_END, WORD_END,WORD_END }, // B2_OFF - -{ ZERO, FLOAT, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC, WORD_END, WORD_END,WORD_END }, // C1_ON -{ ZERO, FLOAT, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC, WORD_END, WORD_END,WORD_END }, // C1_OFF -{ ZERO, FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC, WORD_END, WORD_END,WORD_END }, // C2_ON -{ ZERO, FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC, WORD_END, WORD_END,WORD_END }, // C2_OFF - -{ FLOAT, FLOAT, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC, WORD_END, WORD_END,WORD_END }, // D1_ON -{ FLOAT, FLOAT, FLOAT, FLOAT, ZERO, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC, WORD_END, WORD_END,WORD_END }, // D1_OFF -{ FLOAT, FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC, WORD_END, WORD_END,WORD_END }, // D2_ON -{ FLOAT, FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, SYNC, WORD_END, WORD_END,WORD_END }, // D2_OFF - -{PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0,PWM0,PWM0, PWM_PAUSE, WORD_END}, // BLACK_A1_ON -{PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0, PWM_PAUSE, WORD_END}, // BLACK_A1_OFF -{PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0,PWM0,PWM0, PWM_PAUSE, WORD_END}, // BLACK_A2_ON -{PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0, PWM_PAUSE, WORD_END}, // BLACK_A2_OFF -{PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0,PWM0,PWM0, PWM_PAUSE, WORD_END}, // BLACK_A3_ON -{PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0, PWM_PAUSE, WORD_END}, // BLACK_A3_OFF - -{PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0,PWM0,PWM0, PWM_PAUSE, WORD_END}, // BLACK_B1_ON -{PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0, PWM_PAUSE, WORD_END}, // BLACK_B1_OFF -{PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0,PWM0,PWM0, PWM_PAUSE, WORD_END}, // BLACK_B2_ON -{PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0, PWM_PAUSE, WORD_END}, // BLACK_B2_OFF -{PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0,PWM0,PWM0, PWM_PAUSE, WORD_END}, // BLACK_B3_ON -{PWM0,PWM1,PWM1,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM0,PWM1,PWM1,PWM1,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM0,PWM1,PWM1,PWM0, PWM_PAUSE, WORD_END} // BLACK_B3_OFF - -}; - - -//********************************************************************// +#define TIMER_RUNNING (TIMSK1 & (1< 0.02ms @ 16 MHz -> 1*alpha -//default: alpha=0.08 -// OCR1A = 159; // (1+159)*8 = 1280 -> 0.08ms @ 16 MHz -> 1*alpha -OCR1A = 154; // (1+154)*8 = 1240 -> 0.0775ms @ 16 MHz -> 1*alpha +//default: alpha=0.08 + OCR1A = 159; // (1+159)*8 = 1280 -> 0.08ms @ 16 MHz -> 1*alpha +// OCR1A = 154; // (1+154)*8 = 1240 -> 0.0775ms @ 16 MHz -> 1*alpha // OCR1A = 207; // (1+207)*8 = 1664 -> 0.104ms @ 16 MHz -> 1*alpha TCNT1 = 0; // reseting timer TIMSK1 = 1<> (CURRENT_BIT_CNT % 8) )& 1) +#define RF_TIME_SHORT (current_signal.short_mult * current_signal.duration_short_pulse) +#define RF_TIME_LONG (current_signal.long_mult * current_signal.duration_short_pulse) +#define RF_TIME_SNYC (current_signal.sync_mult * current_signal.duration_short_pulse) +#define RF_OFF digitalWrite(RF_DATA_OUT_PIN, HIGH) +#define RF_ON digitalWrite(RF_DATA_OUT_PIN, LOW) ISR(TIMER1_COMPA_vect) { - alpha_cnt++; - if(alpha_cnt < bit_defs[current_word[bit_cnt]][chunk_cnt].offset) - return; - - chunk_cnt++; - if(bit_defs[current_word[bit_cnt]][chunk_cnt].offset != 0) { - if(bit_defs[current_word[bit_cnt]][chunk_cnt].state) - digitalWrite(RF_DATA_OUT_PIN, LOW); //neue 12V MosFET Verstärkung invertiert Logik ! - else - digitalWrite(RF_DATA_OUT_PIN, HIGH); - return; - } - - bit_cnt++; - if(current_word[bit_cnt] != WORD_END && bit_cnt < MAX_WORD_LEN) { - alpha_cnt = 0; - chunk_cnt = 0; - if(bit_defs[current_word[bit_cnt]][chunk_cnt].state) - digitalWrite(RF_DATA_OUT_PIN, LOW); //neue 12V MosFET Verstärkung invertiert Logik ! - else - digitalWrite(RF_DATA_OUT_PIN, HIGH); - return; + if ( current_state.state || current_state.bit || current_state.repeatc || current_state.atime) + { + if (current_state.atime) + { + current_state.atime--; + } + //atime ran out + else if (current_state.state) //was in state 1 or 2 + { + RF_OFF; //stop sending + if (current_state.state == 2) //aka sync + current_state.atime=RF_TIME_SNYC; + else + current_state.atime=CURRENT_BIT? + RF_TIME_SHORT + :RF_TIME_LONG; + current_state.state=0; + } + else if (current_state.bit) //still more than 0 bits to do + { + current_state.bit--; + current_state.state=1; + current_state.atime=CURRENT_BIT? + RF_TIME_LONG + :RF_TIME_SHORT; + RF_ON; //start sending + } + else if (current_state.repeatc) + { + current_state.bit=RF_SIGNAL_BITS; + current_state.repeatc--; + current_state.state=2; + //start sync (short pulse followed by long pause) + RF_ON; + current_state.atime=RF_TIME_SHORT; + } } - stop_timer(); - digitalWrite(RF_DATA_OUT_PIN, HIGH); - - word_cnt++; - if(word_cnt < FRAME_LEN) - init_word(current_word); else - frame_finished = 2; + { + stop_timer(); + RF_OFF; + rf_num_transmissions_to_acknowledge++; + } } +//********************************************************************// -//***********// - +void serial_read_send_rf_cmd() +{ + while (TIMER_RUNNING) + {} + for (byte chr=0; chr < 3; chr++) + { + while (!Serial.available()) + {} + current_signal.signal[chr]=Serial.read(); + } + current_state.repeatc=NUM_REPEAT_SIGNAL; + start_timer(); +} -void send_frame(const word_t w) +void send_rf_cmd(const char sr[]) { - if (frame_finished != 1) - for(;;) //wait until sending of previous frame finishes - if (frame_finished) - { - delay(150); - break; - } - word_cnt = 0; - frame_finished = 0; - init_word(w); + while (TIMER_RUNNING) + {} + for (byte chr=0; chr < 3; chr++) + { + current_signal.signal[chr]=sr[chr]; + } + current_state.repeatc=NUM_REPEAT_SIGNAL; + start_timer(); } void check_frame_done() { - if (frame_finished==2) + while (rf_num_transmissions_to_acknowledge > 0) { + rf_num_transmissions_to_acknowledge--; Serial.println("Ok"); - frame_finished=1; - delay(120); } } @@ -351,11 +244,11 @@ void updateLightLevel(unsigned int pin) if (light_sample_time_ < PHOTO_SAMPLE_INTERVAL) return; light_sample_time_ = 0; - + unsigned int value = analogRead(pin); if (value == light_level_mean_) return; - + unsigned int diff = abs(value - light_level_mean_); if (diff > 100) light_level_mean_ = value; @@ -465,7 +358,7 @@ void send_yamaha_ir_signal(char codebyte) code <<= 8; code |= (0xff ^ codebyte) & 0xFF; code |= YAMAHA_CODE_BASE; - + //irsend changes PWM Timer Frequency among other things //.. doesn't go well with PWM output using the same timer //.. thus we just set output to 255 so whatever frequency is used, led is off for the duration @@ -487,24 +380,24 @@ void setup() pinMode(RF_DATA_OUT_PIN, OUTPUT); digitalWrite(RF_DATA_OUT_PIN, HIGH); pinMode(IR_MOVEMENT_PIN, INPUT); // set pin to input - digitalWrite(IR_MOVEMENT_PIN, LOW); // turn off pullup resistors - digitalWrite(IR_MOVEMENT_PIN2, LOW); // turn off pullup resistors + digitalWrite(IR_MOVEMENT_PIN, LOW); // turn off pullup resistors + digitalWrite(IR_MOVEMENT_PIN2, LOW); // turn off pullup resistors pinMode(PANIC_BUTTON_PIN, INPUT); // set pin to input - digitalWrite(PANIC_BUTTON_PIN, LOW); // turn of pullup resistors + digitalWrite(PANIC_BUTTON_PIN, LOW); // turn of pullup resistors analogWrite(PANICLED_PWM_PIN,255); analogWrite(BLUELED_PWM_PIN,255); //pwm sink(-) instead of pwm + (better for mosfets) pinMode(IRREMOTE_SEND_PIN, OUTPUT); digitalWrite(IRREMOTE_SEND_PIN, HIGH); - + Serial.begin(9600); - + onewire.reset(); onewire.reset_search(); dallas_sensors.begin(); //in case we change temp sensor: - if (!dallas_sensors.getAddress(onShieldTemp, 0)) - Serial.println("Error: Unable to find address for Device 0"); - dallas_sensors.setResolution(onShieldTemp, 9); + if (!dallas_sensors.getAddress(onShieldTemp, 0)) + Serial.println("Error: Unable to find address for Device 0"); + dallas_sensors.setResolution(onShieldTemp, 9); //save prev timer states: save_tcnt2 = TCNT2; @@ -536,7 +429,7 @@ void loop() if (pb_time < PB_TRESHOLD) pb_time++; pb_state=(digitalRead(PANIC_BUTTON_PIN) == HIGH); - + if (ir_time == 0) { if (ir_count >= IR_TRESHOLD || ir_count2 >= IR_TRESHOLD) @@ -548,11 +441,11 @@ void loop() ir_count=0; ir_count2=0; } - + if (pb_state == pb_last_state && pb_time >= PB_TRESHOLD) { if (pb_state && ! pb_postth_state) - { + { pb_postth_state=1; Serial.println("PanicButton"); flash_led(0, 28, 1, 4, 0 ); @@ -566,79 +459,79 @@ void loop() pb_time=0; pb_last_state=pb_state; } - + updateLightLevel(PHOTO_ANALOGPIN); calculate_led_level(); check_frame_done(); - if(Serial.available()) { char command = Serial.read(); - - if(command == 'A') - send_frame(words[A1_ON]); + + if (command == '>') + { + serial_read_send_rf_cmd(); + } + else if(command == 'A') + send_rf_cmd("\x8a\xa0\x8a"); // pollin 00101 a 1 else if(command == 'a') - send_frame(words[A1_OFF]); + send_rf_cmd("\x8a\xa0\x2a"); // pollin 00101 a 0 else if(command == 'B') - send_frame(words[A2_ON]); + send_rf_cmd("\xa0\xa2\xa8"); //white remote A 2 on else if(command == 'b') - send_frame(words[A2_OFF]); - + send_rf_cmd("\xa0\xa2\x28"); //white remote A 2 off else if(command == 'C') - send_frame(words[B1_ON]); + send_rf_cmd("\xa2\xa0\xa8"); //white remote B 1 on else if(command == 'c') - send_frame(words[B1_OFF]); + send_rf_cmd("\xa2\xa0\x28"); //white remote B 1 off else if(command == 'D') - send_frame(words[B2_ON]); + send_rf_cmd("\x8a\x88\x8a"); //pollin 00101 b 1 else if(command == 'd') - send_frame(words[B2_OFF]); - + send_rf_cmd("\x8a\x88\x2a"); //pollin 00101 b 0 else if(command == 'E') - send_frame(words[C1_ON]); - else if(command == 'e') - send_frame(words[C1_OFF]); + send_rf_cmd("\xa8\xa0\xa8"); //white remote C 1 on + else if(command == 'e') + send_rf_cmd("\xa8\xa0\x28"); //white remote C 1 off else if(command == 'F') - send_frame(words[C2_ON]); + send_rf_cmd("\xa8\xa2\xa8"); else if(command == 'f') - send_frame(words[C2_OFF]); - + send_rf_cmd("\xa8\xa2\x28"); else if(command == 'G') - send_frame(words[D1_ON]); + send_rf_cmd("\xaa\xa0\xa8"); else if(command == 'g') - send_frame(words[D1_OFF]); + send_rf_cmd("\xaa\xa0\x28"); else if(command == 'H') - send_frame(words[D2_ON]); + send_rf_cmd("\xaa\xa2\xa8"); else if(command == 'h') - send_frame(words[D2_OFF]); + send_rf_cmd("\xaa\xa2\x28"); else if(command == 'I') - send_frame(words[BLACK_A1_ON]); + send_rf_cmd("\x8a\x28\x8a"); //pollin 00101 c 1 else if(command == 'i') - send_frame(words[BLACK_A1_OFF]); + send_rf_cmd("\x8a\x28\x2a"); //pollin 00101 c 0 else if(command == 'J') - send_frame(words[BLACK_A2_ON]); + send_rf_cmd("\x8a\xa8\x88"); //pollin 00101 d 1 else if(command == 'j') - send_frame(words[BLACK_A2_OFF]); - else if(command == 'K') - send_frame(words[BLACK_A3_ON]); - else if(command == 'k') - send_frame(words[BLACK_A3_OFF]); + send_rf_cmd("\x8a\xa8\x28"); //pollin 00101 d 0 else if(command == 'L') - send_frame(words[BLACK_B1_ON]); + send_rf_cmd("\xae\x2b\x30"); else if(command == 'l') - send_frame(words[BLACK_B1_OFF]); + send_rf_cmd("\xae\x2b\xc0"); else if(command == 'M') - send_frame(words[BLACK_B2_ON]); + send_rf_cmd("\xae\x2e\x30"); else if(command == 'm') - send_frame(words[BLACK_B2_OFF]); + send_rf_cmd("\xae\x2e\xc0"); else if(command == 'N') - send_frame(words[BLACK_B3_ON]); + send_rf_cmd("\xae\x3a\x30"); else if(command == 'n') - send_frame(words[BLACK_B3_OFF]); - else if(command == 'T') + send_rf_cmd("\xae\x3a\xc0"); + else if(command == 'Z') + send_rf_cmd("\xa2\xa2\xaa"); + else if(command == 'z') + send_rf_cmd("\xa2\xa2\x2a"); + else if(command == '*') { sensorEchoCommand(command); printTemperature(onShieldTemp); } - else if(command == 'P') + else if(command == '?') { sensorEchoCommand(command); printLightLevel();