0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于华为云物联网平台设计的浇花神器(STM32设备)

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-05-28 14:11 次阅读

1. 前言

随着社会的不断发展和人们生活水平的逐渐提高,人们逐渐追求高质量的生活,很多人都会选择在家里或办公室种植一些花卉以净化家庭空气,陶冶情操,但是很多人忙于工作、学习、出差、旅游或者一些其他的原因,不能及时地对花卉进行照料,短时间内导致很多花卉因缺水分而影响正常生长,长时间不照料有些名贵的花卉直接死亡。基于上述状况,提出了此基于物联网的智慧浇花系统。该系统采用工业高精度土壤温湿度传感器采集花盆中的突然温湿度,环境的温度湿度,通过ESP8266 WIFI实时上传当前的土壤温湿度、环境光照度等数据到华为云物联网云平台,可以通过 app实时查看花卉的土壤湿度、环境温度等信息,并且本地通过OLED显示屏实时显示这些信息,可以设定某种花适宜的生长的土壤湿度条件,实现自动控制给花浇水,即能让花卉生长在适宜的湿度下,与目前市场上的自动浇花系统相比,该系统的特点具有远程控制,低成本、极高的资源利用率、操作简单和反应灵敏等。

2. 整体系统设计

主控MCU选择STM32F103芯片,通过土壤湿度传感器、环境温湿度传感器,检测整个周边环境信息,再通过ESP8266 WIFI传递到物联网平台。程序里可以预设湿度阀值,当检测到土壤湿度低于阀值就自动浇花。在手机APP上可以实现远程控制水泵浇花,本地在搭载一个TFT小尺寸显示屏,可以实时显示测量检测的数据,在办公室里也可以通过TFT彩屏显示屏解周围环境的信息。

3. 应用侧软件运行效果

image-20220314220612175.png


image-20220314221035015.png


image-20220314220440225.png

4. 硬件运行效果

image-20220314225450773.png


image-20220315004128180.png


image-20220315012115581.png


9)ZPR5ZTLKT1V945T)LI420.jpg


image.png


1.jpg


image-20220315015914129.png


image-20220315015941794.png


image-20220315020302958.png

5. 创建产品、设备

image.png


image.png


image.png

6.硬件核心代码–ESP8266

#include "esp8266.h"
u8 ESP8266_IP_ADDR[16]; //255.255.255.255
u8 ESP8266_MAC_ADDR[18]; //硬件地址
/*
函数功能: ESP8266命令发送函数
函数返回值:0表示成功  1表示失败
*/
u8 ESP8266_SendCmd(char *cmd)
{
    u8 i,j;
    for(i=0;i<10;i++) //检测的次数--发送指令的次数
    {
        USARTx_StringSend(USART2,cmd);
        for(j=0;j<100;j++) //等待的时间
        {
            delay_ms(50);
            if(USART2_RX_FLAG)
            {
                USART2_RX_BUFFER[USART2_RX_CNT]='\0';
                USART2_RX_FLAG=0;
                USART2_RX_CNT=0;
                if(strstr((char*)USART2_RX_BUFFER,"OK"))
                {
                    return 0;
                }
            }
        }
    }
    return 1;
}

/*
函数功能: ESP8266硬件初始化检测函数
函数返回值:0表示成功  1表示失败
*/
u8 ESP8266_Init(void)
{
    //退出透传模式
    USARTx_StringSend(USART2,"+++");
    delay_ms(100);
     //退出透传模式
    USARTx_StringSend(USART2,"+++");
    delay_ms(100);
    return ESP8266_SendCmd("AT\r\n");
}

/*
函数功能: 一键配置WIFI为AP+TCP服务器模式
函数参数:
char *ssid  创建的热点名称
char *pass  创建的热点密码 (最少8位)
u16 port    创建的服务器端口号
函数返回值: 0表示成功 其他值表示对应错误值
*/
u8 ESP8266_AP_TCP_Server_Mode(char *ssid,char *pass,u16 port)
{
    char *p;
    u8 i;
    char ESP8266_SendCMD[100]; //组合发送过程中的命令
    /*1. 测试硬件*/
    if(ESP8266_SendCmd("AT\r\n"))return 1;
    /*2. 关闭回显*/
    if(ESP8266_SendCmd("ATE0\r\n"))return 2;
    /*3. 设置WIFI模式*/
    if(ESP8266_SendCmd("AT+CWMODE=2\r\n"))return 3;
    /*4. 复位*/
    ESP8266_SendCmd("AT+RST\r\n");
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    /*5. 关闭回显*/
    if(ESP8266_SendCmd("ATE0\r\n"))return 5;
    /*6. 设置WIFI的AP模式参数*/
    sprintf(ESP8266_SendCMD,"AT+CWSAP=\"%s\",\"%s\",1,4\r\n",ssid,pass);
    if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
    /*7. 开启多连接*/
    if(ESP8266_SendCmd("AT+CIPMUX=1\r\n"))return 7;
    /*8. 设置服务器端口号*/
    sprintf(ESP8266_SendCMD,"AT+CIPSERVER=1,%d\r\n",port);
    if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
    /*9. 查询本地IP地址*/
    if(ESP8266_SendCmd("AT+CIFSR\r\n"))return 9;
    //提取IP地址
    p=strstr((char*)USART2_RX_BUFFER,"APIP");
    if(p)
    {
        p+=6;
        for(i=0;*p!='"';i++)
        {
            ESP8266_IP_ADDR[i]=*p++;
        }
        ESP8266_IP_ADDR[i]='\0';
    }
    //提取MAC地址
    p=strstr((char*)USART2_RX_BUFFER,"APMAC");
    if(p)
    {
        p+=7;
        for(i=0;*p!='"';i++)
        {
            ESP8266_MAC_ADDR[i]=*p++;
        }
        ESP8266_MAC_ADDR[i]='\0';
    }
    
    //打印总体信息
    printf("当前WIFI模式:AP+TCP服务器\n");
    printf("当前WIFI热点名称:%s\n",ssid);
    printf("当前WIFI热点密码:%s\n",pass);
    printf("当前TCP服务器端口号:%d\n",port);
    printf("当前TCP服务器IP地址:%s\n",ESP8266_IP_ADDR);
    printf("当前TCP服务器MAC地址:%s\n",ESP8266_MAC_ADDR);
    return 0;
}

/*
函数功能: TCP服务器模式下的发送函数
发送指令: 
*/
u8 ESP8266_ServerSendData(u8 id,u8 *data,u16 len)
{
    u8 i,j,n;
    char ESP8266_SendCMD[100]; //组合发送过程中的命令
    for(i=0;i<10;i++)
    {
        sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d,%d\r\n",id,len);
        USARTx_StringSend(USART2,ESP8266_SendCMD);
        for(j=0;j<10;j++)
        {
            delay_ms(50);
            if(USART2_RX_FLAG)
            {
                USART2_RX_BUFFER[USART2_RX_CNT]='\0';
                USART2_RX_FLAG=0;
                USART2_RX_CNT=0;
                if(strstr((char*)USART2_RX_BUFFER,">"))
                {
                    //继续发送数据
                    USARTx_DataSend(USART2,data,len);
                    //等待数据发送成功
                    for(n=0;n<200;n++)
                    {
                        delay_ms(50);
                        if(USART2_RX_FLAG)
                        {
                            USART2_RX_BUFFER[USART2_RX_CNT]='\0';
                            USART2_RX_FLAG=0;
                            USART2_RX_CNT=0;
                            if(strstr((char*)USART2_RX_BUFFER,"SEND OK"))
                            {
                                return 0;
                            }
                         }            
                    }   
                }
            }
        }
    }
    return 1;
}

/*
函数功能: 配置WIFI为STA模式+TCP客户端模式
函数参数:
char *ssid  创建的热点名称
char *pass  创建的热点密码 (最少8位)
char *p     将要连接的服务器IP地址
u16 port    将要连接的服务器端口号
u8 flag     1表示开启透传模式 0表示关闭透传模式
函数返回值:0表示成功  其他值表示对应的错误
*/
u8 ESP8266_STA_TCP_Client_Mode(char *ssid,char *pass,char *ip,u16 port,u8 flag)
{
    char ESP8266_SendCMD[100]; //组合发送过程中的命令
    //退出透传模式
    //USARTx_StringSend(USART2,"+++");
    //delay_ms(50);
    /*1. 测试硬件*/
    if(ESP8266_SendCmd("AT\r\n"))return 1;
    /*2. 关闭回显*/
    if(ESP8266_SendCmd("ATE0\r\n"))return 2;
    /*3. 设置WIFI模式*/
    if(ESP8266_SendCmd("AT+CWMODE=1\r\n"))return 3;
    /*4. 复位*/
    ESP8266_SendCmd("AT+RST\r\n");
    delay_ms(1000);
    delay_ms(1000);
    delay_ms(1000);
    /*5. 关闭回显*/
    if(ESP8266_SendCmd("ATE0\r\n"))return 5;
    /*6. 配置将要连接的WIFI热点信息*/
    sprintf(ESP8266_SendCMD,"AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pass);
    if(ESP8266_SendCmd(ESP8266_SendCMD))return 6;
    /*7. 设置单连接*/
    if(ESP8266_SendCmd("AT+CIPMUX=0\r\n"))return 7;
    /*8. 配置要连接的TCP服务器信息*/
    sprintf(ESP8266_SendCMD,"AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",ip,port);
    if(ESP8266_SendCmd(ESP8266_SendCMD))return 8;
    /*9. 开启透传模式*/
    if(flag)
    {
       if(ESP8266_SendCmd("AT+CIPMODE=1\r\n"))return 9; //开启
       if(ESP8266_SendCmd("AT+CIPSEND\r\n"))return 10;  //开始透传
       if(!(strstr((char*)USART2_RX_BUFFER,">")))
       {
            return 11;
       }
        //如果想要退出发送:  "+++"
    }
    
    printf("WIFI模式:STA+TCP客户端\r\n");
    printf("Connect_WIFI热点名称:%s\r\n",ssid);
    printf("Connect_WIFI热点密码:%s\r\n",pass);
    printf("TCP服务器端口号:%d\r\n",port);
    printf("TCP服务器IP地址:%s\r\n",ip);
    return 0;
}


/*
函数功能: TCP客户端模式下的发送函数
发送指令: 
*/
u8 ESP8266_ClientSendData(u8 *data,u16 len)
{
    u8 i,j,n;
    char ESP8266_SendCMD[100]; //组合发送过程中的命令
    for(i=0;i<10;i++)
    {
        sprintf(ESP8266_SendCMD,"AT+CIPSEND=%d\r\n",len);
        USARTx_StringSend(USART2,ESP8266_SendCMD);
        for(j=0;j<10;j++)
        {
            delay_ms(50);
            if(USART2_RX_FLAG)
            {
                USART2_RX_BUFFER[USART2_RX_CNT]='\0';
                USART2_RX_FLAG=0;
                USART2_RX_CNT=0;
                if(strstr((char*)USART2_RX_BUFFER,">"))
                {
                    //继续发送数据
                    USARTx_DataSend(USART2,data,len);
                    //等待数据发送成功
                    for(n=0;n<200;n++)
                    {
                        delay_ms(50);
                        if(USART2_RX_FLAG)
                        {
                            USART2_RX_BUFFER[USART2_RX_CNT]='\0';
                            USART2_RX_FLAG=0;
                            USART2_RX_CNT=0;
                            if(strstr((char*)USART2_RX_BUFFER,"SEND OK"))
                            {
                                return 0;
                            }
                         }            
                    }   
                }
            }
        }
    }
    return 1;
}


审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 物联网
    +关注

    关注

    2868

    文章

    41622

    浏览量

    358351
  • STM32F103
    +关注

    关注

    33

    文章

    474

    浏览量

    62571
  • ESP8266
    +关注

    关注

    50

    文章

    947

    浏览量

    43932
  • 华为云
    +关注

    关注

    3

    文章

    2155

    浏览量

    16807
收藏 人收藏

    评论

    相关推荐

    基于机智平台联网实验平台设计

    ,方便学生进行基础性操作和扩展设计。经过实验测试,联网实验平台运行效果良好。【关键词】机智STM32
    发表于 09-09 14:39

    互联时代引领者—微联网服务平台

    标准化、智能化、界面化的硬件产品及通讯管理和数据管理软件,用户只需完成传感器选型和应用界面设计,即可实现联网应用项目的迅速落地。  在业界首创三端合一、远程控制设备  微
    发表于 05-21 16:52

    机智联网平台)上新了

    方式,如GPRS、NB-IoT、4G全网通;支持RS232、RS485等方式接入;甚至是可通过APP、后台、小程序等方式进行设备管理。机智联网
    发表于 11-05 19:21

    有没有人用开发板连接公有联网平台

    有人连接过阿里华为或者腾讯这类联网
    发表于 11-26 10:51

    STM32F103C8T6连接阿里联网平台

    STM32F103C8T6连接阿里联网平台(1)—阿里lot Studio控制Web开发分
    发表于 08-11 09:33

    微信小程序连接阿里联网平台云端API实现联操控

    微信小程序连接阿里联网平台云端API实现联操控03-25其中包含cryptojs、uuid生成模块,还有用于微信小程序连接阿里
    发表于 08-18 06:28

    STM32F103板子是如何通过MQTT协议连接阿里联网平台的呢

    STM32F103板子是如何通过MQTT协议连接阿里联网平台的呢?有哪些操作流程?
    发表于 10-26 06:27

    阿里联网平台接入NodeMCU的方法

    文章目录NodeMCU(ESP8266) 接入阿里联网平台 踩坑之旅NodeMCU简介快速入门简单使用阿里
    发表于 11-03 07:11

    如何去实现LoRa设备接入腾讯IoT联网平台

    如何去实现LoRa设备接入腾讯IoT联网平台呢?怎样才能现场展示温湿度数据变化呢?
    发表于 11-10 06:02

    基于blinker联网平台使用3D打印制作的一个浇花系统

    flower care sys基于arduino Blinker的联网植物养护系统背景信息:这是一个开源的;基于arduino;基于blinker联网
    发表于 12-08 06:25

    如何实现Air800接收STM32发送的温湿度并上传阿里联网平台

    如何实现Air800接收STM32发送的温湿度并上传阿里联网平台呢?阿里
    发表于 12-17 07:02

    NodeMCU开发板接入阿里联网平台和百度天工联网平台的注意事项

    的也是NodeMCU开发板。下面是分别是接入阿里联网平台和百度天工联网
    发表于 01-24 07:46

    基于STM32机智平台控制设备开关的相关资料推荐

    简单粗暴 一看就懂 拒绝花里胡哨先看视频效果啦 基于STM32的机智平台控制设备开关(联网)
    发表于 02-14 07:42

    【IoT开发】基于机智联网的智能浇花教程

    控制器,esp8266联网模块作为通信设备,底层采用MQTT协议,连接到联网
    发表于 07-13 15:39

    Fibocom 公有华为 技术资料

    Fibocom 公有华为 技术资料内容如下:1、华为连接教程2、华为
    发表于 01-05 12:12