一、硬件说明

Neptune OpenHarmony物联网IOT模组Wi-Fi&蓝牙双模开发板、超声波模块、蜂鸣器模块、杜邦线若干

开发板相关资料:https://gitee.com/hihope_iot/docs/tree/master/Neptune

实现效果

将水杯放到超声波传感器前,实现15分钟提示一次喝水。

二、项目开发流程

  1. 接线

  1. 编写C语言代码

    主要完成以下逻辑:

    (1)编写蜂鸣器、超声波测距的代码

    (2)不断获取水杯的位置

    (3)对获取到的水杯距离做判断

    (4)如果超过时间阈值,开始报警,否则关闭报警

task_drink_Water.h

 #ifndef _TASK_DRINK_WATER_H
#define _TASK_DRINK_WATER_H #include "los_compiler.h" #ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */ VOID CreateDrinkWaterTask(VOID); #ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */ #endif /* _TASK_DRINK_WATER_H */

task_drink_water.c

 #include "task_drink_water.h"
#include "stdio.h"
#include "los_task.h"
#include "utils_file.h"
#include "wm_gpio.h" #define TASK_DRINK_WATER_PRIORITY 6 //喝水提醒任务的优先级 #define TRIG_GPIO WM_IO_PB_00 //超声波触发检测IO口,PB0
#define ECHO_GPIO WM_IO_PB_05 //超声波响应检测IO口,PB5,高电平时间就是超声波发送出去到被接收器接受的时间
#define BUZZER_GPIO WM_IO_PB_01 //蜂鸣器控制IO口,PB1 /**
* @brief 开启和关闭蜂鸣器,开启时提醒用户喝水
* @param[in] value : 1:开启,0:关闭
* @retval
*/
VOID RemindToDrinkWater(u8 value) {
tls_gpio_cfg(WM_IO_PB_01, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLLOW);
tls_gpio_write(WM_IO_PB_01, value);
} /**
* @brief 通过超声波测距启动一次测距,返回测量的距离,单位mm
* @retval 返回单位mm
*/
INT64 GetDistanceMM(VOID) {
UINT64 checkStart;
UINT64 timeCount;
UINT64 waitStart; tls_gpio_cfg(TRIG_GPIO, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_PULLLOW); //设置触发脚为输出
tls_gpio_cfg(ECHO_GPIO, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_PULLLOW); //设置检测距离IO口为输入 //控制触发脚超过10us的方波启动检测
tls_gpio_write(TRIG_GPIO, 1);
(VOID)LOS_TaskDelay(10);
tls_gpio_write(TRIG_GPIO, 0); waitStart = LOS_SysCycleGet();
//等待ECHO IO口高电平
while (tls_gpio_read(ECHO_GPIO) == 0); //高电平后开始启动计时
checkStart = LOS_SysCycleGet(); //等待ECHO IO口低电平
while (tls_gpio_read(ECHO_GPIO) == 1); //计时结束
timeCount = LOS_SysCycleGet() - checkStart;
printf("timeCount = %lld\n", timeCount); //根据CPU的频率,将时钟周期转换成ns
timeCount = (timeCount / OS_SYS_CLOCK) * OS_SYS_NS_PER_SECOND +
(timeCount % OS_SYS_CLOCK) * OS_SYS_NS_PER_SECOND / OS_SYS_CLOCK; //计算距离 340 米/s * timeCount(ns) * 1000 / 1000000000 / 2
return (170 * timeCount / 1000000); }
/**
* @brief 喝水提醒任务主函数
* @retval 无
*/
VOID TaskDrinkWaterEntry(VOID) {
//UINT64 start = LOS_SysCycleGet();
UINT64 distance;
UINT64 lastTimeToDrink = 0;
UINT64 noDrinkingTimeCount;
u8 lastStatus = 0xFF; while (1) {
distance = GetDistanceMM();
if (distance > 50) { //杯子离开超声波检测范围超过50mm,当作喝水
lastTimeToDrink = LOS_SysCycleGet(); //记录上次喝水的时间(杯子离开超声波测距模块即将放回去的时间)
}
noDrinkingTimeCount = LOS_SysCycleGet() - lastTimeToDrink; //当前时间减去上次喝水的时间,算出未喝水的时间。 //将时间转换成ms
noDrinkingTimeCount = (noDrinkingTimeCount / OS_SYS_CLOCK) * 1000 +
(noDrinkingTimeCount % OS_SYS_CLOCK) * 1000 / OS_SYS_CLOCK; printf("noDrinkingTimeCount = %lld\n", noDrinkingTimeCount);
if (noDrinkingTimeCount > 10 * 1000) { //超过10秒未喝水进行提醒,时间可改,为了测试方便默认10s
if (lastStatus != 1) { //如果上次已经开启蜂鸣器,状态未变化的情况下不再开启蜂鸣器。
printf("Have a break and drink water!,tick = %lld\n", LOS_SysCycleGet());
RemindToDrinkWater(1); //提醒喝水
lastStatus = 1;
}
} else {
if (lastStatus != 0) {
RemindToDrinkWater(0); //杯子放回,关闭提醒。
lastStatus = 0;
} }
printf("distance = %lld\n", distance);
(VOID)LOS_TaskDelay(250); //适当延迟,给其他任务执行的机会
}
} /**
* @brief 创建喝水提醒任务
* @retval 无
*/
VOID CreateDrinkWaterTask(VOID) {
UINT32 ret;
UINT32 taskID1;
UINT32 taskID2;
TSK_INIT_PARAM_S stTask = {0}; printf("TaskSample: DrinkWaterTask create start...\n");
stTask.pfnTaskEntry = (TSK_ENTRY_FUNC)TaskDrinkWaterEntry;
stTask.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE; //默认任务栈大小,根据需求配置,创建任务时,可以针对性设置
stTask.pcName = "DrinkWaterTask";
stTask.usTaskPrio = TASK_DRINK_WATER_PRIORITY;
ret = LOS_TaskCreate(&taskID1, &stTask);
if (ret != LOS_OK) {
printf("DrinkWaterTask create failed\n");
}
}

main.c

#include "devmgr_service_start.h"
#include "task_drink_water.h" void UserMain(void) {
printf("\n user task \n"); #if DEMO_CONSOLE
CreateDemoTask();
#endif
CreateDrinkWaterTask(); #if defined(LOSCFG_KERNEL_TEST_FULL) || defined(LOSCFG_KERNEL_TEST)
LosAppInit();
#else
if (DeviceManagerStart()) {
printf("[%s] No drivers need load by hdf manager!", __func__);
}
#endif
}
  1. 搭建软件开发环境,在Ubuntu下编译OpenHarmony系统源码

    在windows上写完代码后,在linux下中进行OpenHarmony代码编译

    (1)安装docker desktop,如果打开软件出现Docker Desktop stopping就需要安装 wsl_update_x64.msi

    (2)使用windows命令行,执行以下命令,以便在docker中准备一个集成好Neptune开发环境的Ubuntu(linux)系统

    路径替换成自己的!

    docker load -i D:\NeptuneOpenHarmony\software\neptune_openharmony_docker.tar

(3)将OpenHarmony源码包所在路径映射到linux下,路径替换成自己的!

docker run -it --rm -v D:\NeptuneOpenHarmony\software\Neptune:/home/Neptune
neptune_openharmony_docker:latest

(4)进入到/home/Neptune

cd /home/Neptune

(6)解压源码

tar -xvf openharmony_master.tar.gz

(7)将代码文件移动至如下位置

device\soc\winnermicro\wm800\board\app

(8)进入源码目录

cd /home/Neptune/openharmony_master`

(9)启动编译

hb build -f

  1. 烧写代码到Neptune开发板

    烧写
  2. 编译好的文件会被存放在如下目录

    out/neptune100/neptune_iotlink_demo/bin/hihope_neptune100.fls
  3. 将开发板连接到电脑上
  4. 打开Upgrade_Tools_V1.4.13下载工具
  5. 做好配置,开始烧写步骤

基于OpenHarmony的智能喝水提醒器的更多相关文章

  1. 基于Linux的智能家居的设计(3)

    2  硬件设计 本课题的硬件设计包含主控制器.传输数据设计.数据採集设计.控制驱动设计.显示设计.门禁设计. 2.1  主控制器 依据方案三选择S3C6410主控芯片,S3C6410是由Samsung ...

  2. 基于Linux的智能家居的设计(2)

    1  系统整体设计方案 智能家居系统的是一个实时查询家庭的温湿度.照明控制.自己主动控制的设定.集家庭娱乐.智能安防为一体,大量数据快处理.可靠的系统,因此在硬件和软件上都有非常大的要求,因此在这里进 ...

  3. 毕业设计——基于ZigBee的智能窗户控制系统的设计与实现

    题目:基于物联网的智能窗户控制系统的设计与实现 应用场景:突降大雨,家里没有关窗而进水:家中燃气泄漏,不能及时通风,威胁人身安全,存在火灾的隐患:家中窗户没关,让坏人有机可乘.长时间呆在人多.封闭的空 ...

  4. 基于ESP32的智能家居管理系统的设计与实现

    基于ESP32的智能家居管理系统的设计与实现 ESP32的智能家居管理系统访问链接: https://www.cnblogs.com/easyidea/p/13101165.html 一.需求分析 1 ...

  5. 超级简单!CentOS-8 安装 MySQL 8.0,比喝水还简单

    中国人不骗中国人 果然是系统和MySQL的版本越高安装越便利了 在阿里云的 CentOS-8 比喝开水还简单的安装 MySQL 8.0,开始~ 1.以 root 用户通过 CentOS 软件包管理器来 ...

  6. C语言基于GTK+Libvlc实现的简易视频播放器

    小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...

  7. 基于注解风格的Spring-MVC的拦截器

    基于注解风格的Spring-MVC的拦截器 Spring-MVC如何使用拦截器,官方文档只给出了非注解风格的例子.那么基于注解风格如何使用拦截器呢? 基于注解基本上有2个可使用的定义类,分别是Defa ...

  8. FZYZOJ-1569 喝水

    P1569 -- 喝水 时间限制:2000MS      内存限制:131072KB 状态:Accepted      标签:    无   无   无 Description GH的N个妹子要喝水, ...

  9. Clipboard Action for Mac(智能剪贴板历史管理器)破解版安装

    1.软件简介    Clipboard Action 是 macOS 系统上一款智能剪贴板历史管理器,它允许剪贴板历史中的每一段内容执行操作.使用 AppleScript 或 Automator 工作 ...

随机推荐

  1. 【Azure Developer】记录一次使用Java Azure Key Vault Secret示例代码生成的Jar包,单独运行出现 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 错误消息

    问题描述 创建一个Java Console程序,用于使用Azure Key Vault Secret.在VS Code中能正常Debug,但是通过mvn clean package打包为jar文件后, ...

  2. ASP.NET MVC-动态网页开发-宿舍管理系统

    很不容易,我在这两周为了数据库的课程设计第一次学习到了动态网页的开发.首先是尊重知识,也是为了知识不被忘记,在这里写下这第一篇博客.才疏学浅如果有什么理解错误,多包涵. 首先是环境的配置,我自己使用的 ...

  3. 贪吃蛇-JavaGUI实现

    开发的大体思路 1.定义数据 2.画上面板(将数据进行初始化赋值) 3.监听事件    键盘监听    事件监听 游戏主界面代码 点击查看代码 package com.Tang.gui.snake; ...

  4. 吐泡泡_via牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28537/E 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  5. CF455ABoredom

    题目大意: 给你一个由 \(n\) 个整数构成的序列 \(a\),玩家可以进行几个步骤,每一步他可以选择序列中的一个元素(我们把它的值定义为 \(a_k\))并删除它,此时值等于 \(a_{k + 1 ...

  6. 【高并发】通过源码深度分析线程池中Worker线程的执行流程

    大家好,我是冰河~~ 在<高并发之--通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程>一文中我们深度分析了线程池执行任务的核心流程,在ThreadPool ...

  7. 【万字长文】使用 LSM-Tree 思想基于.Net 6.0 C# 实现 KV 数据库(案例版)

    文章有点长,耐心看完应该可以懂实际原理到底是啥子. 这是一个KV数据库的C#实现,目前用.NET 6.0实现的,目前算是属于雏形,骨架都已经完备,毕竟刚完工不到一星期. 当然,这个其实也算是NoSQL ...

  8. HashSet集合存储数据的结构(哈希表)和Set集合存储㢝不重复的原理

    HashSet集合存储数据的结构(哈希表) Set集合存储㢝不重复的原理 前提:存储的元素必须重写hashCode方法和equals方法

  9. HashSet集合的介绍和哈希值

    java.util.Set接口 extends Collection接口 Set接口的特点: 1.不允许存储重复的元素 2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历 java.uti ...

  10. Linux系列之管理用户环境变量

    前言 环境变量控制你在Linux工作环境中的外观.行为和感觉.一共有两种类型的变量: 环境变量:这些是内置于系统中的进程范围的变量,控制着系统的外观和行为.因为是进程范围的,所以它们被任何子shell ...