Bläddra i källkod

Test-sending a Panasonic IR-code works

Thomas Chef 1 år sedan
förälder
incheckning
68318e1752
5 ändrade filer med 60 tillägg och 27 borttagningar
  1. 1 1
      main/config.h
  2. 48 17
      main/ir_transmit.c
  3. 6 4
      main/main.c
  4. 1 1
      main/receiver.c
  5. 4 4
      main/toshiba_ir.h

+ 1 - 1
main/config.h

@@ -14,7 +14,7 @@
 
 #define RX_TIMER
 #define IR_RECEIVER
-//#define IR_TRANSMIT
+#define IR_TRANSMIT
 
 #define ONE_WIRE_BUS_IO           GPIO_NUM_32   // Temp sensors
 

+ 48 - 17
main/ir_transmit.c

@@ -10,17 +10,31 @@
 
 #ifdef IR_TRANSMIT
 
+extern uint8_t bitReverse(uint8_t b);
+
 // RMT values
 #define RMT_TX_CHANNEL RMT_CHANNEL_0
 #define RMT_TX_GPIO    GPIO_NUM_26
 // channel clock period = 1 uS
 #define RMT_CLK_DIV    80
 
-// Variable that holds the IR protocol transmission. 1 start bit, 72 data bits and one stop bit
-rmt_item32_t toshiba_rmt[1 + 72 + 1 + 1];
+// Variable that holds the IR protocol transmission. 1 start bit, 8*8+19*8 data bits and one stop bit
+#define RMT_BITS (1+64+1+1+152+1+1) // 221 bits in total
+rmt_item32_t toshiba_rmt[RMT_BITS];
 
 QueueHandle_t toshibaTxQueue = NULL;
 
+void copyDataToRmtArray( const uint8_t rmtStartBit, const uint8_t* data, const uint8_t noOfBytes, const bool reverseByte) {
+	for(uint8_t b=0;b<noOfBytes*8;b++) {
+		uint8_t byteNo = b / 8;
+		uint8_t byte = (reverseByte) ? bitReverse(data[byteNo]) : data[byteNo];
+		uint8_t shiftBits = b % 8;
+		uint8_t bit_data = (1u << (7-shiftBits)) & byte;
+		uint32_t space = bit_data ? kPanasonicAcOneSpace : kPanasonicAcZeroSpace;
+		toshiba_rmt[b+rmtStartBit].val = (kPanasonicAcBitMark << 0) | (1 << 15) | (space << 16);
+    }
+}
+
 void toshibaTxTask(void *pvParameter)
 {
 	ESP_LOGI("IR_TRANSMIT", "toshibaTxTask() starting.");
@@ -32,14 +46,14 @@ void toshibaTxTask(void *pvParameter)
 			ESP_LOGI("IR_TRANSMIT","Received a TX from MQTT");
 
 			uint8_t irPair = 1;
-			for(uint8_t b=0;b<kToshibaNumberOfBits;b++) {
+			for(uint8_t b=0;b<kPanasonicNumberOfBits;b++) {
 				
 				uint8_t byteNo = b / 8;
 				uint8_t shiftBits = b % 8;
 				uint8_t bit_data = (1u << (7-shiftBits)) & data[byteNo];
-				uint32_t space = bit_data ? kToshibaAcOneSpace : kToshibaAcZeroSpace;
+				uint32_t space = bit_data ? kPanasonicAcOneSpace : kPanasonicAcZeroSpace;
 
-				toshiba_rmt[irPair].val = (kToshibaAcBitMark << 0) | (1 << 15) | (space << 16);    // Header of IR Transmit 
+				toshiba_rmt[irPair].val = (kPanasonicAcBitMark << 0) | (1 << 15) | (space << 16);    // Header of IR Transmit 
 
 				irPair++;
 			}
@@ -83,18 +97,35 @@ void initIrTransmit() {
 
 	//ESP_ERROR_CHECK( rmt_driver_install(rmt_tx.channel, 0, 0) );
 
-    // Init the ir data field
-    toshiba_rmt[0].val = (kToshibaAcHdrMark << 0) | (1 << 15) | (kToshibaAcHdrSpace << 16);    // Header of IR Transmit
-    toshiba_rmt[73].val = (kToshibaAcBitMark << 0) | (1 << 15) | (kToshibaAcZeroSpace << 16);    // Header of IR Transmit
-    toshiba_rmt[74].val = (1 << 16);    // End marker
-
-    // 0x47503FC
-    // 0x1FE823A
-
-    for(int i=1;i<73;i++) {
-
-        toshiba_rmt[i].val = (kToshibaAcBitMark << 0) | (1 << 15) | (kToshibaAcZeroSpace << 16);    // Header of IR Transmit
-    }
+    // Init the ir default Panasonic IR data field
+	/**
+	 * The IR is divided into 2 parts
+	 * 0    Start
+	 * 1    64 fixed bits
+	 * 65   A gap
+	 * 66   Start (again)
+	 * 67   152 bits with data
+	 * 219  Stop
+	 * 220  End-marker (Not sent)
+	 *  
+	 */
+	
+    toshiba_rmt[0].val = (kPanasonicAcHdrMark << 0) | (1 << 15) | (kPanasonicAcHdrSpace << 16); 
+    toshiba_rmt[65].val = (kPanasonicAcBitMark << 0) | (1 << 15) | (kPanasonicAcUsualGap << 16);
+	toshiba_rmt[66].val = (kPanasonicAcHdrMark << 0) | (1 << 15) | (kPanasonicAcHdrSpace << 16); 
+	toshiba_rmt[219].val = (kPanasonicAcBitMark << 0) | (1 << 15) | (kPanasonicAcZeroSpace << 16); 
+    toshiba_rmt[220].val = (1 << 16);    // RMT End marker
+
+	// Setup the fixed 64 bits: 0x4004072000000060 (Sent like this)
+	const uint8_t fixedData[8]={0x40,0x04,0x07,0x20,0x0,0x00,0x0,0x60};
+	//memcpy(data,(void *)&fixedData[0],8);	// Copy the fixed data
+	copyDataToRmtArray(1,fixedData,8,false);
+
+	// Setup the the real 152 data bits
+	const uint8_t confData[19]={0x02,0x20,0xE0,0x04,0x00,0x49,0x31,0x86,
+	                            0xA3,0x06,0x00,0x0E,0xE0,0x00,0x00,0x89,
+								0x00,0x00,0x20 };
+	copyDataToRmtArray(67,confData,19,true);
 
     toshibaTxQueue = xQueueCreate( 5, kPanasonicNumberOfBytes );
 	xTaskCreatePinnedToCore(toshibaTxTask, "toshibaTxTask", 1024*10, NULL, 2, NULL,0);

+ 6 - 4
main/main.c

@@ -54,14 +54,16 @@ void app_main(void)
 #endif
 
 vTaskDelay(1000 / portTICK_PERIOD_MS);
-#ifdef IR_TRANSMIT
-initIrTransmit();
-#endif
 
     TickType_t vLastWakeTime = xTaskGetTickCount();
 
     // Do an initial delay to make the different tasks to work out of sync to each other (not send all data at same time)
-    vTaskDelayUntil( &vLastWakeTime, 5000 / portTICK_PERIOD_MS );
+    vTaskDelayUntil( &vLastWakeTime, 2000 / portTICK_PERIOD_MS );
+
+#ifdef IR_TRANSMIT
+initIrTransmit();
+#endif
+
 
     ESP_LOGI("MAIN","Lets go...");
 

+ 1 - 1
main/receiver.c

@@ -46,7 +46,7 @@ void receiverTask(void *pvParameter)
         // Here we receive every individual pulse that has been detected by the isr-pulse-rx-function: timer_tg0_isr
         while( xQueueReceive( rxQueue, &width, 100 ) == pdTRUE ) {
 
-            //ESP_LOGI("D", "%u", width);     // Debug to show every received pulse as a separate log line
+            ESP_LOGI("D", "%u", width);     // Debug to show every received pulse as a separate log line
 
             // Receive the Toshiba IR
             // Send the pulse to the receiver that tries to interpret the pulse

+ 4 - 4
main/toshiba_ir.h

@@ -28,10 +28,10 @@ I (8114) D: 460*/
 // Panasonic LZ35 A/C
 #define kPanasonicAcHdrMark ((uint32_t)3456)
 #define kPanasonicAcHdrSpace ((uint32_t)1728)
-#define kPanasonicAcBitMark ((uint32_t)432)
-#define kPanasonicAcOneSpace ((uint32_t)1296)
-#define kPanasonicAcZeroSpace ((uint32_t)432)
-#define kPanasonicAcUsualGap ((uint32_t)9940)
+#define kPanasonicAcBitMark ((uint32_t)432)     // T0
+#define kPanasonicAcOneSpace ((uint32_t)1296)   // T1
+#define kPanasonicAcZeroSpace ((uint32_t)432)   // T1
+#define kPanasonicAcUsualGap ((uint32_t)9940)   // (T1)
 
 #define kPanasonicNumberOfBits 152
 #define kPanasonicNumberOfBytes (kPanasonicNumberOfBits/8)  // 19 Bytes