fix BLACK_A1
[svn42.git] / rf433ctl / rf433ctl.pde
index 10d8705..0049401 100644 (file)
@@ -9,6 +9,7 @@
 
 #define RF_DATA_OUT_PIN 13
 #define IR_MOVEMENT_PIN 9
+#define IR_MOVEMENT_PIN2 12
 #define ONE_WIRE_PIN 8
 #define PANIC_BUTTON_PIN 7
 #define PANICLED_PWM_PIN 6
@@ -16,7 +17,7 @@
 #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 6000
+#define IR_TRESHOLD 7500
 //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
@@ -110,22 +111,49 @@ const rf_bit_t float_bit[] = { {  4, 1 },
 const rf_bit_t sync_bit[] = { {   4, 1 },
                               { 128, 0 },
                               {   0, 0 } };
-
-typedef enum { ZERO = 0, ONE , FLOAT , SYNC } adbit_t;
+                      
+// 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
-typedef ad_bit_t word_t[WORD_LEN];
+#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 };
+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 8
+#define FRAME_LEN 10
 
 #define A1_ON  0
 #define A1_OFF 1
@@ -147,26 +175,55 @@ byte volatile frame_finished = 1;
 #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 }, // A1_ON
-{ ZERO,  ZERO,  FLOAT, FLOAT, ZERO,  ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO,  SYNC }, // A1_OFF
-{ ZERO,  ZERO,  FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // A2_ON
-{ ZERO,  ZERO,  FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO,  SYNC }, // A2_OFF
-
-{ FLOAT, ZERO,  FLOAT, FLOAT, ZERO,  ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // B1_ON
-{ FLOAT, ZERO,  FLOAT, FLOAT, ZERO,  ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO,  SYNC }, // B1_OFF
-{ FLOAT, ZERO,  FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // B2_ON
-{ FLOAT, ZERO,  FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO,  SYNC }, // B2_OFF
-
-{ ZERO,  FLOAT, FLOAT, FLOAT, ZERO,  ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // C1_ON
-{ ZERO,  FLOAT, FLOAT, FLOAT, ZERO,  ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO,  SYNC }, // C1_OFF
-{ ZERO,  FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // C2_ON
-{ ZERO,  FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO,  SYNC }, // C2_OFF
-
-{ FLOAT, FLOAT, FLOAT, FLOAT, ZERO,  ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // D1_ON
-{ FLOAT, FLOAT, FLOAT, FLOAT, ZERO,  ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO,  SYNC }, // D1_OFF
-{ FLOAT, FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, FLOAT, SYNC }, // D2_ON
-{ FLOAT, FLOAT, FLOAT, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO, FLOAT, FLOAT, ZERO,  SYNC }  // D2_OFF
+{ 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
+
+{PWM1,PWM1,PWM0,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_A1_ON
+{PWM1,PWM1,PWM0,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_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
 };
 
 
@@ -177,7 +234,10 @@ void start_timer()
   // timer 1: 2 ms
   TCCR1A = 0;                    // prescaler 1:8, WGM = 4 (CTC)
   TCCR1B = 1<<WGM12 | 1<<CS11;   // 
-  OCR1A = 159;        // (1+159)*8 = 1280 -> 0.08ms @ 16 MHz -> 1*alpha
+//  OCR1A = 39;        // (1+39)*8 = 320 -> 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
 //  OCR1A = 207;        // (1+207)*8 = 1664 -> 0.104ms @ 16 MHz -> 1*alpha
   TCNT1 = 0;          // reseting timer
   TIMSK1 = 1<<OCIE1A; // enable Interrupt
@@ -221,7 +281,7 @@ ISR(TIMER1_COMPA_vect)
   }
   
   bit_cnt++;
-  if(bit_cnt < WORD_LEN) {
+  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)
@@ -426,9 +486,10 @@ 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 pulldown 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 on pulldown 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);
@@ -452,6 +513,7 @@ void setup()
 
 unsigned int ir_time=IR_SAMPLE_DURATION;
 unsigned int ir_count=0;
+unsigned int ir_count2=0;
 boolean pb_last_state=0;
 boolean pb_state=0;
 boolean pb_postth_state=0;
@@ -468,6 +530,7 @@ void loop()
 {
   ir_time--;
   ir_count += (digitalRead(IR_MOVEMENT_PIN) == HIGH);
+  ir_count2 += (digitalRead(IR_MOVEMENT_PIN2) == HIGH);
 
   if (pb_time < PB_TRESHOLD)
     pb_time++;
@@ -475,13 +538,14 @@ void loop()
   
   if (ir_time == 0)
   {
-    if (ir_count >= IR_TRESHOLD)
+    if (ir_count >= IR_TRESHOLD || ir_count2 >= IR_TRESHOLD)
     {
       flash_led(0, 1, 8, 1, 0 );
       Serial.println("movement");
     }
     ir_time=IR_SAMPLE_DURATION;
     ir_count=0;
+    ir_count2=0;
   }
   
   if (pb_state == pb_last_state && pb_time >= PB_TRESHOLD)
@@ -544,6 +608,30 @@ void loop()
       send_frame(words[D2_ON]);
     else if(command == 'h')
       send_frame(words[D2_OFF]);
+    else if(command == 'I')
+      send_frame(words[BLACK_A1_ON]);
+    else if(command == 'i')
+      send_frame(words[BLACK_A1_OFF]);
+    else if(command == 'J')
+      send_frame(words[BLACK_A2_ON]);
+    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]);
+    else if(command == 'L')
+      send_frame(words[BLACK_B1_ON]);
+    else if(command == 'l')
+      send_frame(words[BLACK_B1_OFF]);
+    else if(command == 'M')
+      send_frame(words[BLACK_B2_ON]);
+    else if(command == 'm')
+      send_frame(words[BLACK_B2_OFF]);
+    else if(command == 'N')
+      send_frame(words[BLACK_B3_ON]);
+    else if(command == 'n')
+      send_frame(words[BLACK_B3_OFF]);
     else if(command == 'T')
     {
       sensorEchoCommand(command);
@@ -560,50 +648,65 @@ void loop()
       flash_led(1, 1, 1, 1, 0);
       Serial.println("Ok");
     }
-    else if (command == '0')
-      send_yamaha_ir_signal(YAMAHA_POWER_OFF);
+    else if (command == '&')
+    {
+      flash_led(0, 1, 2, 1, 0);
+      Serial.println("Ok");
+    }
     else if (command == '1')
-      send_yamaha_ir_signal(YAMAHA_POWER_TOGGLE);
+      send_yamaha_ir_signal(YAMAHA_CD);
     else if (command == '2')
-      send_yamaha_ir_signal(YAMAHA_VOLUME_UP);
+      send_yamaha_ir_signal(YAMAHA_TUNER);
     else if (command == '3')
-      send_yamaha_ir_signal(YAMAHA_VOLUME_DOWN);
+      send_yamaha_ir_signal(YAMAHA_TAPE);
     else if (command == '4')
-      send_yamaha_ir_signal(YAMAHA_MUTE);
+      send_yamaha_ir_signal(YAMAHA_DVD_SPDIF);
     else if (command == '5')
-      send_yamaha_ir_signal(YAMAHA_CD);
+      send_yamaha_ir_signal(YAMAHA_SAT_SPDIFF);
     else if (command == '6')
-      send_yamaha_ir_signal(YAMAHA_TUNER);
-    else if (command == '7')
-      send_yamaha_ir_signal(YAMAHA_DVD_SPDIF);
+      send_yamaha_ir_signal(YAMAHA_VCR);
+//    else if (command == '7')
+//      send_yamaha_ir_signal();
     else if (command == '8')
-      send_yamaha_ir_signal(YAMAHA_MENU);
+      send_yamaha_ir_signal(YAMAHA_AUX);
+    else if (command == '9')
+      send_yamaha_ir_signal(YAMAHA_EXT51DEC);
+    else if (command == '0')
+      send_yamaha_ir_signal(YAMAHA_TEST);
+    else if (command == '/')
+      send_yamaha_ir_signal(YAMAHA_TUNER_ABCDE);
+    else if (command == '\\')
+      send_yamaha_ir_signal(YAMAHA_EFFECT_TOGGLE);
+    else if (command == '-')
+      send_yamaha_ir_signal(YAMAHA_TUNER_MINUS);
     else if (command == '+')
+      send_yamaha_ir_signal(YAMAHA_TUNER_PLUS);
+    else if (command == ':')
+      send_yamaha_ir_signal(YAMAHA_POWER_OFF);
+    else if (command == '.')
+      send_yamaha_ir_signal(YAMAHA_POWER_TOGGLE);
+    else if (command == ';')
+      send_yamaha_ir_signal(YAMAHA_VOLUME_UP);
+    else if (command == ',')
+      send_yamaha_ir_signal(YAMAHA_VOLUME_DOWN);
+    else if (command == '_')
+      send_yamaha_ir_signal(YAMAHA_MUTE);
+    else if (command == '#')
+      send_yamaha_ir_signal(YAMAHA_MENU);
+    else if (command == '"')
       send_yamaha_ir_signal(YAMAHA_PLUS);
-    else if (command == '-')
+    else if (command == '!')
       send_yamaha_ir_signal(YAMAHA_MINUS);
-    else if (command == 0xa7) // ยง
-      send_yamaha_ir_signal(YAMAHA_TEST);
-    else if (command == '$')
+    else if (command == '=')
       send_yamaha_ir_signal(YAMAHA_TIME_LEVEL);
-    else if (command == '%')
-      send_yamaha_ir_signal(YAMAHA_EFFECT_TOGGLE);
-    else if (command == '&')
+    else if (command == '$')
       send_yamaha_ir_signal(YAMAHA_PRG_DOWN);
-    else if (command == '/')
+    else if (command == '%')
       send_yamaha_ir_signal(YAMAHA_PRG_UP);
     else if (command == '(')
-      send_yamaha_ir_signal(YAMAHA_TUNER_PLUS);
-    else if (command == '[')
-      send_yamaha_ir_signal(YAMAHA_TUNER_MINUS);
+      send_yamaha_ir_signal(YAMAHA_SLEEP);
     else if (command == ')')
-      send_yamaha_ir_signal(YAMAHA_TUNER_ABCDE);
-    else if (command == '9')
-      send_yamaha_ir_signal(YAMAHA_TAPE);
-    else if (command == '?')
-      send_yamaha_ir_signal(YAMAHA_VCR);
-    else if (command == '=')
-      send_yamaha_ir_signal(YAMAHA_EXT51DEC);
+      send_yamaha_ir_signal(YAMAHA_P5);
     else
       Serial.println("Error: unknown command");
   }