All Yamaha IR Codes as Buttons
[svn42.git] / rf433ctl / rf433ctl.pde
index f283c5f..b442b96 100644 (file)
@@ -3,6 +3,7 @@
 #include <inttypes.h>
 #include <OneWire.h>
 #include <DallasTemperature.h>
+#include <IRremote.h>
 
 //********************************************************************//
 
 #define BLUELED2_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 15000
+#define IR_SAMPLE_DURATION 12000
 #define IR_TRESHOLD 10000
 //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
+#define IRREMOTE_SEND_PIN 3   //hardcoded in library
+//WARNING IRremote Lib uses TCCR2
 
 OneWire  onewire(ONE_WIRE_PIN);
 DallasTemperature dallas_sensors(&onewire);
 DeviceAddress onShieldTemp = { 0x10, 0xE7, 0x77, 0xD3, 0x01, 0x08, 0x00, 0x3F };
-#define TEMPC_OFFSET_ARDUINO_GENEREATED_HEAT -4.0
+IRsend irsend; 
+#define TEMPC_OFFSET_ARDUINO_GENEREATED_HEAT 
+
+//********************************************************************//
+// IR Codes, 32 bit, NEC
+const int YAMAHA_CODE_BITS = 32;
+const unsigned long int YAMAHA_CODE_BASE = 0x0000000005EA10000;
+
+const char YAMAHA_POWER_TOGGLE =0xF8; //Power On/Off
+const char YAMAHA_POWER_OFF =0x78; //Power Off !!!
+const char YAMAHA_SLEEP =0xEA; //Toggle Sleep 120/90/60/30min or Off
+
+const char YAMAHA_CD =0xA8; //Input CD
+const char YAMAHA_TUNER =0x68; //Input Tuner
+const char YAMAHA_TAPE =0x18; //Input Toggle Tape/CD
+const char YAMAHA_DVD_SPDIF =0xE8; //Input Toggle DVD Auto / DVD Analog
+const char YAMAHA_SAT_SPDIFF =0x2A; //Input Toggle Sat-DTV Auto / Sat-DTV Analog
+const char YAMAHA_AUX =0xAA;  //Input AUX (mode)
+const char YAMAHA_VCR =0xF0; //Input VCR
+const char YAMAHA_EXT51DEC =0xE1; //Input Ext. Decoder On/Off
+
+const char YAMAHA_TUNER_PLUS =0x08; //Tuner Next Station 1-7  (of A1 - E7)
+const char YAMAHA_TUNER_ABCDE =0x48; //Tuner Next Station Row A-E (of A1 - E7)
+
+const char YAMAHA_MUTE =0x38;
+const char YAMAHA_VOLUME_UP =0x58;
+const char YAMAHA_VOLUME_DOWN =0xD8;
+
+//const char YAMAHA_FRONT_LEVEL_P =0x01;  //no function
+//const char YAMAHA_FRONT_LEVEL_M =0x81; //no function
+//const char YAMAHA_CENTRE_LEVEL_P =0x41;  //no function
+//const char YAMAHA_CENTRE_LEVEL_M =0xC1; //no function
+//const char YAMAHA_REAR_LEVEL_P =0x7A; //no function
+//const char YAMAHA_REAR_LEVEL_M =0xFA; //no function
+const char YAMAHA_PLUS =0x4A;  //unteres Steuerkreuz: Taste Rechts (Plus)
+const char YAMAHA_MINUS =0xCA; //unteres Steuerkreuz: Taste Links (Minus)
+const char YAMAHA_MENU =0x39; // Menu: Settings
+const char YAMAHA_TEST =0xA1; // Test Sounds
+const char YAMAHA_TIME_LEVEL =0x19; //Settings for Delay, Subwfs, Right Surround, Left Surround, Center
+const char YAMAHA_TIME_LEVEL2 =0x61; //(also) Settings for Delay, Subwfs, Right Surround, Left Surround, Center
+const char YAMAHA_TIME_LEVEL3 =0x99; //(also) Settings for Delay, Subwfs, Right Surround, Left Surround, Center
+
+const char YAMAHA_EFFECT_TOGGLE =0x6A; //Effect Toggle On/Off
+const char YAMAHA_PRG_DOWN =0x9A; //Effect/DSP Programm Toggle in down direction
+const char YAMAHA_PRG_UP =0x1A; //Effect/DSP Programm Toggle in up direction
+const char YAMAHA_EFFECT1 =0x31; //Effect TV Sports
+const char YAMAHA_EFFECT2 =0x71; //Effect Rock Concert
+const char YAMAHA_EFFECT3 =0xB1;  //Effect Disco
+const char YAMAHA_EFFECT4 =0xD1;  //Mono Movie
+const char YAMAHA_EFFECT5 =0x91; //Effect Toggle 70mm Sci-Fi / 70mm Spectacle
+const char YAMAHA_EFFECT6 =0x51; //Effect Toggle 70mm General / 70mm Adventure
+const char YAMAHA_P5 =0xFB; //P5 PRT (1 Main Bypass)? (1587674115)
+
+
+void send_yamaha_ir_signal(char codebyte)
+{
+  unsigned long int code = codebyte & 0xFF;
+  code <<= 8;
+  code |= (0xff ^ codebyte) & 0xFF;
+  code |= YAMAHA_CODE_BASE;
+  irsend.sendNEC(code,YAMAHA_CODE_BITS);
+  Serial.println("Ok");  
+}
+
+//********************************************************************//
 
 typedef struct {
   byte offset;
@@ -141,9 +208,9 @@ void init_word(const word_t w)
   bit_cnt = 0;
 
   if(bit_defs[current_word[bit_cnt]][chunk_cnt].state)
-    digitalWrite(RF_DATA_OUT_PIN, HIGH);
+    digitalWrite(RF_DATA_OUT_PIN, LOW); //neue 12V MosFET Verstärkung invertiert Logik !
   else
-    digitalWrite(RF_DATA_OUT_PIN, LOW);
+    digitalWrite(RF_DATA_OUT_PIN, HIGH);
 
   start_timer();
 }
@@ -157,9 +224,9 @@ ISR(TIMER1_COMPA_vect)
   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, HIGH);
+      digitalWrite(RF_DATA_OUT_PIN, LOW); //neue 12V MosFET Verstärkung invertiert Logik !
     else
-      digitalWrite(RF_DATA_OUT_PIN, LOW);
+      digitalWrite(RF_DATA_OUT_PIN, HIGH);
     return;
   }
   
@@ -168,19 +235,19 @@ ISR(TIMER1_COMPA_vect)
     alpha_cnt = 0;
     chunk_cnt = 0;
     if(bit_defs[current_word[bit_cnt]][chunk_cnt].state)
-      digitalWrite(RF_DATA_OUT_PIN, HIGH);
+      digitalWrite(RF_DATA_OUT_PIN, LOW); //neue 12V MosFET Verstärkung invertiert Logik !
     else
-      digitalWrite(RF_DATA_OUT_PIN, LOW);
+      digitalWrite(RF_DATA_OUT_PIN, HIGH);
     return;
   }
   stop_timer();
-  digitalWrite(RF_DATA_OUT_PIN, LOW);
+  digitalWrite(RF_DATA_OUT_PIN, HIGH);
 
   word_cnt++;
   if(word_cnt < FRAME_LEN)
     init_word(current_word);
-
-  frame_finished = 1;
+  else
+    frame_finished = 2;
 }
 
 //***********//
@@ -188,15 +255,25 @@ ISR(TIMER1_COMPA_vect)
 
 void send_frame(const word_t w)
 {
+  if (frame_finished == 0)
+    for(;;)
+      if (frame_finished)
+      {
+        delay(150);
+        break;
+      }
   word_cnt = 0;
   frame_finished = 0;
-  init_word(w);
-
-  for(;;)
-    if(frame_finished)
-      break;
+  init_word(w);      
+}
 
-  Serial.println("Ok");
+void check_frame_done()
+{
+  if (frame_finished==2)
+  {
+    Serial.println("Ok");
+    frame_finished=1;
+  }
 }
 
 //********************************************************************//
@@ -228,10 +305,10 @@ void updateLightLevel(unsigned int pin)
     return;
   
   unsigned int diff = abs(value - light_level_mean_);
-  if (light_level_mean_ < 6 || diff > 250)
+  if (diff > 100)
     light_level_mean_ = value;
   else
-      light_level_mean_=(unsigned int) ( ((float) light_level_mean_) * 0.98 + ((float)value)*0.02 );
+      light_level_mean_=(unsigned int) ( ((float) light_level_mean_) * 0.90 + ((float)value)*0.10 );
 }
 
 void printLightLevel()
@@ -300,14 +377,16 @@ void flash_led(unsigned int times, unsigned int brightness_divisor, unsigned int
 void setup()
 {
   pinMode(RF_DATA_OUT_PIN, OUTPUT);
-  digitalWrite(RF_DATA_OUT_PIN, LOW);
+  digitalWrite(RF_DATA_OUT_PIN, HIGH);
   pinMode(IR_MOVEMENT_PIN, INPUT);      // set pin to input
   digitalWrite(IR_MOVEMENT_PIN, LOW);  // turn off pullup resistors  
   pinMode(PANIC_BUTTON_PIN, INPUT);      // set pin to input
   digitalWrite(PANIC_BUTTON_PIN, HIGH);  // turn on pullup resistors 
   analogWrite(BLUELED_PWM_PIN,0);
   analogWrite(BLUELED2_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();
@@ -372,6 +451,7 @@ void loop()
   
   updateLightLevel(PHOTO_ANALOGPIN);
   calculate_led_level(BLUELED_PWM_PIN);
+  check_frame_done();
   
   if(Serial.available()) {
     char command = Serial.read();
@@ -421,6 +501,48 @@ void loop()
       sensorEchoCommand(command);
       printLightLevel();
     }
+    else if (command == '0')
+      send_yamaha_ir_signal(YAMAHA_POWER_OFF);    
+    else if (command == '1')
+      send_yamaha_ir_signal(YAMAHA_POWER_TOGGLE);
+    else if (command == '2')
+      send_yamaha_ir_signal(YAMAHA_VOLUME_UP);
+    else if (command == '3')
+      send_yamaha_ir_signal(YAMAHA_VOLUME_DOWN);
+    else if (command == '4')
+      send_yamaha_ir_signal(YAMAHA_MUTE);
+    else if (command == '5')
+      send_yamaha_ir_signal(YAMAHA_CD);
+    else if (command == '6')
+      send_yamaha_ir_signal(YAMAHA_TUNER);
+    else if (command == '7')
+      send_yamaha_ir_signal(YAMAHA_DVD_SPDIF);
+    else if (command == '8')
+      send_yamaha_ir_signal(YAMAHA_MENU);
+    else if (command == '+')
+      send_yamaha_ir_signal(YAMAHA_PLUS);    
+    else if (command == '-')
+      send_yamaha_ir_signal(YAMAHA_MINUS);    
+    else if (command == '§')
+      send_yamaha_ir_signal(YAMAHA_TEST);    
+    else if (command == '$')
+      send_yamaha_ir_signal(YAMAHA_TIME_LEVEL);    
+    else if (command == '%')
+      send_yamaha_ir_signal(YAMAHA_EFFECT_TOGGLE);    
+    else if (command == '&')
+      send_yamaha_ir_signal(YAMAHA_PRG_DOWN);    
+    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_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);    
     else
       Serial.println("Error: unknown command");
   }