[uCOS/RTOS]

【RTOS】RT-Thread创新设计大赛——面向物联网的智能台灯设计

[复制链接]
4257|18
手机看帖
扫描二维码
随时随地手机跟帖
一路向北lm|  楼主 | 2020-5-7 14:17 | 显示全部楼层 |阅读模式
本帖最后由 一路向北lm 于 2020-7-3 14:19 编辑


交作品啦...........



面向物联网的智能台灯设计.pdf (2.48 MB)

使用特权

评论回复

相关帖子

一路向北lm|  楼主 | 2020-6-3 11:10 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-6-25 10:05 编辑

第二部分:硬件设计

PWM调光电路设计:
        使用东软载波ESP32Fxxx作为主控可以产生多路PWM方波,输出的PWM波通过隔离的光耦进一步驱动MOS开关电路,最终输出24V的PWM放大波形。

797825ed714b1a847d.png
       电路分解,整个电路根据光耦可分为两部分:左边为光耦输入部分,也是整个电路PWM信号的输入部分;右边为光耦输出部分,也是电磁阀的驱动部分。这两部分通过光耦隔离,两边的地都不一样。整个电路的工作过程:当光耦没有PWM信号输入时,光耦发光二极管截止,光耦的光电晶体管也是截止状态,Q1是一个NMOS,也处于截止状态,电磁阀没有电流,不工作。当光耦有PWM信号输入时,光耦发光二极管导通,触发光电晶体管也导通。24V电源经电阻R1,光电晶体管的CE极,电阻R3分压使NMOSIRF540N的栅极为高电平,触发MOS管导通,电磁阀线圈有电流流过,电磁阀触发动作。二极管D1为电磁阀的泄放二极管,防止NMOS被高压损坏。电容C1起滤波作用,但同时也会增加MOS管的开关损耗。注意在实际制作时,要注意电磁阀驱动这块,要让MOS管处于开关状态,以免它发热严重。
实物焊接和调试过程:
118385ed714d816aae.png

91405ed714e73d5ec.png


731755ed714f28c15f.png
使用基于RT-Thread工程输出2Hz的方波信号,即是LED灯的翻转操作,具体代码如下,连接的指针万用表依次往复摆动,最终验证了此电路方案的可行性。

#include "board.h"
#include "rtthread.h"

struct rt_thread Task1_thread;
rt_uint8_t rt_task1_thread_stack[1024];

void task1(void *parameter);

int main()
{
  rt_thread_init(&Task1_thread,"task1",
                       task1,RT_NULL,&rt_task1_thread_stack[0],
                       sizeof(rt_task1_thread_stack),5,10);
        rt_thread_startup(&Task1_thread);           
}


//任务1:状态指示
void task1(void *parameter)
{
        while(1)
        {
                LED1_TOGGLE;
                LED2_TOGGLE;
                rt_thread_delay(500);        
                rt_kprintf("任务1正在运行,LED指示正常\r\n\r\n");        
        }  
}
绘制PCB文件如下(家里设备简陋,暂且使用插件元件啦!)
370175ed76be1e7efa.png


使用特权

评论回复
一路向北lm|  楼主 | 2020-6-5 21:19 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-6-10 17:27 编辑

硬件电路之二:主核心板卡电路设计    

   原理图如下所示,主要包括电源模块、Wifi网络模块,ES32-F0654 MCU模块、USB串口模块、DHT11/DHT22 手势感应模块、PWM驱动输出模块等。这些模块构成了一个基于东软载波的板卡的一个拓展板。
829655eda4637e407f.png
设计的PCB文件如下图所示,该PCB可以放置到东软载波ES32板卡上,作为拓展板卡使用。
991205eda464b7df9b.png

使用特权

评论回复
一路向北lm|  楼主 | 2020-6-10 17:11 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-6-10 17:30 编辑

硬件电路打样焊接:
今天顺丰给我发消息,说有个快递,迫不及待的去领了快递,打开看到了打样的板子。
736925ee0a32c48a42.png
313635ee0a335df92e.png
610095ee0a34123bd4.png

751365ee0a34961330.png

半个小时过后…………………..,焊接完毕!

焊接的按键PCB板卡
889205ee0a363483e4.png

焊接LED-PWM驱动电路
465875ee0a374ca7c9.png

焊接东软载波ES32F0654X扩展板卡
33375ee0a3823ab24.png

最后来一张全家福,30分钟的成果!
267235ee0a392be106.png

差点忘了,东软载波的核心板哈……….
589255ee0a3aa7fcf1.png

将ES32F0654X扩展板卡,装到对应的主核心板上,连线,开始测试!
535445ee0a3ba6a686.png


使用特权

评论回复
一路向北lm|  楼主 | 2020-6-10 17:21 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-6-10 22:31 编辑

硬件电路调试:
发现了一个低级的错误,ES32F0654x连接到扩展板的串口引脚接反了,瞬间无语啦!赶紧抢救,飞线。
807795ee0a5fac7a27.png
测试uart0 打印RT-Thread代码如下:(需要修改部分代码:之前的Demo是使用USART0,这里改为了Uart0
#include "board.h"
#include "rtthread.h"

struct rt_thread Task1_thread;
rt_uint8_t rt_task1_thread_stack[1024];
void task1(void *parameter);

int main()
{

  rt_kprintf("RT-Thread 设计大赛 & 21ic  ID:一路向北lm  2020-6-10\r\n");        
  rt_thread_init(&Task1_thread,"task1",
                       task1,RT_NULL,&rt_task1_thread_stack[0],
                       sizeof(rt_task1_thread_stack),5,10);
        
        rt_thread_startup(&Task1_thread);        
}
//任务1:状态指示
void task1(void *parameter)
{
        while(1)
        {
                LED1_TOGGLE;
                LED2_TOGGLE;
                rt_thread_delay(500);        
                rt_kprintf("任务1正在运行,LED指示正常\r\n\r\n");        
        }  
}
如果发现uart0发送数据乱码,需要添加(检测发送完成标志位,虽然stm32不需要检测,不然乱码!),这里自己封装了一个Uart发送字节的函数,供RT-Thread调用。
//串口UART0 发送数据 
void UartSendByte(UART_TypeDef *UARTx, uint8_t value)
{
   UARTx->TBR = value; //发送数据
while(READ_BIT(UARTx->SR, UART_SR_TFEM_MSK) == (UART_SR_TFEM_MSK)==0);  //等待发送完毕
}
好了,终于抢救过来了!串口正确打印了RT-Thread 任务信息!
259885ee0ee452c87a.png

使用特权

评论回复
一路向北lm|  楼主 | 2020-6-16 11:01 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-6-25 10:06 编辑

第三部分: RT-Thread的使用情况1:



1.使用RT-Thread的KPrintf 打印功能
//重映串口控制台到rt_kprintf
void rt_hw_console_output(const char *str)
{
   rt_enter_critical();
        while(*str!= '\0')
        {
           if(*str == '\n')
                 {
                         UartSendByte(UART0, '\r');
                          
                 }
                  UartSendByte(UART0, *str++);
        }
        rt_exit_critical();
}

2.在Nano上添加FiniSH组件
RT-ThreadFinSH 是 RT-Thread 的命令行组件(shell),提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信,ES32F0654平台上使用 FinSH 组件基本命令的效果图如下所示:
323105ee8358ddcc5a.png
本设计以串口 UART 0作为 FinSH 的输入输出端口与 PC 进行通信,描述如何在Nano 上实现 FinSH shell 功能。在 RT-Thread Nano 上添加 FinSH 组件,实现 FinSH 功能的步骤主要如下:

1添加 FinSH 源码到工程
01.移植RT-Thread的过程中已经将FinSH组件的代码添加到工程RT-Thread\\RT-Thread-Include\finsh中,只是没有添加到工程中。
570475ee835a8be20f.png
02.将对应的源文件添加到工程中,(方便管理,新建一个分组RT-Thread-finsh)全部添加到该分组下。
999765ee835b9a9b54.png
03. rtconfig中配置,打开finsh功能,打开RT_USING_FINSH宏。

#define   RT_USING_FINSH      //打开finsh功能

04.这里我遇到了一个坑,一直抱错,需要在rtconfig配置中,打开DEVICE,即RTE_USING_DEVICE宏,还需要打开RTE_FINSH_USING_MSH宏。

#define   RTE_USING_DEVICE    //打开DEVICE
#define   RTE_FINSH_USING_MSH
终于没有错误了,made………….快一点了!,不管怎么调试,按、tab键无效果,经过一天多的努力,终于找到原因………..使用RT-Thread源码里面的finsh组件源码,可能是我的RT-ThreadNano版本太老了,使用最新版的Finsh组件源码后,可以正常使用Finsh组件。RT-Thread-Finsh分组下只需要添加三个文件即可,rtconfig中配置,打开finsh功能,打开RTE_FINSH_USING_MSH 宏即可。
921155ee835db2063d.png
实现函数对接
在重映串口控制台到rt_kprintf已经完成控制台的输出,现在我们来实现控制台的输入函数,即char rt_hw_console_getchar(void)函数,具体代码如下:
char rt_hw_console_getchar(void)
{
    int ch = -1;
    if(READ_BIT(UART0->SR,UART_SR_RFNE_MSK) != RESET)
    {
        ch =  UART0->RBR & 0xff;
    }
    return ch;
}
到此,Finsh组件在ES32F0654上可以正常运行啦!………………
这样移植RT-Thread的组件以及后面的软件包太麻烦了,这里我就直接使用RT-Thread官方提供的ENV工具了,点点点即可…………….

使用特权

评论回复
一路向北lm|  楼主 | 2020-6-16 14:03 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-6-25 10:06 编辑

第三部分:RT-Thread的使用情况2


使用RT-Thread ENV工具

01.下载ENV工具,https://www.rt-thread.org/page/download.html下载RT-ThreadENV工具和源码。

199515ee855623e01b.png
02.解压RT-Thread的ENV工具,如果使用ENV工具需要准备以下三个原材料:
ENV工具源码(下载解压) 已存在
Git工具,下载,安装,并将安装执行文件路径条件到系统环境变量中 已完成
RT-Thread 源码,其中BSP分组下包含了ES32F654的板卡的支持,可以直接使用ENV图形界面来配置。
401955ee85579406cc.png
RT-Thread的ENV工具打开方式和右键打开方式
双击env.exe 或者env.bat 即可打开直接打开ENV,此方式需要切换路径到需要编译和执行的板卡BSP路径下,这样比较麻烦,可以设置右键打开,这样不管你在哪一个文件夹下都可以使用右键打开ENV,默认就是当前路径了。设置方法如下:
616015ee8605bce03c.png
109695ee8606671d51.png
使用ENV开启RT-Thread的控制台输入和控制台输出,这里选择自己设计的PCB板的串口0,具体配置如下:
打开下载的RT-Thread源码,打开BSP文件夹下东软载波的板卡文件夹,选择ES32F0654,输入Menuconfig 打开ENV的主菜单。
374705ee86079b869f.png
将串口0打开,配置为控制台输入和输出的串口,即开启了KPrintf和Finsh组件。
保存,使用命令生成MDK5的工程:Scons –target==mdk5,打开工程,烧录到板卡里,我去,真方便,比我自己在RT-Thread Nano上移植快多了。
521285ee86091a42c6.png


使用特权

评论回复
一路向北lm|  楼主 | 2020-6-16 14:08 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-6-16 14:09 编辑

使用ENV工具,开启AT组件组件客户端


本次设计需要使用AT指令和ESP-WIFI进行数据交互,需要使用RT-Thread的AT组件,AT组件的实现包括客户端的和服务器两部分。对于本设备而言,更多的情况下设备使用 AT 组件作为客户端连接服务器设备。
01.使用ENV工具,打开ES32F654MCU的串口1,此串口作为AT执行的发送和接收串口,即是和ES-WIFI通讯的端口。
152795ee861924e638.png
02.使用使用ENV工具,打开AT组件客户端功能。配置完成,保存并退出配置选项,输入命令 scons --target=mdk5 生成 MDK 工程。
722525ee861a084ca4.png
打开工程,下载 AT Client 示例代码,添加到打开的 MDK 工程中,如下图所示
717145ee861b07093f.png
编译,烧写到板卡,输入at_client_init uart0,即可初始化串口1用作AT-Client
55795ee861c36365b.png


使用特权

评论回复
一路向北lm|  楼主 | 2020-6-16 21:31 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-6-17 11:43 编辑

AT客户端组件连接ES-WIFI测试


1.ES-WIFI恢复到AT指令模式,之前烧写过第三方固件库的一定要操作此步骤:

02.  下载Flash Download Tool 烧录工具http://wiki.ai-thinker.com/esp_download
03.  打开Flash Download Tool,选择ESP8266,选择串口,和波特率,然后选择安信可的AT固件ESP8266 01 是选择8Mbit 的版本,flash地址选择0. 点击start开始烧录
975875ee8c901b9a7b.png
完成后,拔掉GPIO0退出烧写模式,进入Flash程序运行模式;RST接GND复位一次,打开串口即可使用AT命令操作。
507945ee8c928980a8.png
AT Client 模式测试


该模式下东软载波ES32F0654开发板串口1 作为 AT Client, ESP-WIFI作为 AT Server,进行数据交互模式,在本地 shell 中输入 at_client_test 命令,该 shell 命令用于发送 AT 命令到服务器,并且接收和解析服务器响应数据,如下图所示过程:
29655ee8c96179290.png
AT Client CLI 模式

ATClient CLI 功能可以转发本地 shell 输入的数据到设备连接的 AT Server 串口设备上,并在本地 shell 上实时显示 AT Client 串口接收到的数据。在本地 shell 中执行 at client 命令进入 AT Client CLI 模式即可进行数据的收发。通过 AT Client CLI 模式,用户可以很方便的完成与 AT Server 的连接与调试,极大的提高开发效率。下图演示了 AT Client CLI 功能的使用和退出:
487225ee8c98355690.png

使用特权

评论回复
一路向北lm|  楼主 | 2020-6-17 11:41 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-6-17 11:42 编辑

使用RT-Thread软件包连接到OneNet

终于要连接云了,哈哈哈,好激动!使用ENV对AT设备包和OneNet软件包云进行配置,具体操作如下:
1. env进入RT-Thread onlinepackages -> Iot internet of things -> AT DEVICES:xxxxx -> EspressifESP8266 ,设置需要连接的路由器或者热点的名称和密码,以及设置和ES-WIFI连接的串口等,具体如下图:
507005ee990697c53a.png
2. env进入RT-Thread onlinepackages -> Iot internet of things –> Iot Cloud -> OneNet ,将设备ID、鉴权信息、APIKey、产品ID、产品APIKey填入下图对应的位置。
146165ee9909086221.png
·        Enable OneNET sample:开启 OneNET 示例代码
·        Enable support MQTT protocol:开启 MQTT 协议连接 OneNET 支持
·        Enable OneNET automaticregister device:开启 OneNET 自动注册设备功能
·        device id:配置云端创建设备时获取的 设备ID
·        auth info:配置云端创建产品时 用户自定义的鉴权信息 (每个产品的每个设备唯一)
·        api key:配置云端创建设备时获取的 APIkey
·        product id:配置云端创建产品时获取的 产品ID

·        master/product apikey:配置云端创建产品时获取的 产品APIKey
3.退出保存,使用pkgs –update命令更新,再生成对应的MDK5工程,编译无误下载到开发板,上电,ES-Wifi 连接指定的路由热点打印相关信息。
130725ee990b3a9a32.png
4.测试OneNet初始化和数据点的上传,使用onenet_init命令初始化onenet云,完成后使用onenet_upload_cycle命令周期上传数据。
576655ee990c2376b4.png
5.onenet云端监测到设备上线,且曲线图在进行实时更新数据
855575ee991249c6fe.png
741465ee9912eba558.png

使用特权

评论回复
一路向北lm|  楼主 | 2020-6-25 09:58 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-6-25 10:07 编辑

第四部分: 功能的完善与开发1

1.   使用ESP-WIFI上传数据到oneNet云
在代码中添加onenet_mqtt初始化,这样就可以连接到onenet云了,设备显示上线,具体如下所示:
while(onenet_mqtt_init())
{
rt_kprintf("onenet_mqtt_init error!\r\n");
}

411425ef40442a705c.png
终端上已经打印了onenet正确连接......

494485ef4044ae0267.png
在onenet主页上可以看到我们创建的设备已经上线了!

添加数据上传线程,上传数据至云端,在ESP-WIFI 已经正常连上 WIFI 的前提下,MQTT 初始化成功后,就可以放心大胆的上传数据给 OneNet 了。创建线程2,将数据上传到onenet云端,这里上传的数据只是作为展示,并不是真正的温度数据。具体代码如下:
// onenet 上传数据线程
void task2(void *parameter)
{
  unsigned int i;
  while(onenet_mqtt_init());
        while(1)
        {
                i++;
                if(i>=100)i=1;
          onenet_mqtt_upload_digit("temperature",i);
                rt_thread_mdelay(1000);
          rt_kprintf("\r\n upload_temp thread is OK!\r\n");
        }
}
/****************************************************************************/
struct rt_thread Task2_thread;
rt_uint8_t rt_task2_thread_stack[1024];
rt_thread_init(&Task2_thread,"task2",
                       task2,RT_NULL,&rt_task2_thread_stack[0],
                       sizeof(rt_task2_thread_stack),4,50);
rt_thread_startup(&Task2_thread);        
上传数效果如下:
196905ef404d3d6321.png


使用特权

评论回复
一路向北lm|  楼主 | 2020-6-25 10:12 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-7-1 14:17 编辑

第四部分: 功能的完善与开发2



2.   oneNet云接受数据来控制台灯的亮灭
上次我们把本地的数据传到了onenet云端,这次我们来实现接受onenet云端的数据,控制台灯的亮灭。好了,先来看一下我改装的台灯哈,无聊的改装部分来喽!
684965ef407683601d.png
败家的玩意,把好好的一个LED灯拆了,电路板改的面目全非……………………………
298565ef407806db04.png
灯壳、灯罩、LED板分了三部分,大家忽略我肮脏的桌面……………
849755ef407ab889f3.png
开始拼装啦,哈哈哈,220V被我改成12V的啦,焊接的线,我自己都嫌弃…………….
858665ef407c57752f.png
装好了,盖上盖子,哈哈,这还是没怎么破坏嘛………….
930955ef407da93e52.png
暂时就引出来两根线吧,不用灯座了哈!真是奇丑无比啊…………
329435ef407ec5962c.png
丑是丑了点,但是也得试一下,是不是亮啊,通电,OK,灯亮了,也照亮了我前行的路,该出发啦,窝在家快半年啦……………..
重点的来啦……….数据下发入口, 当有平台数据下发,设备会进入mqtt_callback()回调函数,回调函数中处理数据,然后抛给应用层数据接收处理函数onenet_cmd_rsp_cb(),可通过onenet_set_cmd_rsp_cb(onenet_cmd_rsp_cb)在应用层设置。为了提高效率,我就不再使用onenet_set_cmd_rsp_cb函数,直接在mqtt_callback()回调函数中进行解析,具体测试代码如下:
static void mqtt_callback(MQTTClient *c, MessageData *msg_data)
{
    size_t res_len = 0;
    uint8_t *response_buf = RT_NULL;
    char topicname[45] = { "$crsp/" };

    RT_ASSERT(c);
    RT_ASSERT(msg_data);

    LOG_D("topic %.*s receive a message", msg_data->topicName->lenstring.len, msg_data->topicName->lenstring.data);

        LOG_D("message length is %d", msg_data->message->payloadlen);
                LOG_D("recv data is %s\n", msg_data->message->payload);
/*******************本人添加测试代码部***************************************/
                uint8_t *recv_data = msg_data->message->payload;    //获取按钮数据
                rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);        //配置LED
                if(*recv_data == '1')
                {
                   //led on
                        rt_pin_write(LED1_PIN, PIN_LOW);                 
                }
                else if((*recv_data == '0'))
                {
                 rt_pin_write(LED1_PIN, PIN_HIGH);
                }                       
/****************************************************************************/
    if (onenet_mqtt.cmd_rsp_cb != RT_NULL)
    {
        onenet_mqtt.cmd_rsp_cb((uint8_t *) msg_data->message->payload, msg_data->message->payloadlen, &response_buf,
                &res_len);

        if (response_buf != RT_NULL || res_len != 0)
        {
            strncat(topicname, &(msg_data->topicName->lenstring.data[6]), msg_data->topicName->lenstring.len - 6);

            onenet_mqtt_publish(topicname, response_buf, strlen((const char *)response_buf));

            ONENET_FREE(response_buf);
        }
    }
}
下载,测试,可成功使用onenet云,按钮控制ES32F0654板卡的PC9 LED亮灭。
359055efc2a2e827f7.png
287765efc2a3ff1e89.png
967855efc2a48991ad.png

使用特权

评论回复
一路向北lm|  楼主 | 2020-7-1 17:26 | 显示全部楼层
本帖最后由 一路向北lm 于 2020-7-1 17:28 编辑

使用RT-Thread上传温湿度数据OneNet
连接DHT11,编写驱动完成温度和湿度的数据上传,具体代码如下:
/***************************************************************************/
#include "bsp_dht11.h"
/* 可以在下面的宏定义中把后面的延时函数替换换SysTick的延时函数,就是想用那个就换成那个的 */
#define  delay_us(us)   rt_hw_us_delay(us)
#define  delay_ms(ms)   rt_thread_mdelay(ms)

#define  DH_PIN  43

void DHT11_Rst(void)           
{                 
          DHT11_IO_OUT();         //SET OUTPUT
          DHT11_Dout_0;            //拉低DQ
    delay_ms(20);     //拉低至少18ms
    DHT11_Dout_1;                  //DQ=1
          delay_us(30);     //主机拉高20~40us
}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
unsigned char DHT11_Check(void)            
{   
        unsigned char retry=0;
        DHT11_IO_IN();//SET INPUT         
    while (DHT11_Dout_IN()&&retry<100)//DHT11会拉低40~80us
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=100)return 1;
        else retry=0;
    while (!DHT11_Dout_IN()&&retry<100)//DHT11拉低后会再次拉高40~80us
        {
                retry++;
                delay_us(1);
        };
        if(retry>=100)return 1;            
        return 0;
}

//从DHT11读取一个位
//返回值:1/0
unsigned char DHT11_Read_Bit(void)                          
{
         unsigned char retry=0;
        while(DHT11_Dout_IN()&&retry<100)//等待变为低电平
        {
                retry++;
                delay_us(1);
        }
        retry=0;
        while(!DHT11_Dout_IN()&&retry<100)//等待变高电平
        {
                retry++;
                delay_us(1);
        }
        delay_us(40);//等待40us
        if(DHT11_Dout_IN())return 1;
        else return 0;                  
}
//从DHT11读取一个字节
//返回值:读到的数据
unsigned char DHT11_Read_Byte(void)   
{        
    unsigned char i,dat;
    dat=0;
        for (i=0;i<8;i++)
        {
                   dat<<=1;
            dat|=DHT11_Read_Bit();
    }                                                   
    return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi)   
{        
         unsigned char buf[5];
        unsigned char i;
        DHT11_Rst();
        if(DHT11_Check()==0)
        {
                for(i=0;i<5;i++)//读取40位数据
                {
                        buf[i]=DHT11_Read_Byte();
                }
                if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
                {
                        *humi=buf[0];
                        *temp=buf[2];
                }
        }else return 1;
        return 0;            
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在            
unsigned char DHT11_Init(void)
{         
    gpio_init_t  x;
                 /* Initialize PC9 pin */
    x.mode = GPIO_MODE_OUTPUT;
    x.pupd = GPIO_PUSH_UP;
    x.odos = GPIO_PUSH_PULL;
    x.odrv = GPIO_OUT_DRIVE_NORMAL;
    x.flt  = GPIO_FILTER_DISABLE;
    x.type = GPIO_TYPE_CMOS;
    x.func = GPIO_FUNC_1;
        
   gpio_init(DHT11_GPIO_PORT, DHT11_PIN, &x);
                           
        DHT11_Rst();  //复位DHT11
        return DHT11_Check();//等待DHT11的回应
}
/***************************************************************************/
#ifndef __DHT11_H
#define        __DHT11_H
#include <es32f065x.h>
#include "ald_gpio.h"
#include <rtthread.h>
#include "pin.h"
#include "board.h"

#define      DHT11_GPIO_PORT                 GPIOA
#define      DHT11_PIN                       GPIO_PIN_10

//IO方向设置
#define DHT11_IO_IN()   rt_pin_mode(DH_PIN, PIN_MODE_INPUT_PULLUP)        
#define DHT11_IO_OUT()  rt_pin_mode(DH_PIN,PIN_MODE_OUTPUT)

////IO操作函数                                                                                          
#define DHT11_Dout_0              gpio_write_pin(DHT11_GPIO_PORT, DHT11_PIN,0)
#define DHT11_Dout_1              gpio_write_pin(DHT11_GPIO_PORT,DHT11_PIN,1)

#define DHT11_Dout_IN()            gpio_read_pin(DHT11_GPIO_PORT,DHT11_PIN )


unsigned char DHT11_Init(void);
unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi);
#endif /* __DHT11_H */
/***************************************************************************/
云端的APP端的展示效果如下:

PC端:
950545efc568b7c0e1.png
APP端:
51415efc569e4719e.png


使用特权

评论回复
21ic小喇叭| | 2020-5-9 16:36 | 显示全部楼层
感谢分享,论坛送您1000家园币,可以兑换礼品。以及论坛给您寄出一份礼品,以示鼓励~ 您继续加油,尽快把帖子更新、继续完善,上传方案文档哦~

使用特权

评论回复
21ic小喇叭| | 2020-5-22 14:43 | 显示全部楼层
哥,记得继续完成啊

使用特权

评论回复
一路向北lm|  楼主 | 2020-5-24 17:18 | 显示全部楼层
21ic小喇叭 发表于 2020-5-22 14:43
哥,记得继续完成啊

先写word 不要急哈

使用特权

评论回复
21ic小喇叭| | 2020-6-5 10:54 | 显示全部楼层
您别忘记上传文档哈,文档的格式要求,在咱们群里有。如果没找到,联系大掌柜单独发给您

使用特权

评论回复
一路向北lm|  楼主 | 2020-6-5 14:45 | 显示全部楼层
21ic小喇叭 发表于 2020-6-5 10:54
您别忘记上传文档哈,文档的格式要求,在咱们群里有。如果没找到,联系大掌柜单独发给您 ...

好的放心

使用特权

评论回复
goyhuan| | 2020-7-16 18:19 | 显示全部楼层
好详细的说

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

277

主题

3805

帖子

76

粉丝