IR Recieve
This commit is contained in:
parent
a9cde5ac54
commit
23a2f243c9
|
@ -8,8 +8,8 @@
|
||||||
"args": [],
|
"args": [],
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
"externalConsole": true,
|
"externalConsole": true,
|
||||||
"cwd": ".",
|
"cwd": "d:/Git/ESPMegaPRO-v3-SDK/ESPMegaPRO-OS-SDK/src",
|
||||||
"program": "build/Debug/outDebug",
|
"program": "d:/Git/ESPMegaPRO-v3-SDK/ESPMegaPRO-OS-SDK/src/build/Debug/outDebug",
|
||||||
"MIMode": "gdb",
|
"MIMode": "gdb",
|
||||||
"miDebuggerPath": "gdb",
|
"miDebuggerPath": "gdb",
|
||||||
"setupCommands": [
|
"setupCommands": [
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
{
|
||||||
|
"C_Cpp_Runner.cCompilerPath": "gcc",
|
||||||
|
"C_Cpp_Runner.cppCompilerPath": "g++",
|
||||||
|
"C_Cpp_Runner.debuggerPath": "gdb",
|
||||||
|
"C_Cpp_Runner.cStandard": "",
|
||||||
|
"C_Cpp_Runner.cppStandard": "",
|
||||||
|
"C_Cpp_Runner.msvcBatchPath": "",
|
||||||
|
"C_Cpp_Runner.useMsvc": false,
|
||||||
|
"C_Cpp_Runner.warnings": [
|
||||||
|
"-Wall",
|
||||||
|
"-Wextra",
|
||||||
|
"-Wpedantic",
|
||||||
|
"-Wshadow",
|
||||||
|
"-Wformat=2",
|
||||||
|
"-Wcast-align",
|
||||||
|
"-Wconversion",
|
||||||
|
"-Wsign-conversion",
|
||||||
|
"-Wnull-dereference"
|
||||||
|
],
|
||||||
|
"C_Cpp_Runner.msvcWarnings": [
|
||||||
|
"/W4",
|
||||||
|
"/permissive-",
|
||||||
|
"/w14242",
|
||||||
|
"/w14287",
|
||||||
|
"/w14296",
|
||||||
|
"/w14311",
|
||||||
|
"/w14826",
|
||||||
|
"/w44062",
|
||||||
|
"/w44242",
|
||||||
|
"/w14905",
|
||||||
|
"/w14906",
|
||||||
|
"/w14263",
|
||||||
|
"/w44265",
|
||||||
|
"/w14928"
|
||||||
|
],
|
||||||
|
"C_Cpp_Runner.enableWarnings": true,
|
||||||
|
"C_Cpp_Runner.warningsAsError": false,
|
||||||
|
"C_Cpp_Runner.compilerArgs": [],
|
||||||
|
"C_Cpp_Runner.linkerArgs": [],
|
||||||
|
"C_Cpp_Runner.includePaths": [],
|
||||||
|
"C_Cpp_Runner.includeSearch": [
|
||||||
|
"*",
|
||||||
|
"**/*"
|
||||||
|
],
|
||||||
|
"C_Cpp_Runner.excludeSearch": [
|
||||||
|
"**/build",
|
||||||
|
"**/build/**",
|
||||||
|
"**/.*",
|
||||||
|
"**/.*/**",
|
||||||
|
"**/.vscode",
|
||||||
|
"**/.vscode/**"
|
||||||
|
],
|
||||||
|
"C_Cpp_Runner.useAddressSanitizer": false,
|
||||||
|
"C_Cpp_Runner.useUndefinedSanitizer": false,
|
||||||
|
"C_Cpp_Runner.useLeakSanitizer": false,
|
||||||
|
"C_Cpp_Runner.showCompilationTime": false,
|
||||||
|
"C_Cpp_Runner.useLinkTimeOptimization": false,
|
||||||
|
"C_Cpp_Runner.msvcSecureNoWarnings": false
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
#include <IRBlaster.hpp>
|
||||||
|
|
||||||
|
void IRBlaster::send(uint16_t *data, size_t size)
|
||||||
|
{
|
||||||
|
rmt_item32_t *items = new rmt_item32_t[size];
|
||||||
|
for (size_t i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
items[i].duration0 = data[i] * 10;
|
||||||
|
items[i].level0 = 1;
|
||||||
|
items[i].duration1 = data[i] * 10;
|
||||||
|
items[i].level1 = 0;
|
||||||
|
}
|
||||||
|
ESP_ERROR_CHECK(rmt_write_items(channel, items, size, true));
|
||||||
|
delete[] items;
|
||||||
|
}
|
||||||
|
|
||||||
|
IRBlaster::IRBlaster(uint8_t pin, rmt_channel_t channel)
|
||||||
|
{
|
||||||
|
this->channel = channel;
|
||||||
|
rmt_config_t config;
|
||||||
|
config.rmt_mode = RMT_MODE_TX;
|
||||||
|
config.channel = channel;
|
||||||
|
config.gpio_num = gpio_num_t(pin);
|
||||||
|
config.mem_block_num = 1;
|
||||||
|
config.tx_config.loop_en = false;
|
||||||
|
config.tx_config.carrier_en = false;
|
||||||
|
config.tx_config.idle_output_en = true;
|
||||||
|
config.tx_config.idle_level = RMT_IDLE_LEVEL_LOW;
|
||||||
|
config.tx_config.carrier_freq_hz = 38000;
|
||||||
|
config.tx_config.carrier_level = RMT_CARRIER_LEVEL_HIGH;
|
||||||
|
config.clk_div = 80;
|
||||||
|
ESP_ERROR_CHECK(rmt_config(&config));
|
||||||
|
ESP_ERROR_CHECK(rmt_driver_install(channel, 0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
IRBlaster::IRBlaster(uint8_t pin)
|
||||||
|
{
|
||||||
|
IRBlaster(pin, RMT_CHANNEL_0);
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
#include <driver/rmt.h>
|
||||||
|
class IRBlaster
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IRBlaster(uint8_t pin, rmt_channel_t channel);
|
||||||
|
IRBlaster(uint8_t pin);
|
||||||
|
/***
|
||||||
|
* @brief Send an array of IR codes
|
||||||
|
*
|
||||||
|
* @param data Array of IR codes, each code is a 16 bit integer representing the number of 10us ticks
|
||||||
|
* @param size Size of the array
|
||||||
|
*/
|
||||||
|
void send(uint16_t *data, size_t size);
|
||||||
|
private:
|
||||||
|
rmt_channel_t channel;
|
||||||
|
};
|
|
@ -0,0 +1,45 @@
|
||||||
|
#include <IRReceiver.hpp>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
volatile unsigned int IRReceiver::irBufferPtr = 0;
|
||||||
|
volatile unsigned int IRReceiver::irBuffer[1000];
|
||||||
|
uint8_t IRReceiver::pin;
|
||||||
|
|
||||||
|
void IRReceiver::begin(uint8_t pin) {
|
||||||
|
IRReceiver::pin = pin;
|
||||||
|
IRReceiver::irBufferPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IRReceiver::start_long_receive() {
|
||||||
|
irBufferPtr = 0;
|
||||||
|
attachInterrupt(digitalPinToInterrupt(pin), IRReceiver::handleInterrupt, CHANGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
ir_data_t IRReceiver::end_long_receive() {
|
||||||
|
detachInterrupt(digitalPinToInterrupt(pin));
|
||||||
|
// The data in the array is the time between each transition, so we need to convert it to the time of each transition
|
||||||
|
ir_data_t data;
|
||||||
|
const size_t size = irBufferPtr-1;
|
||||||
|
Serial.println("Allocating memory");
|
||||||
|
data.data = (unsigned int*)calloc(size, sizeof(unsigned int));
|
||||||
|
if (data.data == nullptr) {
|
||||||
|
Serial.println("Failed to allocate memory");
|
||||||
|
data.size = 0;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
Serial.println("Copying data");
|
||||||
|
// The data in the array is the time between each transition, so we need to convert it to the time of each transition
|
||||||
|
for (size_t i = 1; i <= size; i++) {
|
||||||
|
Serial.printf("Copying data at index %d\n", i);
|
||||||
|
data.data[i-1] = irBuffer[i] - irBuffer[i-1];
|
||||||
|
}
|
||||||
|
//memcpy(data.data, (const unsigned int*)irBuffer, (size)*sizeof(unsigned int));
|
||||||
|
Serial.println("Done");
|
||||||
|
data.size = irBufferPtr;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IRAM_ATTR IRReceiver::handleInterrupt() {
|
||||||
|
if (irBufferPtr > 1000) return; //full buffer = bad data
|
||||||
|
irBuffer[irBufferPtr++] = micros(); //just continually record the time-stamp of signal transitions
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
#pragma once
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <map>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
struct ir_data_t {
|
||||||
|
unsigned int *data;
|
||||||
|
size_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Class for receiving IR signals
|
||||||
|
*
|
||||||
|
* @warning Only one IRReceiver can be used at a time
|
||||||
|
*/
|
||||||
|
class IRReceiver {
|
||||||
|
public:
|
||||||
|
static void begin(uint8_t pin);
|
||||||
|
static void start_long_receive();
|
||||||
|
static ir_data_t end_long_receive();
|
||||||
|
private:
|
||||||
|
static uint8_t pin;
|
||||||
|
static void IRAM_ATTR handleInterrupt();
|
||||||
|
static volatile unsigned int irBuffer[1000]; //stores timings - volatile because changed by ISR
|
||||||
|
static volatile unsigned int irBufferPtr; //Pointer thru irBuffer - volatile because changed by ISR
|
||||||
|
};
|
|
@ -8,7 +8,7 @@
|
||||||
// #define WRITE_DEFAULT_NETCONF
|
// #define WRITE_DEFAULT_NETCONF
|
||||||
#define CLIMATE_CARD_ENABLE
|
#define CLIMATE_CARD_ENABLE
|
||||||
#define MQTT_CARD_REGISTER
|
#define MQTT_CARD_REGISTER
|
||||||
//#define DISPLAY_ENABLE
|
#define DISPLAY_ENABLE
|
||||||
#define WEB_SERVER_ENABLE
|
#define WEB_SERVER_ENABLE
|
||||||
|
|
||||||
// Demo PLC firmware using the ESPMegaPRO OOP library
|
// Demo PLC firmware using the ESPMegaPRO OOP library
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include <ESPMegaProOS.hpp>
|
||||||
|
#include <IRBlaster.hpp>
|
||||||
|
#include <IRReceiver.hpp>
|
||||||
|
|
||||||
|
ESPMegaPRO espmega = ESPMegaPRO();
|
||||||
|
IRBlaster irBlaster = IRBlaster(14);
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
espmega.begin();
|
||||||
|
IRReceiver::begin(15);
|
||||||
|
uint16_t data[] = {100, 200, 300, 400, 500};
|
||||||
|
irBlaster.send(data, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
Serial.println("Starting long receive");
|
||||||
|
IRReceiver::start_long_receive();
|
||||||
|
delay(5000);
|
||||||
|
Serial.println("Ending long receive");
|
||||||
|
ir_data_t data = IRReceiver::end_long_receive();
|
||||||
|
Serial.printf("Recived %d data points\n", data.size);
|
||||||
|
for (size_t i = 0; i < data.size; i++) {
|
||||||
|
Serial.print(data.data[i]);
|
||||||
|
Serial.print(i == data.size-1 ? "\n" : ", ");
|
||||||
|
}
|
||||||
|
free(data.data);
|
||||||
|
}
|
Loading…
Reference in New Issue