淘宝app网站建设,网站正在建设中模板免费下载,做seo营销网站,酒店定房网站开发大家好#xff0c;我是 Hello阿尔法#xff0c;这段时间参与了保定飞凌嵌入式技术有限公司举办的 ElfBoard 共创社招募活动#xff0c;并有幸成为了一名共创官#xff0c;官方寄来了一块 ELF 1 开发板#xff0c;开箱看这里 ELF 1 开箱初体验。
作为共创官#xff0c;我…大家好我是 Hello阿尔法这段时间参与了保定飞凌嵌入式技术有限公司举办的 ElfBoard 共创社招募活动并有幸成为了一名共创官官方寄来了一块 ELF 1 开发板开箱看这里 ELF 1 开箱初体验。
作为共创官我使用 ELF 1 完成了一个智能家居的小项目。除了 ELF 1 开发板之外还使用了一块其他厂商的 Linux 开发板 IMX6U主要原因是在多次抽奖中都没有抽中显示屏只有我的 IMX6U 有屏幕其实这样也正好符合项目背景带有屏幕的 IMX6U 作为智能家居的控制面板ELF 1 作为被控终端设备它可以是电灯、电扇、空调器也可以是冰箱、彩电、洗衣机……实现效果如下图所示 项目简介
IMX6U 模拟智能家居中的主控面板实时刷新显示时间、天气、空气质量、温湿度等信息实现对家居设备电灯、窗帘、通风扇的控制天气数据来自于心知天气ELF 1 模拟终端设备三个 LED 分别代表电灯、窗帘、通风扇ADC 模拟空气质量检测器温湿度则用来检测环境中的温湿度。IMX6U 和 ELF 1 两者通过以太网实现交互ELF 1 和 IMX6U 均基于 Linux 系统开发资源使用情况如下所示
ELF 1 开发板3 个 LED、ADC、温湿度传感器、以太网口IMX6U 开发板5inch RGB 显示屏、以太网口
IMX6U 工程
IMX6U 源码工程结构如图所示 IMX6U 源码工程以 LVGL 的 Linux 移植工程为基础具体实现请阅读 嵌入式 Linux 下的 LVGL 移植app 文件夹存放应用源码build 文件夹为编译输出目录ui 文件夹存放 UI 界面源码具体实现请阅读 基于 LVGL 使用 SquareLine Studio 快速设计 UI 界面。
app
app 文件夹包括有 cJSON 解析器、通信协议 Protocol、网络编程接口 Socket、天气获取、按键以及时间、温湿度数据更新等cJSON 是使用了一个开源的、C 语言编写的超轻量级 JSON 解析器关于 Protocol 请阅读 一个简洁实用的自定义通信协议socket 文件夹主要内容为 TCP 服务端和客户端的创建请阅读 Linux 下 socket 编程介绍及 TCP 客户端与服务端创建示例天气数据通过心知天气 API 获取相关实现代码如下
// weather.c
int weather_init(void)
{weather_client_fd client_init_socket();/* 组合 GET 请求 */sprintf(weather_buffer, GET_REQUEST_PACKAGE, DAILY_JSON, API_KEY, WUHAN);/* 发送请求 */client_send_data(weather_client_fd, weather_buffer, strlen(weather_buffer));/* 接收天气数据 JSON 格式*/client_receive_data(weather_client_fd, weather_json, weather_json_size);/* 解析天气数据 */cJSON_Daily_WeatherParse(weather_json, Weather_now);/* 更新天气显示 */memset(weather_buffer, 0, BUFFER_SIZE);sprintf(weather_buffer, %s / %s, Weather_now.text_day[0], Weather_now.text_night[0]);lv_label_set_text(ui_TextDay, weather_buffer);lv_label_set_text(ui_MinTemp, Weather_now.low[0]);lv_label_set_text(ui_MaxTemp, Weather_now.high[0]);lv_label_set_text(ui_outHum, Weather_now.humidity[0]);/* 更新天气图片 */int code *Weather_now.code_day[0] - 48;switch (code){case 0: lv_img_set_src(ui_weatherImg, ui_img_icons_00_png); break;......case 99: lv_img_set_src(ui_weatherImg, ui_img_icons_99_png); break;default: break;}client_close_socket(weather_client_fd);return 0;
}以按键为例实现数据打包、发送相关代码
static void led_ryg_turn(int cmd, int code)
{/* 组合命令 */msg_frame_t led_msg_frame;led_msg_frame.type LED_RYG;led_msg_frame.cmd cmd;led_msg_frame.code code;led_msg_frame.datalen 0;/* 打包命令 */msg_buf_t *_msg_buf pkg_frame(led_msg_frame);/* 发送按键命令 */server_send_data(client_fd, (char *)_msg_buf-buf_ptr, _msg_buf-buf_size);
}static void btn1_click_cb(lv_event_t *event)
{printf(Button1 clicked\n);static char flag 0;if(flag 0){flag 1;led_ryg_turn(LED_R, LED_ON);}else{flag 0;led_ryg_turn(LED_R, LED_OFF);}
}static void btn2_click_cb(lv_event_t *event)
{// ...
}static void btn3_click_cb(lv_event_t *event)
{// ...
}int button_init(void)
{lv_obj_add_event_cb(ui_Button1, btn1_click_cb, LV_EVENT_CLICKED, NULL);lv_obj_add_event_cb(ui_Button2, btn2_click_cb, LV_EVENT_CLICKED, NULL);lv_obj_add_event_cb(ui_Button3, btn3_click_cb, LV_EVENT_CLICKED, NULL);return 0;
}数据接收、解析、命令执行相关代码
static int ctrl_dev_aht20(msg_frame_t *_msg_pack)
{// ...return 0;
}static int ctrl_dev_adc(msg_frame_t *_msg_pack)
{printf(--- ctrl_dev_adc ---\r\n);uint16_t adc_raw (uint16_t)(_msg_pack-data[0] 8) _msg_pack-data[1];uint8_t pm2_5 adc_raw / 16;char pm2_5_src[4];printf(adc raw value: %d, pm2_5 value: %d \r\n, adc_raw, pm2_5);lv_arc_set_value(ui_Air, pm2_5);snprintf(pm2_5_src, sizeof(pm2_5_src), %d, pm2_5);lv_label_set_text(ui_AirValue, pm2_5_src);return 0;
}static int ctrl_cmd_func(const msg_pkg_t *_msg_pkg)
{printf(--- ctrl_cmd_func ---\r\n);switch(_msg_pkg-pkg-type){case AHT20: ctrl_dev_aht20(_msg_pkg-pkg); break;case ADC: ctrl_dev_adc(_msg_pkg-pkg); break;default: return -1;}return 0;
}static void *recv_thread(void *arg)
{recv_msg_buf-buf_ptrrecv_msg_buf-buf;while(1){if(server_receive_data(client_fd, (char *)recv_msg_buf-buf_ptr, (ssize_t *)recv_msg_buf-buf_size) 0){printf(thread recv \r\n);msg_buf_print(recv_msg_buf);/* 解析数据包命令 */msg_pkg_t *_msg_pkg unpkg_frame(recv_msg_buf-buf_ptr, recv_msg_buf-buf_size);/* 执行命令 */ctrl_cmd_func(_msg_pkg);} }return NULL;
}/* 线程创建 */
pthread_create(recv_thread_id, NULL, recv_thread, NULL);ELF 1 工程
ELF 1 源码工程结构如图所示 src 文件夹存放源文件inc 文件夹存放头文件obj 为编译输出目录客户端创建、数据打包、发送、接收、命令执行与 IMX6U 工程实现类似不再介绍数据采集、LED 控制采用文件操作实现。
功能演示
抖音视频链接
更多内容
CSDN博客Hello阿尔法哔哩哔哩Hello阿尔法知乎Hello阿尔法