kopia lustrzana https://github.com/Aircoookie/WLED
				
				
				
			
		
			
				
	
	
		
			156 wiersze
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			156 wiersze
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C++
		
	
	
| /*
 | |
|  * Infrared sensor support for generic 24 key RGB remote
 | |
|  */
 | |
| 
 | |
| #if defined(WLED_DISABLE_INFRARED) || defined(ARDUINO_ARCH_ESP32)
 | |
| void handleIR(){}
 | |
| #else
 | |
| 
 | |
| IRrecv* irrecv;
 | |
| //change pin in NpbWrapper.h
 | |
| 
 | |
| decode_results results;
 | |
| 
 | |
| unsigned long irCheckedTime = 0;
 | |
| uint32_t lastValidCode = 0;
 | |
| uint16_t irTimesRepeated = 0;
 | |
| 
 | |
| 
 | |
| //Add what your custom IR codes should trigger here. Guide: https://github.com/Aircoookie/WLED/wiki/Infrared-Control
 | |
| //IR codes themselves can be defined directly after "case" or in "ir_codes.h"
 | |
| bool decodeIRCustom(uint32_t code)
 | |
| {
 | |
|   switch (code)
 | |
|   {
 | |
|     //just examples, feel free to modify or remove
 | |
|     case IRCUSTOM_ONOFF : toggleOnOff(); break;
 | |
|     case IRCUSTOM_MACRO1 : applyMacro(1); break;
 | |
| 
 | |
|     default: return false;
 | |
|   }
 | |
|   if (code != IRCUSTOM_MACRO1) colorUpdated(2); //don't update color again if we apply macro, it already does it
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| 
 | |
| //relatively change brightness, minumum A=5
 | |
| void relativeChange(byte* property, int8_t amount, byte lowerBoundary =0)
 | |
| {
 | |
|   int16_t new_val = (int16_t) *property + amount;
 | |
|   if (new_val > 0xFF) new_val = 0xFF;
 | |
|   else if (new_val < lowerBoundary) new_val = lowerBoundary;
 | |
|   *property = new_val;
 | |
| }
 | |
| 
 | |
| 
 | |
| void decodeIR(uint32_t code)
 | |
| {
 | |
|   if (code == 0xFFFFFFFF) //repeated code, continue brightness up/down
 | |
|   {
 | |
|     irTimesRepeated++;
 | |
|     if (lastValidCode == IR24_BRIGHTER)
 | |
|     { 
 | |
|       relativeChange(&bri, 10); colorUpdated(2);
 | |
|     }
 | |
|     else if (lastValidCode == IR24_DARKER)
 | |
|     {
 | |
|       relativeChange(&bri, -10, 5); colorUpdated(2);
 | |
|     }
 | |
|     else if (lastValidCode == IR24_ON && irTimesRepeated > 7)
 | |
|     {
 | |
|       nightlightActive = true;
 | |
|       nightlightStartTime = millis();
 | |
|       colorUpdated(2);
 | |
|     }
 | |
|     return;
 | |
|   }
 | |
|   lastValidCode = 0; irTimesRepeated = 0;
 | |
| 
 | |
|   if (decodeIRCustom(code)) return;
 | |
|   if      (code > 0xFFFFFF) return; //invalid code
 | |
|   else if (code > 0xFF0000) decodeIR44(code); //is in 44-key remote range
 | |
|   else if (code > 0xF70000 && code < 0xF80000) decodeIR24(code); //is in 24-key remote range
 | |
|   //code <= 0xF70000 also invalid
 | |
| }
 | |
| 
 | |
| 
 | |
| void decodeIR24(uint32_t code)
 | |
| {
 | |
|   switch (code) {
 | |
|     case IR24_BRIGHTER  : relativeChange(&bri, 10);         break;
 | |
|     case IR24_DARKER    : relativeChange(&bri, -10, 5);     break;
 | |
|     case IR24_OFF       : briLast = bri; bri = 0;           break;
 | |
|     case IR24_ON        : bri = briLast;                    break;
 | |
|     case IR24_RED       : colorFromUint32(COLOR_RED);       break;
 | |
|     case IR24_REDDISH   : colorFromUint32(COLOR_REDDISH);   break;
 | |
|     case IR24_ORANGE    : colorFromUint32(COLOR_ORANGE);    break;
 | |
|     case IR24_YELLOWISH : colorFromUint32(COLOR_YELLOWISH); break;
 | |
|     case IR24_YELLOW    : colorFromUint32(COLOR_YELLOW);    break;
 | |
|     case IR24_GREEN     : colorFromUint32(COLOR_GREEN);     break;
 | |
|     case IR24_GREENISH  : colorFromUint32(COLOR_GREENISH);  break;
 | |
|     case IR24_TURQUOISE : colorFromUint32(COLOR_TURQUOISE); break;
 | |
|     case IR24_CYAN      : colorFromUint32(COLOR_CYAN);      break;
 | |
|     case IR24_AQUA      : colorFromUint32(COLOR_AQUA);      break;
 | |
|     case IR24_BLUE      : colorFromUint32(COLOR_BLUE);      break;
 | |
|     case IR24_DEEPBLUE  : colorFromUint32(COLOR_DEEPBLUE);  break;
 | |
|     case IR24_PURPLE    : colorFromUint32(COLOR_PURPLE);    break;
 | |
|     case IR24_MAGENTA   : colorFromUint32(COLOR_MAGENTA);   break;
 | |
|     case IR24_PINK      : colorFromUint32(COLOR_PINK);      break;
 | |
|     case IR24_WHITE     : colorFromUint32(COLOR_WHITE);           effectCurrent = 0;  break;
 | |
|     case IR24_FLASH     : if (!applyPreset(1)) effectCurrent = FX_MODE_COLORTWINKLE;  break;
 | |
|     case IR24_STROBE    : if (!applyPreset(2)) effectCurrent = FX_MODE_RAINBOW_CYCLE; break;
 | |
|     case IR24_FADE      : if (!applyPreset(3)) effectCurrent = FX_MODE_BREATH;        break;
 | |
|     case IR24_SMOOTH    : if (!applyPreset(4)) effectCurrent = FX_MODE_RAINBOW;       break;
 | |
|     default: return;
 | |
|   }
 | |
|   lastValidCode = code;
 | |
|   colorUpdated(2); //for notifier, IR is considered a button input
 | |
| }
 | |
| 
 | |
| 
 | |
| void decodeIR44(uint32_t code)
 | |
| {
 | |
|   //not implemented for now
 | |
| }
 | |
| 
 | |
| 
 | |
| void initIR()
 | |
| {
 | |
|   if (irEnabled)
 | |
|   {
 | |
|     irrecv = new IRrecv(IR_PIN);
 | |
|     irrecv->enableIRIn();
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| void handleIR()
 | |
| {
 | |
|   if (irEnabled && millis() - irCheckedTime > 120)
 | |
|   {
 | |
|     irCheckedTime = millis();
 | |
|     if (irEnabled)
 | |
|     {
 | |
|       if (irrecv == NULL)
 | |
|       { 
 | |
|         initIR(); return;
 | |
|       }
 | |
|       
 | |
|       if (irrecv->decode(&results))
 | |
|       {
 | |
|         Serial.print("IR recv\r\n0x");
 | |
|         Serial.println((uint32_t)results.value, HEX);
 | |
|         Serial.println();
 | |
|         decodeIR(results.value);
 | |
|         irrecv->resume();
 | |
|       }
 | |
|     } else if (irrecv != NULL)
 | |
|     {
 | |
|       irrecv->disableIRIn();
 | |
|       delete irrecv; irrecv = NULL;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| #endif
 |