添加433MHZ转发

This commit is contained in:
aixiao 2023-04-14 10:05:31 +08:00
parent 295f4e8a66
commit b0f46d869e
5 changed files with 355 additions and 185 deletions

View File

@ -0,0 +1,31 @@
add_executable(forward
Forward.cc
../../radio-switch.cc
)
add_compile_options(-Wall
-Wno-format # int != int32_t as far as the compiler is concerned because gcc has int32_t as long int
-Wno-unused-function # we have some for the docs that aren't called
-Wno-maybe-uninitialized
)
# Pull in our pico_stdlib which pulls in commonly used features
target_link_libraries(forward
pico_stdlib
hardware_adc
pico_multicore)
# enable usb output, disable uart output
pico_enable_stdio_usb(forward 1)
pico_enable_stdio_uart(forward 0)
# create map/bin/hex file etc.
pico_add_extra_outputs(forward)

View File

@ -0,0 +1,220 @@
#include <iostream>
#include "pico/stdlib.h"
#include "../../radio-switch.h"
#include "pico/stdio.h"
#include "pico/multicore.h"
#include <map> // map
#include <time.h>
#define BUFFER_SIZ 1024
const uint RADIO_TRANSMIT_PIN = 16; // 433发射模块引脚
const uint RADIO_RECEIVER_PIN = 17; // 433接收模块引脚
// 闪烁LED
void light()
{
const uint LED_PIN = PICO_DEFAULT_LED_PIN;
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 1);
sleep_ms(100);
gpio_put(LED_PIN, 0);
sleep_ms(100);
}
static char pool[] = {
'1', '2', '3', '4', '5', '6', '7', '8', '9'
};
// 随即数
static int RAND()
{
int PASSWD_LEN = 3;
char password[BUFFER_SIZ];
int i = 0;
FILE *fp;
memset(password, 0, BUFFER_SIZ);
srand(time(NULL));
while (i != PASSWD_LEN) {
password[i++] = pool[rand() % sizeof(pool)];
}
//printf("%d\n", atoi(password));
return atoi(password);
}
static void SEND(const int ID)
{
const uint BUTTON = 21; // 按钮
int RANDOM = 500;
int LOOP_NUM = 1; // 循环发送次数
const uint PULSE_LENGTH = 169; // set this to PULSELENGTH RECIEVED
const uint REPEAT_TRANSMIT = 4; // set this to whatever works best for you. // 重复发送
const uint PROTOCOL = 1; // set this to PROTOCOL RECIEVED
const uint BIT_LENGTH = 24; // set this to BIT LENGTH RECIEVED
gpio_init(RADIO_TRANSMIT_PIN);
RCSwitch mySwitch = RCSwitch();
mySwitch.enableTransmit(RADIO_TRANSMIT_PIN);
mySwitch.setProtocol(PROTOCOL);
mySwitch.setPulseLength(PULSE_LENGTH);
mySwitch.setRepeatTransmit(REPEAT_TRANSMIT);
for (int i = 0; i <= LOOP_NUM; i++) {
RANDOM = RAND();
light(); // 灯闪烁
sleep_ms(RANDOM * 2 / 3); // 等待随机时间
mySwitch.send(ID, BIT_LENGTH); // 第一次发射
sleep_ms(130);
//mySwitch.send(ID + 1, BIT_LENGTH); // 第二次发射
//sleep_ms(130);
}
}
int int_string(int val, char *string, int string_len, int *str_len, char *dest, int *dest_len)
{
memset(string, 0, string_len);
memset(dest, 0, string_len);
char s[] = "55";
char d = '1';
snprintf(string, string_len, "%d", val);
*str_len = strlen(string);
if (0 == strncasecmp(string, s, 2)) {
dest[0] = d;
dest[1] = d;
strncpy(dest + 2, string + 2, (*str_len) - 2);
*dest_len = strlen(dest);
}
return 0;
}
// 核心0发送数据到核心1, 核心1判断是否有数据到来, 然后打印.
void core1_main()
{
gpio_init(RADIO_RECEIVER_PIN);
RCSwitch rcSwitch = RCSwitch();
rcSwitch.enableReceive(RADIO_RECEIVER_PIN);
char str[270];
char dest[270];
int str_len;
int dest_len;
const char s = '5';
while (true)
{
if (rcSwitch.available())
{
light();
uint32_t val = rcSwitch.getReceivedValue();
//printf("核心1接收到的433MHZ数值%u\n", val);
int_string(val, str, 270, &str_len, dest, &dest_len);
if (val != 0) {
if (str[0] == s && str[1] == s) {
//printf("核心1处理id后发射值%s\n", dest);
multicore_fifo_push_blocking(atoi(dest));
} else {
rcSwitch.resetAvailable();
val = 0;
continue;
}
}
rcSwitch.resetAvailable();
val = 0;
}
sleep_ms(130);
}
return;
}
int main()
{
stdio_init_all();
std::map < int, int >idcode;
int count=0;
uint32_t i=0;
multicore_reset_core1();
multicore_launch_core1(core1_main);
while (1)
{
if (multicore_fifo_rvalid()) {
i = multicore_fifo_pop_blocking(); // 读取核心1发送来的数据
idcode.insert( { // 插入map
i, i}
);
}
if (idcode.size() >= 3) { // 等于3个时发送
for (auto it: idcode) {
printf("核心0转发433MHZ %u\n", it.first);
SEND(it.first);
}
idcode.clear();
}
else // 一直没有3个时候, 过一段时间发送
{
count++; // 计数
if (count == 600) // 60秒
{
for (auto it: idcode) {
printf("核心0转发433MHZ %u\n", it.first);
SEND(it.first);
}
idcode.clear();
count = 0;
}
}
sleep_ms(100);
}
return 0;
}

View File

@ -2,18 +2,18 @@
#include "pico/stdlib.h" #include "pico/stdlib.h"
#include "../../radio-switch.h" #include "../../radio-switch.h"
#include "pico/stdio.h" #include "pico/stdio.h"
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/multicore.h" #include "pico/multicore.h"
#include <map> // map
//#include "hardware/adc.h"
//#include <stdio.h>
#include <time.h> #include <time.h>
#define BUFFER_SIZ 1024 #define BUFFER_SIZ 1024
//const uint RADIO_TRANSMIT_PIN = 16; // 433发射模块引脚
const uint RADIO_RECEIVER_PIN = 17; // 433接收模块引脚
// 闪烁LED // 闪烁LED
void light() void light()
{ {
@ -27,94 +27,13 @@ void light()
} }
/*
int temperature() {
// 数模转换器为 0~3.3v 最大值为 12bit
const float conversion_factor = 3.3f / (1 << 12);
float v;
float t;
stdio_init_all();
printf("Use adc channel 4, measuring temptutre\n");
// ADC初始化
adc_init();
adc_set_temp_sensor_enabled(true);
adc_select_input(4);
// 数字转换为电压
v = adc_read() * conversion_factor;
t = 27 - (v - 0.706) / 0.001721;
printf("t:%.2f v:%.2f\n", t, v);
sleep_ms(100);
return 0;
}
*/
static char pool[] = {
'1', '2', '3', '4', '5', '6', '7', '8', '9'
};
// 随即数
static int RAND()
{
int PASSWD_LEN = 3;
char password[BUFFER_SIZ];
int i = 0;
FILE *fp;
memset(password, 0, BUFFER_SIZ);
srand(time(NULL));
while (i != PASSWD_LEN) {
password[i++] = pool[rand() % sizeof(pool)];
}
//printf("%d\n", atoi(password));
return atoi(password);
}
static void SEND(const int ID)
{
const uint RADIO_TRANSMIT_PIN = 16; // 433发射模块引脚
const uint BUTTON = 21; // 按钮发射
const uint PULSE_LENGTH = 169; // set this to PULSELENGTH RECIEVED
const uint REPEAT_TRANSMIT = 4; // set this to whatever works best for you. // 重复发送
const uint PROTOCOL = 1; // set this to PROTOCOL RECIEVED
const uint BIT_LENGTH = 24; // set this to BIT LENGTH RECIEVED
gpio_init(RADIO_TRANSMIT_PIN);
RCSwitch mySwitch = RCSwitch();
mySwitch.enableTransmit(RADIO_TRANSMIT_PIN);
mySwitch.setProtocol(PROTOCOL);
mySwitch.setPulseLength(PULSE_LENGTH);
mySwitch.setRepeatTransmit(REPEAT_TRANSMIT);
int RANDOM = 500;
int LOOP_NUM = 1; // 循环发送次数
for (int i = 0; i <= LOOP_NUM; i++) {
RANDOM = RAND();
light(); // 灯闪烁
sleep_ms(RANDOM * 2 / 3); // 等待随机时间
mySwitch.send(ID, BIT_LENGTH); // 第一次发射
sleep_ms(130);
mySwitch.send(ID + 1, BIT_LENGTH); // 第二次发射
sleep_ms(130);
}
}
int int_string(int val, char *string, int string_len, int *str_len, char *dest, int *dest_len) int int_string(int val, char *string, int string_len, int *str_len, char *dest, int *dest_len)
{ {
memset(string, 0, string_len);
memset(dest, 0, string_len);
char s[] = "55"; char s[] = "55";
char d = '2'; char d = '1';
snprintf(string, string_len, "%d", val); snprintf(string, string_len, "%d", val);
*str_len = strlen(string); *str_len = strlen(string);
@ -130,41 +49,39 @@ int int_string(int val, char *string, int string_len, int *str_len, char *dest,
return 0; return 0;
} }
// 核心0发送数据到核心1, 核心1判断是否有数据到来, 然后打印. // 核心0发送数据到核心1, 核心1判断是否有数据到来, 然后打印.
void core1_main() void core1_main()
{ {
const uint RADIO_RECEIVER_PIN = 17;
gpio_init(RADIO_RECEIVER_PIN); gpio_init(RADIO_RECEIVER_PIN);
RCSwitch rcSwitch = RCSwitch(); RCSwitch rcSwitch = RCSwitch();
rcSwitch.enableReceive(RADIO_RECEIVER_PIN); rcSwitch.enableReceive(RADIO_RECEIVER_PIN);
char str[270]; const char s = '1';
char dest[270]; uint32_t val = 0;
int str_len; int str_len;
int dest_len; int dest_len;
memset(str, 0, 270); char str[270];
memset(dest, 0, 270); char dest[270];
while (true) {
if (rcSwitch.available()) { while (true)
{
if (rcSwitch.available())
{
light(); light();
uint32_t val = rcSwitch.getReceivedValue(); val = rcSwitch.getReceivedValue();
//printf("核心1接收到的433MHZ数值%u\n", val);
int_string(val, str, 270, &str_len, dest, &dest_len); int_string(val, str, 270, &str_len, dest, &dest_len);
if (val != 0) { if (val != 0) {
if (str[0] == '5' && str[1] == '5') if (str[0] == s && str[1] == s) {
{
multicore_fifo_push_blocking(atoi(dest)); multicore_fifo_push_blocking(atoi(dest));
} } else {
else
{
rcSwitch.resetAvailable(); rcSwitch.resetAvailable();
val = 0; val = 0;
continue; continue;
@ -172,62 +89,66 @@ void core1_main()
} }
rcSwitch.resetAvailable(); rcSwitch.resetAvailable();
val = 0; val = 0;
} }
/*
if (multicore_fifo_rvalid()) {
uint32_t i = multicore_fifo_pop_blocking();
printf("核心1接收到核心0的数值%u\n", i);
}
*/
sleep_ms(130); sleep_ms(130);
} }
return;
return ;
} }
int main() int main()
{ {
stdio_init_all(); stdio_init_all();
std::map < int, int >idcode;
int count=0;
uint32_t i=0;
multicore_reset_core1(); multicore_reset_core1();
multicore_launch_core1(core1_main); multicore_launch_core1(core1_main);
while (1) {
while (1)
{
if (multicore_fifo_rvalid()) { if (multicore_fifo_rvalid()) {
uint32_t i = multicore_fifo_pop_blocking(); // 读取核心1发送来的数据 i = multicore_fifo_pop_blocking(); // 读取核心1发送来的数据
//printf("核心0接收到核心1的数值%u\n", i);
//multicore_reset_core1(); // 关闭核心1
//SEND(i); // 433MHZ发送
//multicore_launch_core1(core1_main); // 开启核心1
//multicore_fifo_push_blocking(i); // 给核心1发送数据
SEND(i);
printf("核心0转发433MHZ %u\n", i);
idcode.insert( { // 插入map
i, i}
);
} }
if (idcode.size() >= 3) { // 等于3个时发送
for (auto it: idcode) {
printf("核心0接收433MHZ %u\n", it.first);
}
sleep_ms(130); idcode.clear();
}
else // 一直没有3个时候, 过一段时间发送
{
count++; // 计数
if (count == 600) // 60秒
{
for (auto it: idcode) {
printf("核心0接收433MHZ %u\n", it.first);
}
idcode.clear();
count = 0;
}
}
sleep_ms(100);
} }

View File

@ -13,9 +13,14 @@ add_compile_options(-Wall
# Pull in our pico_stdlib which pulls in commonly used features # Pull in our pico_stdlib which pulls in commonly used features
target_link_libraries(transmit pico_stdlib) target_link_libraries(transmit pico_stdlib)
# enable usb output, disable uart output # enable usb output, disable uart output
pico_enable_stdio_usb(transmit 1) pico_enable_stdio_usb(transmit 1)
pico_enable_stdio_uart(transmit 0) pico_enable_stdio_uart(transmit 0)
pico_enable_stdio_uart(transmit ENABLED)
# create map/bin/hex file etc. # create map/bin/hex file etc.
pico_add_extra_outputs(transmit) pico_add_extra_outputs(transmit)

View File

@ -6,7 +6,6 @@
#define BUFFER_SIZ 1024 #define BUFFER_SIZ 1024
// 闪烁LED // 闪烁LED
static void light() static void light()
{ {
@ -32,7 +31,6 @@ static int RAND()
int i = 0; int i = 0;
FILE *fp; FILE *fp;
memset(password, 0, BUFFER_SIZ); memset(password, 0, BUFFER_SIZ);
srand(time(NULL)); srand(time(NULL));
@ -40,19 +38,17 @@ static int RAND()
password[i++] = pool[rand() % sizeof(pool)]; password[i++] = pool[rand() % sizeof(pool)];
} }
//printf("%d\n", atoi(password));
printf("%d\n", atoi(password));
return atoi(password); return atoi(password);
} }
int main(void) { int main(void)
{
const uint RADIO_TRANSMIT_PIN = 16; // 433发射模块引脚 const uint RADIO_TRANSMIT_PIN = 16; // 433发射模块引脚
const uint BUTTON = 17; // 按钮发射 const uint BUTTON = 17; // 按钮发射
const uint PULSE_LENGTH = 169; // set this to PULSELENGTH RECIEVED const uint PULSE_LENGTH = 169; // set this to PULSELENGTH RECIEVED
const uint REPEAT_TRANSMIT = 4; // set this to whatever works best for you. // 重复发送 const uint REPEAT_TRANSMIT = 4; // set this to whatever works best for you. // 重复发送
const uint PROTOCOL = 1; // set this to PROTOCOL RECIEVED const uint PROTOCOL = 1; // set this to PROTOCOL RECIEVED
@ -67,17 +63,17 @@ int main(void) {
mySwitch.setRepeatTransmit(REPEAT_TRANSMIT); mySwitch.setRepeatTransmit(REPEAT_TRANSMIT);
int RANDOM = 30; int RANDOM = 30;
int LOOP_NUM = 2; // 循环发送次数 int LOOP_NUM = 1; // 循环发送次数
const int but = 55001; const int but = 55001;
stdio_uart_init_full(uart0, 115200, 6, 7);
while(1) while (1) {
{ //fprintf(uart0_handle, "Hello from uart0!\r\n");
//if (1 == gpio_get(BUTTON)) { // 按钮按下 //if (1 == gpio_get(BUTTON)) { // 按钮按下
for (int i=0; i<=LOOP_NUM; i++) { for (int i = 0; i <= LOOP_NUM; i++) {
RANDOM = RAND(); RANDOM = RAND();
light(); // 灯闪烁 light(); // 灯闪烁
@ -86,7 +82,6 @@ int main(void) {
mySwitch.send(but, BIT_LENGTH); // 第一次发射 mySwitch.send(but, BIT_LENGTH); // 第一次发射
sleep_ms(130); sleep_ms(130);
//mySwitch.send(but+1, BIT_LENGTH); // 第二次发射 //mySwitch.send(but+1, BIT_LENGTH); // 第二次发射
//sleep_ms(130); //sleep_ms(130);
} }
@ -95,7 +90,5 @@ int main(void) {
sleep_ms(3000); sleep_ms(3000);
} }
return 0; return 0;
} }