Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
星火1号_spark_星火一号_开发板
【24嵌入式设计大赛】基于RT-Thread星火一号智能家居
发布于 2024-09-18 17:13:24 浏览:83
订阅该版
[tocm] # 多功能智能家居系统简介 本系统主要使用外设情况如下: 1.AHT10温湿度传感器信息采集 2.RW007 wifi模块使用 ## AHT10温湿度传感器的使用 ![屏幕截图 2024-09-18 160220.png](https://oss-club.rt-thread.org/uploads/20240918/a6d89254dadc1a51f5be7d151c938783.png.webp) 读取温湿度数据,代码如下: ```c aht10_device_t user_aht10= aht10_init("i2c3"); while(1) { temperature= aht10_read_temperature(user_aht10); humidity= aht10_read_humidity(user_aht10); // LOG_D("temperature %f humidity %f\r\n",temperature,humidity); rt_thread_mdelay(3000); } ``` ## rw007使用 需要自己输入热点的密码,在控制终端下达指令 ![屏幕截图 2024-09-18 162523.png](https://oss-club.rt-thread.org/uploads/20240918/c3aee7e80d4b5210f60f2bd06cb09eb1.png.webp) 代码如下: ```c #include
#ifdef RW007_USING_STM32_DRIVERS #include
#include
#include
#include
extern void spi_wifi_isr(int vector); #ifdef RW007_USING_POWERSWITCH_EXAMPLE #define RW007_PWR_PIN GET_PIN(D, 13) static void _wifi_pwr_on(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // step 1: resume SPI pin GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_SET); // step 2: open power rt_pin_write(RW007_PWR_PIN, PIN_HIGH); // step 3: rest timing rt_pin_write(RW007_RST_PIN, PIN_LOW); rt_thread_delay(rt_tick_from_millisecond(100)); rt_pin_write(RW007_RST_PIN, PIN_HIGH); /* Wait rw007 ready(exit busy stat) */ while(!rt_pin_read(RW007_INT_BUSY_PIN)) { rt_thread_delay(5); } // step 4: wait reset random pin state pass, enable interrupt rt_thread_delay(rt_tick_from_millisecond(200)); rt_pin_mode(RW007_INT_BUSY_PIN, PIN_MODE_INPUT_PULLUP); __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_4); // clean PD4 INT pin flag rt_pin_irq_enable(RW007_INT_BUSY_PIN, PIN_IRQ_ENABLE); } static void _wifi_pwr_down(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; // step 1: disable interrupt, close power rt_pin_irq_enable(RW007_INT_BUSY_PIN, PIN_IRQ_DISABLE); rt_pin_write(RW007_RST_PIN, PIN_LOW); rt_pin_write(RW007_PWR_PIN, PIN_LOW); rt_pin_mode(RW007_INT_BUSY_PIN, PIN_MODE_INPUT_PULLDOWN); /* * step 2: set spi: mosi miso clk csn pins avoid leak */ GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_RESET); } void wifi_powerswitch(void) { static int onoff = 0; rt_kprintf("wifi %s\n", onoff ? "power on" : "power down"); if (onoff) { rw007_powerswitch_request(rw007_power_switch_on); // rt_thread_delay(rt_tick_from_millisecond(650)); rw007_wifi_state_reset(); } else { rw007_powerswitch_request(rw007_power_switch_off); } onoff = !onoff; } MSH_CMD_EXPORT(wifi_powerswitch, "wifi power switch"); #endif /*RW007_USING_POWERSWITCH_EXAMPLE*/ static void rw007_gpio_init(void) { // /* Configure IO */ rt_pin_mode(RW007_RST_PIN, PIN_MODE_OUTPUT); rt_pin_mode(RW007_INT_BUSY_PIN, PIN_MODE_INPUT_PULLDOWN); /* Reset rw007 and config mode */ rt_pin_write(RW007_RST_PIN, PIN_LOW); #ifdef RW007_USING_POWERSWITCH_EXAMPLE rt_pin_mode(RW007_PWR_PIN, PIN_MODE_OUTPUT); rt_pin_write(RW007_PWR_PIN, PIN_HIGH); #endif // RW007_USING_POWERSWITCH_EXAMPLE rt_thread_delay(rt_tick_from_millisecond(100)); rt_pin_write(RW007_RST_PIN, PIN_HIGH); /* Wait rw007 ready(exit busy stat) */ while(!rt_pin_read(RW007_INT_BUSY_PIN)) { rt_thread_delay(5); } rt_thread_delay(rt_tick_from_millisecond(200)); rt_pin_mode(RW007_INT_BUSY_PIN, PIN_MODE_INPUT_PULLUP); #ifdef RW007_USING_POWERSWITCH_EXAMPLE rw007_register_powerswitch_cb(_wifi_pwr_down, _wifi_pwr_on); #endif // RW007_USING_POWERSWITCH_EXAMPLE } int wifi_spi_device_init(void) { char sn_version[32]; rw007_gpio_init(); #if (RT_VER_NUM >= 0x50000) rt_hw_spi_device_attach(RW007_SPI_BUS_NAME, "wspi", RW007_CS_PIN); #else GPIO_TypeDef *cs_gpiox; uint16_t cs_pin; cs_gpiox = (GPIO_TypeDef *)((rt_base_t)GPIOA + (rt_base_t)(RW007_CS_PIN / 16) * 0x0400UL); cs_pin = (uint16_t)(1 << RW007_CS_PIN % 16); rt_hw_spi_device_attach(RW007_SPI_BUS_NAME, "wspi", cs_gpiox, cs_pin); #endif rt_hw_wifi_init("wspi"); rt_wlan_set_mode(RT_WLAN_DEVICE_STA_NAME, RT_WLAN_STATION); rt_wlan_set_mode(RT_WLAN_DEVICE_AP_NAME, RT_WLAN_AP); rw007_sn_get(sn_version); rt_kprintf("\nrw007 sn: [%s]\n", sn_version); rw007_version_get(sn_version); rt_kprintf("rw007 ver: [%s]\n\n", sn_version); return 0; } INIT_APP_EXPORT(wifi_spi_device_init); static void int_wifi_irq(void * p) { ((void)p); spi_wifi_isr(0); } void spi_wifi_hw_init(void) { rt_pin_attach_irq(RW007_INT_BUSY_PIN, PIN_IRQ_MODE_FALLING, int_wifi_irq, 0); rt_pin_irq_enable(RW007_INT_BUSY_PIN, RT_TRUE); } static void wifi_module_ota_enable(int argc, char *args[]) { enum rw007_ota_enable_mode enable; enum rw007_ota_upgrade_mode upgrade_mode; if (argc < 2) { rt_kprintf("ota_enable 1/0 1/0\n"); return; } if (argc >= 2) { int enable_i = atoi(args[1]); enable = ((enable_i != rw007_ota_enable) ? rw007_ota_disable : rw007_ota_enable); } if (argc >= 3) { int upgrade_mode_i = atoi(args[2]); upgrade_mode = ((upgrade_mode_i != rw007_ota_upgrade_immediate) ? rw007_ota_upgrade_manual : rw007_ota_upgrade_immediate); } rw007_cfg_ota(enable, upgrade_mode); } MSH_CMD_EXPORT_ALIAS(wifi_module_ota_enable, ota_enable, enable WIFI module ota); ``` ### 阿里云平台 添加产品密钥,设备密钥将数据上传阿里云 ![屏幕截图 2024-09-18 164222.png](https://oss-club.rt-thread.org/uploads/20240918/3ca7794135e82b09654e37387f42aea1.png.webp) 从阿里云可以看到实时上传数据并且可以通过手机app也可以查询 ![屏幕截图 2024-07-19 120451.png](https://oss-club.rt-thread.org/uploads/20240918/2780786d795328adbcd393db1eb7a952.png.webp) ![微信图片_20240918165123.jpg](https://oss-club.rt-thread.org/uploads/20240918/1742bd96df814209d101558826af219e.jpg.webp) ```c static void example_message_arrive(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg) { iotx_mqtt_topic_info_t *topic_info = (iotx_mqtt_topic_info_pt) msg->msg; switch (msg->event_type) { case IOTX_MQTT_EVENT_PUBLISH_RECEIVED: /* print topic name and topic message */ EXAMPLE_TRACE("Message Arrived:"); EXAMPLE_TRACE("Topic : %.*s", topic_info->topic_len, topic_info->ptopic); EXAMPLE_TRACE("Payload: %.*s", topic_info->payload_len, topic_info->payload); EXAMPLE_TRACE("\n"); break; default: break; } } static int example_subscribe(void *handle) { int res = 0; const char *fmt = "/%s/%s/user/get"; char *topic = NULL; int topic_len = 0; topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1; topic = HAL_Malloc(topic_len); if (topic == NULL) { EXAMPLE_TRACE("memory not enough"); return -1; } memset(topic, 0, topic_len); HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME); res = IOT_MQTT_Subscribe(handle, topic, IOTX_MQTT_QOS0, example_message_arrive, NULL); if (res < 0) { EXAMPLE_TRACE("subscribe failed"); HAL_Free(topic); return -1; } HAL_Free(topic); return 0; } //aht10 temperature extern float temperature; extern float humidity; extern int rain_status; extern float co_ppm; extern int led; extern int led_state; static int example_publish(void *handle) { int res = 0; const char *fmt = "/sys/%s/%s/thing/event/property/post"; char *topic = NULL; int topic_len = 0; char *payload="{\"params\":{\"message1\":\"hello!\",\"message2\":\"hello!\",\"message3\":\"hello!\",\"message4\":\"hello!\",\"message5\":hello!}}"; char buffer[256]; int rain_status=read_rain_sensor(); int value = read_CO_sensor(); int led=read_led_sensor(); float voltage = value * (5.0 / 4095.0); // 根据ADC分辨率计算电压 float co_ppm = (voltage+0.01) /10000000; // 简单线性换算,实际需校准 snprintf(buffer,sizeof(buffer), "{\"params\":{\"message1\":\"%.2f°C\",\"message2\":\"%.2f%%\",\"message3\":\"%.2fppm\",\"message4\":\"%d\",\"message5\":%d}}" ,temperature,humidity,co_ppm,rain_status,led); topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1; topic = HAL_Malloc(topic_len); if (topic == NULL) { EXAMPLE_TRACE("memory not enough"); return -1; } memset(topic, 0, topic_len); HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME); res = IOT_MQTT_Publish_Simple(0, topic, IOTX_MQTT_QOS0, buffer, strlen(buffer)); if (res < 0) { EXAMPLE_TRACE("publish failed, res = %d", res); HAL_Free(topic); return -1; } HAL_Free(topic); return 0; } static void example_event_handle(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg) { EXAMPLE_TRACE("msg->event_type : %d", msg->event_type); } ``` ###k210模块 通过星火一号开发板串口通信来接收K210上的信号来控制电机转动 ```c /* 配置 LED 灯引脚 */ #define PIN_LED_B GET_PIN(F, 11) // PF11 : LED_B --> LED #define PIN_LED_R GET_PIN(F, 12) // PF12 : LED_R --> LED #define uchar unsigned char//宏定义无符号字符型 #define uint unsigned int //宏定义无符号整型 #define SAMPLE_UART_NAME "uart2" #define LED_PIN GET_PIN(B, 7) // 假设LED连接到PB7引脚 #define BSP_USING_LED1 #define LED1_PIN GET_PIN(B,2 ) void led_init(void) { rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); } void led_on1(void) { rt_pin_write(LED1_PIN, PIN_LOW); LOG_D("LED ON1"); } void led_off1(void) { rt_pin_write(LED1_PIN, PIN_HIGH); LOG_D("LED OFF1"); } ``` ```python from modules import ybserial serial = ybserial() serial.send_byte(0x31) serial.send_byte(0x0D) array = [0x30, 0x31, 0x32, 0x33, 0x0D] serial.send_bytearray(array) text = 'Hello Yahboom' num = serial.send(text) print("num:", num) num = 0 count = 0 CMD_1 = "1" CMD_2 = "0" from modules import ybserial import time lcd.init() sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time = 100) clock = time.clock() feature_img = image.Image(size=(64,64), copy_to_fb=False) feature_img.pix_to_ai() FACE_PIC_SIZE = 64 dst_point =[(int(38.2946 * FACE_PIC_SIZE / 112), int(51.6963 * FACE_PIC_SIZE / 112)), (int(73.5318 * FACE_PIC_SIZE / 112), int(51.5014 * FACE_PIC_SIZE / 112)), (int(56.0252 * FACE_PIC_SIZE / 112), int(71.7366 * FACE_PIC_SIZE / 112)), (int(41.5493 * FACE_PIC_SIZE / 112), int(92.3655 * FACE_PIC_SIZE / 112)), (int(70.7299 * FACE_PIC_SIZE / 112), int(92.2041 * FACE_PIC_SIZE / 112)) ] anchor = (0.1075, 0.126875, 0.126875, 0.175, 0.1465625, 0.2246875, 0.1953125, 0.25375, 0.2440625, 0.351875, 0.341875, 0.4721875, 0.5078125, 0.6696875, 0.8984375, 1.099687, 2.129062, 2.425937) kpu = KPU() kpu.load_kmodel("/sd/KPU/yolo_face_detect/face_detect_320x240.kmodel") kpu.init_yolo2(anchor, anchor_num=9, img_w=320, img_h=240, net_w=320 , net_h=240 ,layer_w=10 ,layer_h=8, threshold=0.7, nms_value=0.2, classes=1) ld5_kpu = KPU() print("ready load model") ld5_kpu.load_kmodel("/sd/KPU/face_recognization/ld5.kmodel") fea_kpu = KPU() print("ready load model") fea_kpu.load_kmodel("/sd/KPU/face_recognization/feature_extraction.kmodel") start_processing = False BOUNCE_PROTECTION = 50 fm.register(board_info.BOOT_KEY, fm.fpioa.GPIOHS0) key_gpio = GPIO(GPIO.GPIOHS0, GPIO.IN) def set_key_state(*_): global start_processing start_processing = True time.sleep_ms(BOUNCE_PROTECTION) key_gpio.irq(set_key_state, GPIO.IRQ_RISING, GPIO.WAKEUP_NOT_SUPPORT) record_ftrs = [] THRESHOLD = 80.5 recog_flag = False def extend_box(x, y, w, h, scale): x1_t = x - scale*w x2_t = x + w + scale*w y1_t = y - scale*h y2_t = y + h + scale*h x1 = int(x1_t) if x1_t>1 else 1 x2 = int(x2_t) if x2_t<320 else 319 y1 = int(y1_t) if y1_t>1 else 1 y2 = int(y2_t) if y2_t<240 else 239 cut_img_w = x2-x1+1 cut_img_h = y2-y1+1 return x1, y1, cut_img_w, cut_img_h while True: gc.collect() # print("mem free:",gc.mem_free()) # print("heap free:",utils.heap_free()) clock.tick() img = sensor.snapshot() kpu.run_with_output(img) dect = kpu.regionlayer_yolo2() fps = clock.fps() if len(dect) > 0: for l in dect : x1, y1, cut_img_w, cut_img_h= extend_box(l[0], l[1], l[2], l[3], scale=0) face_cut = img.cut(x1, y1, cut_img_w, cut_img_h) face_cut_128 = face_cut.resize(128, 128) face_cut_128.pix_to_ai() out = ld5_kpu.run_with_output(face_cut_128, getlist=True) face_key_point = [] for j in range(5): x = int(KPU.sigmoid(out[2 * j])*cut_img_w + x1) y = int(KPU.sigmoid(out[2 * j + 1])*cut_img_h + y1) face_key_point.append((x,y)) T = image.get_affine_transform(face_key_point, dst_point) image.warp_affine_ai(img, feature_img, T) feature = fea_kpu.run_with_output(feature_img, get_feature = True) del face_key_point scores = [] for j in range(len(record_ftrs)): score = kpu.feature_compare(record_ftrs[j], feature) scores.append(score) if len(scores): max_score = max(scores) index = scores.index(max_score) if max_score > THRESHOLD: img.draw_string(0, 195, "persion:%d,score:%2.1f" %(index, max_score), color=(0, 255, 0), scale=2) recog_flag = True time.sleep_ms(1000) # if recog_flag == True: num = serial.send(CMD_1) # if index == 0: # img.draw_string(0, 195, "zhangsan, score:%2.1f" %(max_score), color=(0, 255, 0), scale=2) # elif index == 1: # img.draw_string(0, 195, "lisi, score:%2.1f" %(max_score), color=(0, 255, 0), scale=2) # elif index == 2: # img.draw_string(0, 195, "wangwu, score:%2.1f" %(max_score), color=(0, 255, 0), scale=2) # elif index == 3: # img.draw_string(0, 195, "zhaoliu, score:%2.1f" %(max_score), color=(0, 255, 0), scale=2) # else: # img.draw_string(0, 195, "persion:%d,score:%2.1f" %(index, max_score), color=(0, 255, 0), scale=2) else: img.draw_string(0, 195, "unregistered,score:%2.1f" %(max_score), color=(255, 0, 0), scale=2) del scores if start_processing: record_ftrs.append(feature) print("record_ftrs:%d" % len(record_ftrs)) start_processing = False if recog_flag: img.draw_rectangle(l[0],l[1],l[2],l[3], color=(0, 255, 0)) recog_flag = False time.sleep_ms(1000) num = serial.send(CMD_2) else: img.draw_rectangle(l[0],l[1],l[2],l[3], color=(255, 255, 255)) del (face_cut_128) del (face_cut) img.draw_string(0, 0, "%2.1ffps" %(fps), color=(0, 60, 255), scale=2.0) img.draw_string(0, 215, "press boot key to regist face", color=(255, 100, 0), scale=2.0) lcd.display(img) ``` ####语音模块 通过TX和RX发出信号给星火一号单片机来控制单片机上LED的亮灭以及电机的开关 代码如下: ```c uint8 idata nAsrRes; uint8 i=0; Led_test(); MCU_init(); LD_Reset(); UartIni(); /*串口初始化*/ nAsrStatus = LD_ASR_NONE;// 初始状态:没有在作ASR #ifdef TEST PrintCom("一级口令:小杰\r\n"); PrintCom("二级口令:1、代码测试 PrintCom(" 2、关灯\r\n"); PrintCom(" 3、开灯\r\n"); PrintCom(" 5、打开风扇\r\n"); PrintCom(" 6、关闭风扇\r\n"); #endif ``` ##### 总结 该系统的底层程序基本上没有自己动手去编写,仅仅是通过官方例程或者论坛文章进行修改重组。唯一不足的地方是APP控制LED出现问题解析数据可能会丢失,希望官方可以看到并整改。 因本人水平有限,文章内容及代码中可能会出现错误,还请谅解。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
MZYK_1882
这家伙很懒,什么也没写!
文章
2
回答
0
被采纳
0
关注TA
发私信
相关文章
1
[星火一号] 代码模板, 手动写启动代码, 开机后 snprintf 不能处理 %llu 了, 是有什么配置上的冲突吗?
2
使用MDK5.37开发星火一号,双击mklinks.bat 文件后,目录下没有 rt-thread 和 libraries 的文件夹图标。
3
studio文件构建丢失
4
rtt中星火一号stm-32怎么把两个示例工程合并成一个
5
星火一号串口发送问题
6
基于开发板建工程的疑问
7
使用星火一号开发板建工程的奇怪问题
8
星火一号板pwm功能,不报错,但也不输出,为什么?
9
星火一号怎么强制改变已占用的引脚的功能呢
10
火星一号的标准库在哪里?外设的数据手册在哪里看?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
文件系统
DMA
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
ota在线升级
WIZnet_W5500
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
中断
flashDB
socket
Debug
GD32
编译报错
msh
keil_MDK
rt_mq_消息队列_msg_queue
C++_cpp
at_device
MicroPython
ulog
本月问答贡献
rv666
8
个答案
2
次被采纳
踩姑娘的小蘑菇
5
个答案
2
次被采纳
道友
4
个答案
2
次被采纳
用户名由3_15位
9
个答案
1
次被采纳
张世争
8
个答案
1
次被采纳
本月文章贡献
Licy
3
篇文章
1
次点赞
rv666
1
篇文章
6
次点赞
rtt_dmx
1
篇文章
5
次点赞
jaffer
1
篇文章
5
次点赞
不灬忘初心
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部