forked from electro/esp-irblaster
parent
c8ec93722e
commit
05f372efaa
@ -1,90 +0,0 @@ |
|||||||
/* Hello World Example
|
|
||||||
|
|
||||||
This example code is in the Public Domain (or CC0 licensed, at your option.) |
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, this |
|
||||||
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR |
|
||||||
CONDITIONS OF ANY KIND, either express or implied. |
|
||||||
*/ |
|
||||||
#include <stdio.h> |
|
||||||
#include "sdkconfig.h" |
|
||||||
#include "freertos/FreeRTOS.h" |
|
||||||
#include "freertos/task.h" |
|
||||||
#include "esp_system.h" |
|
||||||
#include "esp_spi_flash.h" |
|
||||||
#include "driver/ledc.h" |
|
||||||
|
|
||||||
void app_main(void) |
|
||||||
{ |
|
||||||
printf("Hello world!\n"); |
|
||||||
|
|
||||||
/*
|
|
||||||
* Prepare and set configuration of timers |
|
||||||
* that will be used by LED Controller |
|
||||||
*/ |
|
||||||
ledc_timer_config_t ledc_timer = { |
|
||||||
.duty_resolution = LEDC_TIMER_8_BIT, // resolution of PWM duty
|
|
||||||
.freq_hz = 38500, // frequency of PWM signal
|
|
||||||
.speed_mode = LEDC_HIGH_SPEED_MODE, // timer mode
|
|
||||||
.timer_num = LEDC_TIMER_0, // timer index
|
|
||||||
.clk_cfg = LEDC_AUTO_CLK, // Auto select the source clock
|
|
||||||
}; |
|
||||||
// Set configuration of timer0 for high speed channels
|
|
||||||
ledc_timer_config(&ledc_timer); |
|
||||||
|
|
||||||
ledc_channel_config_t chan = { |
|
||||||
.channel = LEDC_CHANNEL_0, |
|
||||||
.duty = 127, |
|
||||||
.gpio_num = 17, |
|
||||||
.speed_mode = LEDC_HIGH_SPEED_MODE, |
|
||||||
.hpoint = 0, |
|
||||||
.timer_sel = LEDC_TIMER_0 |
|
||||||
}; |
|
||||||
ledc_channel_config(&chan); |
|
||||||
|
|
||||||
#define PWM_ON() do { \ |
|
||||||
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 127); \
|
|
||||||
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0); \
|
|
||||||
} while(0) |
|
||||||
|
|
||||||
#define PWM_OFF() do { \ |
|
||||||
ledc_stop(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 0); \
|
|
||||||
} while(0) |
|
||||||
|
|
||||||
while (1) { |
|
||||||
//const uint8_t bytes[4] = {0b10000000, 0b01111111, 0b00010000, 0b11101111}; // and one 1 at the end
|
|
||||||
const uint8_t bytes[4] = {0b10000000 , 0b01111111 , 0b00000000 , 0b11111111}; // and one 1 at the end
|
|
||||||
|
|
||||||
// Preamble
|
|
||||||
PWM_ON(); |
|
||||||
ets_delay_us(9000); |
|
||||||
PWM_OFF(); |
|
||||||
ets_delay_us(4500); |
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++) { |
|
||||||
uint8_t byte = bytes[i]; |
|
||||||
for (int j = 0; j < 8; j++) { |
|
||||||
bool bit = 0 != (byte & 0x80); |
|
||||||
byte <<= 1; |
|
||||||
if (bit==0) { |
|
||||||
PWM_ON(); |
|
||||||
ets_delay_us(588); |
|
||||||
PWM_OFF(); |
|
||||||
ets_delay_us(540); |
|
||||||
} else { |
|
||||||
PWM_ON(); |
|
||||||
ets_delay_us(590); |
|
||||||
PWM_OFF(); |
|
||||||
ets_delay_us(1672); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
PWM_ON(); |
|
||||||
ets_delay_us(600); |
|
||||||
PWM_OFF(); |
|
||||||
ets_delay_us(1700); |
|
||||||
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(1000)); |
|
||||||
} |
|
||||||
} |
|
@ -1,32 +0,0 @@ |
|||||||
/**
|
|
||||||
* Utilities for heap usage debugging |
|
||||||
*
|
|
||||||
* Created on 2020/10/23. |
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef CSPEMU_HEAP_DEBUG_H |
|
||||||
#define CSPEMU_HEAP_DEBUG_H |
|
||||||
#include <stdint.h> |
|
||||||
#include <esp_heap_trace.h> |
|
||||||
#include <esp_log.h> |
|
||||||
|
|
||||||
extern uint32_t heapdebug_start; |
|
||||||
extern const char *heapdebug_start_name; |
|
||||||
|
|
||||||
#define HEAP_MEASURE_START(msg) \ |
|
||||||
heapdebug_start_name = msg; \
|
|
||||||
ESP_LOGD(TAG, "/-- HEAP_BEGIN: %s", msg); \
|
|
||||||
heapdebug_start = esp_get_free_heap_size(); |
|
||||||
|
|
||||||
#define HEAP_TRACE_START() ESP_LOGD(TAG, "--- Start heap tracing!"); \ |
|
||||||
ESP_ERROR_CHECK( heap_trace_start(HEAP_TRACE_LEAKS) ); |
|
||||||
|
|
||||||
#define HEAP_MEASURE_END() \ |
|
||||||
ESP_LOGD(TAG, "\\--- HEAP_END: %s, used %d", \
|
|
||||||
heapdebug_start_name, (int32_t)heapdebug_start - (int32_t)esp_get_free_heap_size()); |
|
||||||
|
|
||||||
#define HEAP_TRACE_END() ESP_LOGD(TAG, "--- End heap tracing!"); \ |
|
||||||
ESP_ERROR_CHECK( heap_trace_stop() ); \
|
|
||||||
heap_trace_dump(); |
|
||||||
|
|
||||||
#endif //CSPEMU_HEAP_DEBUG_H
|
|
@ -0,0 +1,107 @@ |
|||||||
|
/* Hello World Example
|
||||||
|
|
||||||
|
This example code is in the Public Domain (or CC0 licensed, at your option.) |
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, this |
||||||
|
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR |
||||||
|
CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
*/ |
||||||
|
#include <stdio.h> |
||||||
|
#include "sdkconfig.h" |
||||||
|
#include "freertos/FreeRTOS.h" |
||||||
|
#include "freertos/task.h" |
||||||
|
#include "esp_system.h" |
||||||
|
#include "esp_spi_flash.h" |
||||||
|
#include "driver/ledc.h" |
||||||
|
#include "irblast.h" |
||||||
|
|
||||||
|
static portMUX_TYPE mux_irblast; |
||||||
|
|
||||||
|
#define CMDLEN 4 |
||||||
|
|
||||||
|
static const uint8_t COMMANDS[][CMDLEN] = { |
||||||
|
[IRBLAST_ONOFF] = {0b10000000, 0b01111111, 0b00000000, 0b11111111}, |
||||||
|
[IRBLAST_DAYNIGHT] = {0b10000000, 0b01111111, 0b10000000, 0b01111111}, |
||||||
|
[IRBLAST_SPEED1] = {0b10000000, 0b01111111, 0b10101000, 0b01010111}, |
||||||
|
[IRBLAST_SPEED2] = {0b10000000, 0b01111111, 0b01101000, 0b10010111}, |
||||||
|
[IRBLAST_SPEED3] = {0b10000000, 0b01111111, 0b00101000, 0b11010111}, |
||||||
|
[IRBLAST_MODE1] = {0b10000000, 0b01111111, 0b00011000, 0b11100111}, |
||||||
|
[IRBLAST_MODE2] = {0b10000000, 0b01111111, 0b10011000, 0b01100111}, |
||||||
|
[IRBLAST_MODE3] = {0b10000000, 0b01111111, 0b00001000, 0b11110111}, |
||||||
|
[IRBLAST_MODE4] = {0b10000000, 0b01111111, 0b10001000, 0b01110111}, |
||||||
|
[IRBLAST_HUM1] = {0b10000000, 0b01111111, 0b00010000, 0b11101111}, |
||||||
|
[IRBLAST_HUM2] = {0b10000000, 0b01111111, 0b01010000, 0b10101111}, |
||||||
|
[IRBLAST_HUM3] = {0b10000000, 0b01111111, 0b10010000, 0b01101111}, |
||||||
|
}; |
||||||
|
|
||||||
|
void irblast_setup() { |
||||||
|
vPortCPUInitializeMutex(&mux_irblast); |
||||||
|
|
||||||
|
ledc_timer_config_t ledc_timer = { |
||||||
|
.duty_resolution = LEDC_TIMER_8_BIT, // resolution of PWM duty
|
||||||
|
.freq_hz = 38500, // frequency of PWM signal
|
||||||
|
.speed_mode = LEDC_HIGH_SPEED_MODE, // timer mode
|
||||||
|
.timer_num = LEDC_TIMER_0, // timer index
|
||||||
|
.clk_cfg = LEDC_AUTO_CLK, // Auto select the source clock
|
||||||
|
}; |
||||||
|
// Set configuration of timer0 for high speed channels
|
||||||
|
ledc_timer_config(&ledc_timer); |
||||||
|
|
||||||
|
ledc_channel_config_t chan = { |
||||||
|
.channel = LEDC_CHANNEL_0, |
||||||
|
.duty = 127, |
||||||
|
.gpio_num = CONFIG_PIN_IRLED, |
||||||
|
.speed_mode = LEDC_HIGH_SPEED_MODE, |
||||||
|
.hpoint = 0, |
||||||
|
.timer_sel = LEDC_TIMER_0 |
||||||
|
}; |
||||||
|
ledc_channel_config(&chan); |
||||||
|
} |
||||||
|
|
||||||
|
static inline void pwm_on() { |
||||||
|
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 127); |
||||||
|
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0); |
||||||
|
} |
||||||
|
|
||||||
|
static inline void pwm_off() { |
||||||
|
ledc_stop(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 0); |
||||||
|
} |
||||||
|
|
||||||
|
void irblast_send(enum irblast_cmd cmd) { |
||||||
|
const uint8_t *bytes = COMMANDS[cmd]; |
||||||
|
|
||||||
|
portENTER_CRITICAL(&mux_irblast); |
||||||
|
|
||||||
|
// Preamble
|
||||||
|
pwm_on(); |
||||||
|
ets_delay_us(9000); |
||||||
|
pwm_off(); |
||||||
|
ets_delay_us(4500); |
||||||
|
|
||||||
|
for (int i = 0; i < CMDLEN; i++) { |
||||||
|
uint8_t byte = bytes[i]; |
||||||
|
for (int j = 0; j < 8; j++) { |
||||||
|
if ((byte & 0x80) == 0) { |
||||||
|
pwm_on(); |
||||||
|
ets_delay_us(588); |
||||||
|
pwm_off(); |
||||||
|
ets_delay_us(540); |
||||||
|
} else { |
||||||
|
pwm_on(); |
||||||
|
ets_delay_us(590); |
||||||
|
pwm_off(); |
||||||
|
ets_delay_us(1672); |
||||||
|
} |
||||||
|
byte <<= 1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// one "1" at the end, for some reason
|
||||||
|
pwm_on(); |
||||||
|
ets_delay_us(600); |
||||||
|
pwm_off(); |
||||||
|
|
||||||
|
portEXIT_CRITICAL(&mux_irblast); |
||||||
|
|
||||||
|
vTaskDelay(pdMS_TO_TICKS(1000)); |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
/**
|
||||||
|
* IRBlaster main file |
||||||
|
* |
||||||
|
* Created on 2021/12/10. |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef _BLAST_H |
||||||
|
#define _BLAST_H |
||||||
|
|
||||||
|
#include "esp_err.h" |
||||||
|
|
||||||
|
enum irblast_cmd { |
||||||
|
IRBLAST_ONOFF, |
||||||
|
IRBLAST_DAYNIGHT, |
||||||
|
IRBLAST_SPEED1, |
||||||
|
IRBLAST_SPEED2, |
||||||
|
IRBLAST_SPEED3, |
||||||
|
IRBLAST_MODE1, |
||||||
|
IRBLAST_MODE2, |
||||||
|
IRBLAST_MODE3, |
||||||
|
IRBLAST_MODE4, |
||||||
|
IRBLAST_HUM1, |
||||||
|
IRBLAST_HUM2, |
||||||
|
IRBLAST_HUM3, |
||||||
|
}; |
||||||
|
|
||||||
|
void irblast_setup(); |
||||||
|
|
||||||
|
void irblast_send(enum irblast_cmd cmd); |
||||||
|
|
||||||
|
#endif //_BLAST_H
|
Loading…
Reference in new issue