加一个风扇,状态选择,mqtt接收,暴力反复连接mqtt

This commit is contained in:
dgjames 2025-03-15 09:40:38 +08:00
parent 6a572b6e05
commit 40961a85ea
9 changed files with 94 additions and 66 deletions

View File

@ -33,7 +33,8 @@
"at.h": "c", "at.h": "c",
"ADC.C": "cpp", "ADC.C": "cpp",
"PM2.5.C": "cpp", "PM2.5.C": "cpp",
"sensor.h": "c" "sensor.h": "c",
"status.h": "c"
}, },
// "cortex-debug.openocdPath": "d:/Develop/" // "cortex-debug.openocdPath": "d:/Develop/"
} }

View File

@ -6,6 +6,9 @@ ADC传感器
PA1 pm25 PA1 pm25
PA5 空气质量 PA5 空气质量
PA6 压力 PA6 压力
风扇
PA8
PB2
# 红外遥控贪吃蛇/显示+上传温度等数据 # 红外遥控贪吃蛇/显示+上传温度等数据

View File

@ -4,12 +4,13 @@
* uart_dma_sample uart1 * uart_dma_sample uart1
* 使使 * 使使
* "hello RT-Thread!" * "hello RT-Thread!"
*/ */
#include <rtthread.h> #include <rtthread.h>
#include <rtdevice.h> #include <rtdevice.h>
#include "status.h"
#define SAMPLE_UART_NAME "uart3" /* 串口设备名称 */ #define SAMPLE_UART_NAME "uart3" /* 串口设备名称 */
#define LOG_TAG "assistant" #define LOG_TAG "assistant"
#define DBG_LVL DBG_LOG #define DBG_LVL DBG_LOG
@ -51,13 +52,35 @@ static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
} }
return result; return result;
} }
void assist_control(char *rx_buffer)
{
if (rt_strstr(rx_buffer, "cc")!=RT_NULL)
{
fan_on();
rt_kprintf("加大抽风\n");
}
else if (rt_strstr(rx_buffer, "dd")!=RT_NULL)
{
fan_off();
rt_kprintf("关闭抽风\n");
}
else if (rt_strstr(rx_buffer, "ee")!=RT_NULL)
{
light_on();
rt_kprintf("开灯\n");
}
else if (rt_strstr(rx_buffer, "ff")!=RT_NULL)
{
light_off();
rt_kprintf("关灯\n");
}
}
static void serial_thread_entry(void *parameter) static void serial_thread_entry(void *parameter)
{ {
struct rx_msg msg; struct rx_msg msg;
rt_err_t result; rt_err_t result;
rt_uint32_t rx_length; rt_uint32_t rx_length;
static char rx_buffer[BSP_UART3_RX_BUFSIZE+ 1]; static char rx_buffer[BSP_UART3_RX_BUFSIZE + 1];
while (1) while (1)
{ {
@ -69,32 +92,15 @@ static void serial_thread_entry(void *parameter)
/* 从串口读取数据 */ /* 从串口读取数据 */
rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size); rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size);
rx_buffer[rx_length] = '\0'; rx_buffer[rx_length] = '\0';
if(!rt_strcasecmp(rx_buffer, "cc")) assist_control(rx_buffer);
{
rt_kprintf("加大抽风\n");
}
else if(!rt_strcasecmp(rx_buffer, "dd"))
{
rt_kprintf("关闭抽风\n");
}
else if(!rt_strcasecmp(rx_buffer, "ee"))
{
rt_kprintf("开灯\n");
}
else if(!rt_strcasecmp(rx_buffer, "ff"))
{
rt_kprintf("关灯\n");
}
/* 通过串口设备 serial 输出读取到的消息 */ /* 通过串口设备 serial 输出读取到的消息 */
// rt_device_write(serial, 0, rx_buffer, rx_length); // rt_device_write(serial, 0, rx_buffer, rx_length);
/* 打印数据 */ /* 打印数据 */
rt_kprintf("%s\n",rx_buffer); rt_kprintf("%s\n", rx_buffer);
} }
} }
} }
void serial_send(char *str) void serial_send(char *str)
{ {
rt_device_write(serial, 0, str, (sizeof(str) - 1)); rt_device_write(serial, 0, str, (sizeof(str) - 1));
@ -120,10 +126,10 @@ int aiv_init(void)
/* 初始化消息队列 */ /* 初始化消息队列 */
rt_mq_init(&rx_mq, "rx_mq", rt_mq_init(&rx_mq, "rx_mq",
msg_pool, /* 存放消息的缓冲区 */ msg_pool, /* 存放消息的缓冲区 */
sizeof(struct rx_msg), /* 一条消息的最大长度 */ sizeof(struct rx_msg), /* 一条消息的最大长度 */
sizeof(msg_pool), /* 存放消息的缓冲区大小 */ sizeof(msg_pool), /* 存放消息的缓冲区大小 */
RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */ RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */
/* 以 DMA 接收及轮询发送方式打开串口设备 */ /* 以 DMA 接收及轮询发送方式打开串口设备 */
rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
@ -147,4 +153,4 @@ int aiv_init(void)
return ret; return ret;
} }
/* 导出到 msh 命令列表中 */ /* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(aiv_init,siri start); MSH_CMD_EXPORT(aiv_init, siri start);

View File

@ -1 +1,2 @@
void serial_send(char *str); void serial_send(char *str);
void assist_control(char *rx_buffer);

View File

@ -24,8 +24,13 @@
struct rt_device_pwm *motor_dev; // pwm设备句柄 struct rt_device_pwm *motor_dev; // pwm设备句柄
rt_uint32_t period = 1000000000; // 单位us 向左6位变毫秒 1s rt_uint32_t period = 100000000; // 单位us 向左6位变毫秒 10s
rt_uint32_t pulse = 1000000; // rt_uint32_t pulse = 1000000;
#define PIN_MOTOR2 GET_PIN(B, 2)
int motor1=PIN_HIGH;
/** /**
@ -36,20 +41,16 @@ rt_uint32_t pulse = 1000000;
*/ */
void motor_speed(int num) void motor_speed(int num)
{ {
rt_pwm_set(motor_dev, MOTOR_PWM_DEV_CHANNEL, period, 100-(num * period / 100)); rt_pwm_set(motor_dev, MOTOR_PWM_DEV_CHANNEL, period, (100-num)/ 100 * period );
rt_pin_write(PIN_MOTOR2, num>0?PIN_LOW:PIN_HIGH);
} }
#define PIN_MOTOR1 GET_PIN(B, 2)
int motor1=PIN_HIGH;
int mot_init(void) int mot_init(void)
{ {
// rt_pin_mode(PIN_MOTOR1, PIN_MODE_OUTPUT); rt_pin_mode(PIN_MOTOR2, PIN_MODE_OUTPUT);
// rt_pin_write(PIN_MOTOR1, PIN_HIGH); rt_pin_write(PIN_MOTOR2, PIN_HIGH);
motor_dev = (struct rt_device_pwm *)rt_device_find(MOTOR_PWM_DEV_NAME); motor_dev = (struct rt_device_pwm *)rt_device_find(MOTOR_PWM_DEV_NAME);
if (motor_dev == RT_NULL) if (motor_dev == RT_NULL)
{ {
@ -57,7 +58,8 @@ int mot_init(void)
return RT_ERROR; return RT_ERROR;
} }
/* 设置PWM周期和脉冲宽度默认值 */ /* 设置PWM周期和脉冲宽度默认值 */
motor_speed(100); motor_speed(0);
rt_pwm_enable(motor_dev, MOTOR_PWM_DEV_CHANNEL);
LOG1("motor init success!"); LOG1("motor init success!");
} }
void motor_set(int argc, char **argv) void motor_set(int argc, char **argv)

View File

@ -17,6 +17,7 @@
#include "my_func.h" #include "my_func.h"
#include "indicator_led.h" #include "indicator_led.h"
#include "sensor.h" #include "sensor.h"
#include "assistant.h"
#define THREAD_PRIORITY 25 #define THREAD_PRIORITY 25
#define THREAD_STACK_SIZE 4096 #define THREAD_STACK_SIZE 4096
#define THREAD_TIMESLICE 5 #define THREAD_TIMESLICE 5
@ -119,6 +120,12 @@ static void example_message_arrive(void *pcontext, void *pclient, iotx_mqtt_even
EXAMPLE_TRACE("Topic : %.*s", topic_info->topic_len, topic_info->ptopic); EXAMPLE_TRACE("Topic : %.*s", topic_info->topic_len, topic_info->ptopic);
EXAMPLE_TRACE("Payload: %.*s", topic_info->payload_len, topic_info->payload); EXAMPLE_TRACE("Payload: %.*s", topic_info->payload_len, topic_info->payload);
EXAMPLE_TRACE("\n"); EXAMPLE_TRACE("\n");
// topic_info->payload[strlen(topic_info->payload)] = '\0';
char str_tmp[32];
rt_strncpy(str_tmp, topic_info->payload, topic_info->payload_len);
str_tmp[topic_info->payload_len] = '\0';
assist_control(str_tmp);
break; break;
default: default:
break; break;
@ -172,9 +179,12 @@ void show_lcd()
{ {
lcd_y = 10; lcd_y = 10;
easy_show_lcd("Temperature:", Temp); easy_show_lcd("Temperature:", Temp);
easy_show_lcd("Humidity:", Humi); // easy_show_lcd("Humidity:", Humi);
easy_show_lcd("Brightness:(lux)", brightness); // easy_show_lcd("Brightness:(lux)", brightness);
easy_show_lcd("Ps data:", (float)ps_data); // easy_show_lcd("Ps data:", (float)ps_data);
easy_show_lcd("Air quality:", ADC_air);
easy_show_lcd("PM2.5:", ADC_PM25);
easy_show_lcd("Pressure:",ADC_pressure);
// lcd_show_string(10, plus_lcd_y(10), 24, "Temperature:"); // lcd_show_string(10, plus_lcd_y(10), 24, "Temperature:");
// rt_sprintf(tmp, "%f", Temp); // rt_sprintf(tmp, "%f", Temp);
// lcd_show_string(10, plus_lcd_y(24), 32, tmp); // lcd_show_string(10, plus_lcd_y(24), 32, tmp);
@ -394,7 +404,6 @@ static void mqtt_example_main(void *parameter)
res = example_subscribe(pclient); res = example_subscribe(pclient);
if (res < 0) if (res < 0)
{ {
wlan_connected = RT_FALSE;
IOT_MQTT_Destroy(&pclient); IOT_MQTT_Destroy(&pclient);
return; return;
} }
@ -436,33 +445,35 @@ void wlan_connect_thread(void *parameter)
{ {
(void *)parameter; (void *)parameter;
wlan_connected=RT_FALSE; wlan_connected=RT_FALSE;
// rt_wlan_connect(WLAN_NAME,WLAN_PASSWORD); rt_wlan_connect(WLAN_NAME,WLAN_PASSWORD);
while(rt_wlan_connect(WLAN_NAME,WLAN_PASSWORD)!= RT_EOK) rt_wlan_connect(WLAN_NAME,WLAN_PASSWORD);
{ // while(rt_wlan_connect(WLAN_NAME,WLAN_PASSWORD)!= RT_EOK)
rt_thread_mdelay(2000); // {
} // rt_thread_mdelay(2000);
// }
rt_wlan_config_autoreconnect(RT_TRUE); rt_wlan_config_autoreconnect(RT_TRUE);
while (1) while (1)
{ {
if (rt_wlan_is_connected() == RT_TRUE) if (rt_wlan_is_connected() == RT_TRUE)
{ {
if(!wlan_connected) // if(!wlan_connected)
{ {
wlan_connected = RT_TRUE; wlan_connected = RT_TRUE;
rt_thread_mdelay(10000); // rt_wlan_connect(WLAN_NAME,WLAN_PASSWORD);
rt_thread_mdelay(5000);
mqt_init(); mqt_init();
} }
} }
else // else
{ // {
if(wlan_connected) // if(wlan_connected)
{ // {
wlan_connected = RT_FALSE; // wlan_connected = RT_FALSE;
IOT_MQTT_Destroy(&pclient); // IOT_MQTT_Destroy(&pclient);
rt_thread_delete(MQTT_Thread); // rt_thread_delete(MQTT_Thread);
} // }
} // }
rt_thread_mdelay(500); rt_thread_mdelay(5000);
} }
} }
// /* 用于接收消息的信号量 */ // /* 用于接收消息的信号量 */

View File

@ -169,7 +169,7 @@ static void sensor_thread(void *parameter)
warning_range("air", ADC_air, 0, 4095); warning_range("air", ADC_air, 0, 4095);
warning_range("PM25", ADC_PM25, 0, 500); warning_range("PM25", ADC_PM25, 0, 500);
warning_range("pressure", ADC_pressure, 0, 4095); warning_range("pressure", ADC_pressure, 0, 4095);
rt_thread_mdelay(1000); rt_thread_mdelay(2000);
} }
} }
void sensor_init(void) void sensor_init(void)

View File

@ -45,7 +45,7 @@ void fan_on(void)
void fan_off(void) void fan_off(void)
{ {
LOG3("fan off!"); LOG3("fan off!");
motor_speed(20); motor_speed(0);
} }
void light_on(void) void light_on(void)
@ -59,5 +59,5 @@ void light_off(void)
{ {
LOG3("light off!"); LOG3("light off!");
rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT); rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT);
rt_pin_write(PIN_LED_B, PIN_LOW); rt_pin_write(PIN_LED_B, PIN_HIGH);
} }

View File

@ -1 +1,5 @@
void danger_status(void); void danger_status(void);
void fan_on(void);
void fan_off(void);
void light_on(void);
void light_off(void);