STM32+ESP01连接到机智云

news2024/11/19 15:33:22

        机智云,全球领先的智能硬件软件自助开发及物联网(iot)云服务平台。机智云平台为开发者提供了自助式智能硬件开发工具与开放的云端服务。通过傻瓜化的自助工具、完善的SDK与API服务能力最大限度降低了物联网硬件开发的技术门槛,降低开发者的研发成本,提升开发者的产品投产速度,帮助开发者进行硬件智能化升级,更好的连接、服务最终消费者。使用机智云作为云平台可以轻松实现物联网功能。首先,我们需要注册并进入机智云官网。

一、进入开发者中心

        如图,这是我的机智云。

创建一个自定义产品,如下

添加好数据节点,如下,这是一个开关一个led灯:

复制密码,以备用

二、生成代码

1、选择MCU开发其他平台,输入密钥,生成代码包。

2、生成成功,下载到本地

3、移植代码

        将 Gizwits 和 Utils 一直到我们的工程中,如下图:

        

将它们添加进工程

修改 gizwits_product.c ,如下:

/**
************************************************************
* @file         gizwits_product.c
* @brief        Gizwits control protocol processing, and platform-related hardware initialization 
* @author       Gizwits
* @date         2017-07-19
* @version      V03030000
* @copyright    Gizwits
*
* @note         Gizwits is only for smart hardware
*               Gizwits Smart Cloud for Smart Products
*               Links | Value Added | Open | Neutral | Safety | Own | Free | Ecology
*               www.gizwits.com
*
***********************************************************/
#include <stdio.h>
#include <string.h>
#include "stm32f10x.h"                  // Device header
#include "gizwits_product.h"
#include "Serial3.h"
#include "LED.h"

static uint32_t timerMsCount;

/** Current datapoint */
dataPoint_t currentDataPoint;

/**@} */
/**@name Gizwits User Interface
* @{
*/

/**
* @brief Event handling interface

* Description:

* 1. Users can customize the changes in WiFi module status

* 2. Users can add data points in the function of event processing logic, such as calling the relevant hardware peripherals operating interface

* @param [in] info: event queue
* @param [in] data: protocol data
* @param [in] len: protocol data length
* @return NULL
* @ref gizwits_protocol.h
*/
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
{
    uint8_t i = 0;
    dataPoint_t *dataPointPtr = (dataPoint_t *)gizdata;
    moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;
    protocolTime_t *ptime = (protocolTime_t *)gizdata;
    
#if MODULE_TYPE
    gprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
#else
    moduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
#endif

    if((NULL == info) || (NULL == gizdata))
    {
        return -1;
    }

    for(i=0; i<info->num; i++)
    {
        switch(info->event[i])
        {
        case EVENT_btn:
            currentDataPoint.valuebtn = dataPointPtr->valuebtn;
            GIZWITS_LOG("Evt: EVENT_btn %d \n", currentDataPoint.valuebtn);
            if(0x01 == currentDataPoint.valuebtn)
            {
            //user handle
				LED1_ON();
            }
            else
            {
            //user handle 
				LED1_OFF();				
            }
            break;




        case WIFI_SOFTAP:
            break;
        case WIFI_AIRLINK:
            break;
        case WIFI_STATION:
            break;
        case WIFI_CON_ROUTER:
 
            break;
        case WIFI_DISCON_ROUTER:
 
            break;
        case WIFI_CON_M2M:
 
            break;
        case WIFI_DISCON_M2M:
            break;
        case WIFI_RSSI:
            GIZWITS_LOG("RSSI %d\n", wifiData->rssi);
            break;
        case TRANSPARENT_DATA:
            GIZWITS_LOG("TRANSPARENT_DATA \n");
            //user handle , Fetch data from [data] , size is [len]
            break;
        case WIFI_NTP:
            GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);
            break;
        case MODULE_INFO:
            GIZWITS_LOG("MODULE INFO ...\n");
#if MODULE_TYPE
            GIZWITS_LOG("GPRS MODULE ...\n");
            //Format By gprsInfo_t
            GIZWITS_LOG("moduleType : [%d] \n",gprsInfoData->Type);
#else
            GIZWITS_LOG("WIF MODULE ...\n");
            //Format By moduleInfo_t
            GIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);
#endif
        break;
        default:
            break;
        }
    }

    return 0;
}

/**
* Data point initialization function

* In the function to complete the initial user-related data
* @param none
* @return none
* @note The developer can add a data point state initialization value within this function
*/
void userInit(void)
{
    memset((uint8_t*)&currentDataPoint, 0, sizeof(dataPoint_t));  
    currentDataPoint.valuebtn = 0;
    currentDataPoint.valuenum = 0;
}


/**
* @brief  gizTimerMs

* millisecond timer maintenance function ,Millisecond increment , Overflow to zero

* @param none
* @return none
*/
void gizTimerMs(void)
{
    timerMsCount++;
}

/**
* @brief gizGetTimerCount

* Read system time, millisecond timer

* @param none
* @return System time millisecond
*/
uint32_t gizGetTimerCount(void)
{
    return timerMsCount;
}

/**
* @brief mcuRestart

* MCU Reset function

* @param none
* @return none
*/
void mcuRestart(void)
{
	__set_FAULTMASK(1);
	NVIC_SystemReset();//修改
}


/**
* @brief uartWrite

* Serial write operation, send data to the WiFi module

* @param buf      : Data address
* @param len       : Data length
*
* @return : Not 0,Serial send success;
*           -1,Input Param Illegal
*/


int32_t uartWrite(uint8_t *buf, uint32_t len)
{
    uint32_t i = 0;
    
    if(NULL == buf)
    {
        return -1;
    }
    
    #ifdef PROTOCOL_DEBUG
    GIZWITS_LOG("MCU2WiFi[%4d:%4d]: ", gizGetTimerCount(), len);
    for(i=0; i<len; i++)
    {
        GIZWITS_LOG("%02x ", buf[i]);
    }
    GIZWITS_LOG("\n");
    #endif

    for(i=0; i<len; i++)
    {
        //USART_SendData(UART, buf[i]);//STM32 test demo
        //Serial port to achieve the function, the buf[i] sent to the module
        USART_SendData(USART3, buf[i]);
        while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
        if(i >=2 && buf[i] == 0xFF)
        {
          //Serial port to achieve the function, the 0x55 sent to the module
          //USART_SendData(UART, 0x55);//STM32 test demo
             USART_SendData(USART3, 0x55);
            while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
        }
    }

    return len;
}




        准备一个定时器程序,定时大约1ms,在定时器中断中调用 gizTimerMs(); 为机智云提供时钟。

void TIM2_IRQHandler()
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
	{
		gizTimerMs(); //为机智云提供时钟
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	}
}

        准备一个UART连接ESP01,并在改UART的中断函数中调用 gizPutData(&value, 1); 函数,用于接受ESP01串口中断发来的数据。

void USART3_IRQHandler(void)                                          
{
	uint8_t value = 0;
	if(USART_GetITStatus(Serial3_UARTx, USART_IT_RXNE) != RESET)
	{
		USART_ClearITPendingBit(Serial3_UARTx, USART_IT_RXNE);	
		value = USART_ReceiveData(USART3);	//读取接收到的数据
		gizPutData(&value, 1);	
	}
}

               同时配置好按键,在主函数中按键获取函数,并通过按键值选择调用联网和重新配置,如下图:

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Timer.h"
#include "gizwits_product.h" 
#include "Serial.h" 
#include "Serial3.h" 
#include "LED.h" 
#include "Key.h" 
#include "Delay.h" 

extern dataPoint_t currentDataPoint;

//协议初始化
void Gizwits_Init(void)
{
	Timer_Init();//1ms
	Serial_Init();
	Serial3_Init();//gizPutData((uint8_t *)&aRxBuffer,1);
	userInit();//用户信息初始化,目前只是把结构体信息复位
	gizwitsInit();//机智云的初始化
	printf("gizwitsInit智能云初始化\r\n");
}

//数据采集
void userHandle(void)
{
	currentDataPoint.valuenum = 50;
}

int main()
{
	uint8_t keyNum=0;
	LED_Init();
	Key_Init();
	Gizwits_Init();
	while(1)
	{
		keyNum = Key_GetNum();
		if(keyNum==1)//按键1按下
		{
			printf("WIFI进入AirLink连接模式\r\n");
			gizwitsSetMode(WIFI_AIRLINK_MODE);//Air-link模式接入
		}			
		if(keyNum==2)//按键2按下99
		{  
			printf("WIFI复位,请重新配置连接\r\n");
			gizwitsSetMode(WIFI_RESET_MODE);//WIFI复位
		}
		userHandle();//数据上行
        gizwitsHandle((dataPoint_t *)&currentDataPoint);
	}	
}	

        至此,STM32代码移植已经完毕

三、ESP01烧入机智云固件

1、进入机智云固件下载地址,下载如下固件,地址如下

Gizwits

2、本次使用STM32F103C8T6,于是选择8M带combine的

3、打开 flash_download_tool,进行固件下载,如图:

四、APP配置机智云

1、按下按键1,进入配网模式,注意网络wifi网关不能是5GHZ的频段,建议2.4GHz,如图:

2、 点击机智云app左上角的加号,选择Airlink,输入我们的wifi名和密码,点击下一步:

        选择乐鑫,然后下一步。

最后等待连接成功即可:

3、连接成功,APP出现一个叫做测试的设备,如下:

五、测试功能

1、显示测试数50,本次采用固定数字测试数字上传情况,代码如下

//数据采集
void userHandle(void)
{
	currentDataPoint.valuenum = 50;
}

2、按键开关灯

按下开,此时led会亮起,如下:

再次按下,led会关闭,如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2136055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

添加选择登录ssh终端

吼吼,这次成了一个小的瑞士军刀了 … …

2.Jmeter安装配置,核心目录详情,组件和作用域

一、Jmeter安装配置以及核心目录详情 Jmeter基于java语言来开发&#xff0c;java需要jdk环境。 1.安装jdk并且配置jdk的环境变量。 2.jmeter只需要解压就可以使用了。 3.在D:\apache-jmeter-5.5\bin目录下双击jmeter.bat文件就可以启动使用了 backups&#xff1a;自动备份的目录…

OpenHarmony(鸿蒙南向开发)——轻量系统STM32F407芯片移植案例

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量和小型系统三方库移植指南…

JAVA毕业设计170—基于Java+Springboot+vue3+小程序的房屋租赁小程序系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3小程序的房屋租赁小程序系统(源代码数据库)170 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、房东、管理员三种角色 1、用户&am…

华为云分布式缓存服务DCS 8月新特性发布

分布式缓存服务&#xff08;Distributed Cache Service&#xff0c;简称DCS&#xff09;是华为云提供的一款兼容Redis的高速内存数据处理引擎&#xff0c;为您提供即开即用、安全可靠、弹性扩容、便捷管理的在线分布式缓存能力&#xff0c;满足用户高并发及数据快速访问的业务诉…

[PICO VR眼镜]眼动追踪串流Unity开发与使用方法,眼动追踪打包报错问题解决(Eye Tracking)

前言 最近在做一个工作需要用到PICO4 Enterprise VR头盔里的眼动追踪功能&#xff0c;但是遇到了如下问题&#xff1a; 在Unity里面没法串流调试眼动追踪功能&#xff0c;根本获取不到Device&#xff0c;只能将整个场景build成APK&#xff0c;安装到头盔里&#xff0c;才能在…

明星代言推广的6种优势,打造品牌巅峰!

在当今的商业社会中&#xff0c;品牌推广成为了企业发展不可或缺的一环。对于许多企业来说&#xff0c;明星代言已经成为了一种常见的推广策略。本文将介绍明星代言推广的六种优势&#xff0c;帮助企业了解并充分利用这一策略&#xff0c;从而打造品牌的巅峰&#xff01; 1. 塑…

java中SPI(服务提供者的接口)

java中SPI&#xff08;服务提供者的接口&#xff09; 一&#xff1a;什么是SPI二&#xff1a;java SPI示例1.SPI服务提供方2.SPI服务应用方开发者 三&#xff1a;JavaSPI 机制的核心-ServiceLoader 一&#xff1a;什么是SPI SPI&#xff1a;“服务提供者的接口”&#xff0c;是…

USART—串口数据包

1.HEX数据包定义 数据包的作用是把一个个单独的数据给打包起来&#xff0c;方便我们进行多字节的数据通信&#xff0c;在实际应用中&#xff0c;我们可能需要把多个字节打包为一个整体进行发送&#xff0c;比如说&#xff0c;我们有个陀螺仪传感器&#xff0c;需要用串口发送数…

git 你要如何打开这个文件

终端输入git命令都会弹出这个框 解决方案&#xff1a; 参考文章&#xff1a;在vscode终端上运行 npm 会询问 “你要如何打开这个文件“_安装 npm脚手架提示你要如何打开-CSDN博客 get-command git后删除对应文件 请注意不要删错了&#xff0c;正常get-command git后对应的是…

微型导轨加工环境需避免的隐患!

微型导轨是一种小巧精密的线性定位解决方案&#xff0c;其高速度、低噪音的特点使得它在现代制造业中扮演着越来越重要的角色。而微型导轨对于加工环境的要求主要体现在以下几个方面&#xff1a; 1、温度控制&#xff1a;加工环境需要保持在适宜的温度范围内&#xff0c;过高或…

【西电电装实习】5. 无人机模块及作用、上位机的操作

文章目录 前言一、硬件结构电源、电源电压测试电路晶振外围陀螺仪信号放大电路及天线空心杯&#xff08;电极&#xff09;驱动电路 软件设置整机装配PID 参数设置公式 参考文献 前言 西电电装实习&#xff0c;无人机原理图、上位机的调节方法 一、硬件结构 电源、电源电压测…

RabbitMQ 基础入门

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 前言 1. 重要概念 1.1 Publisher 1.2 Message 1.3 Exchange 1.4 BindingKey 1.5 Routingkey 1.6 Queue 1.7 Consumer 1.8 Connection 1.9 Channel 1.10 Virtual Host 1.11Broker 2. RabbitMQ…

个人学习笔记7-5:动手学深度学习pytorch版-李沐

#人工智能# #深度学习# #语义分割# #计算机视觉# #神经网络# 计算机视觉 13.10 转置卷积 例如&#xff0c;卷积层和汇聚层&#xff0c;通常会减少下采样输入图像的空间维度&#xff08;高和宽&#xff09;。然而如果输入和输出图像的空间维度相同&#xff0c;在以像素级分类…

手机玩机常识____展讯芯片刷机平台ResearchDownload的一些基本常识与问题解决

展讯ResearchDownload工具 展讯芯片的刷机工具--ResearchDownload下载工具"是一款专为用户设计的高效、便捷的下载管理软件&#xff0c;它能够帮助用户快速、稳定地从互联网上获取各种文件。这款工具以其强大的功能和良好的用户体验&#xff0c;在众多展讯芯片下载工具中脱…

计算机网络30——Linux-gdb调试命令makefile

1、开始调试 编译时带-g为调试&#xff0c;带调试信息编译后的可执行文件更大 2、进入调试 使用gdb 可执行文件名——进入调试 失败版&#xff1a; 成功版&#xff1a; 3、l命令 l什么都不加——列出10行代码 l 行号——行号的行在中间&#xff0c;向上向下展示10行 4、st…

ppt文件怎么压缩变小一些?8种压缩PPT文件的方法推荐

ppt文件怎么压缩变小一些&#xff1f;在现代工作环境中&#xff0c;PPT文件常常是我们展示信息和分享想法的主要工具。然而&#xff0c;当这些文件变得庞大时&#xff0c;它们不仅会占用大量的存储空间&#xff0c;还可能导致处理速度变慢&#xff0c;影响整体工作效率。这种情…

GIS在线监测SF6密度微水定量检漏仪传感器专用波纹管免焊接格兰头

SF6密度微水在线监测装置配套M12母头5孔格兰头穿波纹管连接器&#xff0c;该传感器能够监测SF6气体的露点&#xff0c;从而实现对SF6气体在线监测。 原理 SF6露点在线监测传感器是一种可以监测SF6气体露点的传感器它的工作原理是通过吸收SF6气体中的水分子来测量SF6气体的露点。…

Jetpack PDF库:解锁Android应用中的PDF功能

Jetpack PDF库&#xff1a;解锁Android应用中的PDF功能 在 Android 开发中&#xff0c;加载 PDF 文件是一个比较常见的需求&#xff0c;但就是这么一个比较常见的功能&#xff0c;原生并没有提供一个比较好的方案&#xff0c;而隔壁 IOS 中实现却是很方便的。。。 下面是当前…

Stream流的思想和获取Stream流

首先介绍流的概念&#xff1a; 流可以理解为一条流水线&#xff0c;在这条流水线中有许多操作&#xff0c;比如筛选所需要的数据&#xff0c;输出打印等&#xff0c; 经过这条流水线&#xff0c;可以获取到自己所需要的数据&#xff1a; -->所以&#xff1a; Stream流的作…