本帖最后由 sun63312 于 2021-8-16 13:30 编辑
小熊派HarmonyOS“伪碰一碰”LED控制实现
一、简介:
拖了有点久,有几个BUG一直没有解决,现在算是初步实现了我之前想要实现的效果:基于小熊派[D4_iot_tcp_server]例程实现“碰一碰”控制LED灯的想法。
使用的并不是真正的“碰一碰”技术,只是基于tcp实现了webserver功能,然后手机端通过NFC能读取到这个webserver的HTTP并打开网页进行控制,所以我称之为“伪碰一碰”。
代码主要结合以下功能:
1、wifi连接-静态IP配置(DHCP后我一直获取不到准确的IP,这个卡了很久最后只能妥协先用静态IP了)
2、基于tcp server的webserver(提示:端口号必须是80)
3、PWM
4、I2C+NFC
二、实现功能演示
使用带NFC功能的手机,碰一碰可以获取到写入NFC的网页信息(我这里用iPhone XR演示)
NFC成功感应后,弹出如上信息,电机进入就能看到我写的非常简易的web了,如下图:
最上面显示当前LED的状态和亮度百分比,下面一行则是点击对应的here,可以实现后面对应描述的功能。第一个here是关闭LED灯,第二个here是打开LED并且是100%的亮度。第三个here就是NFC读取到的网页内容,切换LED灯的开关状态。第四个here点击后开关呼吸灯模式。
原理解释:
其实就是设置一个简单的类似http的服务器,
服务器将根据请求设置LED的状态
http://server_ip/gpio/000 关闭LED
http://server_ip/gpio/050 打开LED,PWM输出50%
http://server_ip/gpio/100 全开LED,PWM输出100%
(说明:输入数值必须是3位,输入数值范围000~100)
http://server_ip/gpio/F 切换LED开关状态
(说明:关闭的时候就打开,比如上次关闭前打开PWM50%,那么再次打开还是保持50%)
http://server_ip/lwip 打开一个测试界面
其他错误输入,会打开一个400的网站
server_ip就是连接的IP,我这里用了静态IP地址192.168.1.200
所以其实用电脑或者手机浏览器直接输入对应的网址就能控制LED(注意必须在同一个局域网内哦)
演示视频:
三、部分修改过的代码简单说明
1、wifi连接静态IP分配
applications\BearPi\BearPi-HM_Nano\sample\my_WPYP_LED\src\wifi_connect.c下
//配置静态IP
if (g_lwip_netif)
{
hi_sta_set_addr(g_lwip_netif);
osEventFlagsSet(wifi_connect_evt_id, FLAGS_MSK1);
}
2、基于tcp server的webserver
applications\BearPi\BearPi-HM_Nano\sample\my_WPYP_LED\wpyp_led_demo.c下:
这是接收tcp消息:
if ((ret = lwip_recv(conn, recvbuf, sizeof(recvbuf), 0)) == -1) //等待tcp消息
{
printf("recv error \r\n");
lwip_close(conn);
return;
}
这是部分接收信息后进行数据判断,正确后发送相应网页信息的代码:
else if (strncmp((char *)recvbuf, "GET /lwip", 9) == 0)
{
lwip_write(conn, htmldata, sizeof(htmldata) - 1);
}
3、PWM呼吸灯效果
applications\BearPi\BearPi-HM_Nano\sample\my_WPYP_LED\wpyp_led_demo.c下:
if (LED_BLN_flag == 1)
{
for (i = 0; i < 40000; i += 100)
{
if (LED_BLN_flag == 0)
break;
//输出不同占空比的PWM波
PwmStart(WIFI_IOT_PWM_PORT_PWM2, i, 40000); //0时LED灭,40000的分频160Mhz/40000 = 4Kh
usleep(10);
}
}
4、NFC写入web信息
applications\BearPi\BearPi-HM_Nano\sample\my_WPYP_LED\src\i2c_nfc.c下
其中【storeUrihttp】是有点点小修改哦,并且使用等待wifi连接成功后的事件
while (1)
{
flags = osEventFlagsWait(wifi_connect_evt_id, FLAGS_MSK1, osFlagsWaitAny, osWaitForever);
printf("NFC EVEN Flags is %d\n", flags);
ret = storeUrihttp(NDEFFirstPos, (uint8_t *)WEB);
if (ret != 1)
{
printf("NFC Write Data Falied :%d ", ret);
}
usleep(10000); //延迟10ms
}
四、移植说明
1、源码分享
my_WPYP_LED.rar
(21.82 KB, 下载次数: 39)
2、移植说明
解压压缩包,后直接把文件夹添加到applications\BearPi\BearPi-HM_Nano\sample路径下,然后修改applications\BearPi\BearPi-HM_Nano\sample\BUILD.gn文件,如下图就能使用了:
五、还存在的问题
1、没法使用DHCP,非常的遗憾
2、没有写WIFI断开重连的功能
3、配置WIFI时代码默认死的,没法使用手机配置
4、web写的有点low
后面将继续更新,不过要再学习华为云和MQTT后,希望能解决上面这些BUG,并且实行真的“碰一碰”。