该系统主要由传感器执行部分、无线通信部分、智能云自助开发平台部分三部分组成。传感器执行部分由主控制单元、显示单元和存储单元组成。传感器检测部分收集空气环境参数信息,实时处理收集到的传感器数据,然后将数据发送到无线通信模块。
无线通信部分是esp8266模块也是所有信息交互的驿站。所有收集到的信息和控制信息都通过无线通信模块和云平台传输。数据通过WIF引模块把数据发送到云平台,云平台的数据可以同步到手机或者其他移动设备。机智云平台上面是用户定义好的数据点可以实时的记录本地的传感器数据并对本地的设备进行控制。总体设计图如图1.
使用智能云自助开发平台,ESP8266模块联网,实现环境湿度检测,环境光强度检测,OLED屏幕显示数据。继电器可自动远程控制和定时。远程检查环境参数,远程修改阀值参数。
机智云AIoT利用微服务架构,自助开发平台将大量使用IoT通过傻瓜式开发工具,技术原理、行业知识、基本模型规则化、软件化、模块化MCU代码自动生成,APP开源框架、IoTSDK、开放API,尽量减少IoT设备开发的技术门槛和开发成本,提高开发、测试、部署效率,已服务超过320000 开发者。
GAgent-设备对接平台可在1天内完成标准串口通信程序,加快智能设备网络开发。GAgent是运行在WiFi/蓝牙/5G/4G/NB-IOT等待通信模块的应用程序,使通信模块主动连接平台服务器,实现与云的通信。将通信模块集成在开发人员产品的控制电路板上,只需与通信模块实现串口通信(代码自动生成),即可直接访问使能平台服务器,无需关键底部的网络电缆传输。
原理图
- #include "led.h"
- #include "systick.h"
- void LED_Init(void)
- {
- RCC_APB2PeriphClockCmd(LED1_CLK, ENABLE);
- RCC_APB2PeriphClockCmd(LED2_CLK, ENABLE);
- RCC_APB2PeriphClockCmd(LED3_CLK, ENABLE);
- GPIO_InitTypeDef LED_InitStruct = {0};
- LED_InitStruct.GPIO_Pin = LED1_PIN;
- LED_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- LED_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(LED1_PORT, &LED_InitStruct);
- LED_InitStruct.GPIO_Pin = LED2_PIN;
- GPIO_Init(LED2_PORT, &LED_InitStruct);
- LED_InitStruct.GPIO_Pin = LED3_PIN;
- GPIO_Init(LED3_PORT, &LED_InitStruct);
- LED1(0);
- LED2(0);
- LED3(0);
- }
- void LED_Task(void)
- {
- static uint32_t Timer = 0;
- static uint8_t Sta = 0;
- if(SoftTimer(Timer,500))
- {
- Timer=GetSoftTimer();
- Sta?(Sta=0):(Sta=1);
- LED1(Sta);
- LED2(Sta);
- LED3(Sta);
- }
- }
- void GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
- {
- uint32_t ODR;
- ODR = GPIOx->ODR;
- GPIOx->BSRR = ((ODR & GPIO_Pin) << 16U) | (~ODR & GPIO_Pin);
- }
- #ifndef __LED_H_
- #define __LED_H_
- #include "STM32f10x.h"
- //PB9 --- LED1 --- 低有效
- //PB8 --- LED2 --- 低有效
- //PA3 --- LED3 --- 低有效
- //基于STM32标准库 芯片是 STM32F103C8T6
- #define LED1_CLK RCC_APB2Periph_GPIOB
- #define LED1_PORT GPIOB
- #define LED1_PIN GPIO_Pin_9
- #define LED2_CLK RCC_APB2Periph_GPIOB
- #define LED2_PORT GPIOB
- #define LED2_PIN GPIO_Pin_8
- #define LED3_CLK RCC_APB2Periph_GPIOA
- #define LED3_PORT GPIOA
- #define LED3_PIN GPIO_Pin_3
- //宏定义的一个开关
- #define LED1(X) X?(GPIO_ResetBits(LED1_PORT,LED1_PIN)):(GPIO_SetBits(LED1_PORT,LED1_PIN))
- #define LED2(X) X?(GPIO_ResetBits(LED2_PORT,LED2_PIN)):(GPIO_SetBits(LED2_PORT,LED2_PIN))
- #define LED3(X) X?(GPIO_ResetBits(LED3_PORT,LED3_PIN)):(GPIO_SetBits(LED3_PORT,LED3_PIN))
- void LED_Init(void);
- void GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
- void LED_Task(void);
- #endif
按键驱动的代码编写
原理图
- #include "key.h"
- #include "systick.h"
- void KEY_Init(void)
- {
- RCC_APB2PeriphClockCmd(KEY0_CLK,ENABLE);
- RCC_APB2PeriphClockCmd(KEY1_CLK,ENABLE);
- RCC_APB2PeriphClockCmd(KEY2_CLK,ENABLE);
- GPIO_InitTypeDef KEY_InitStruct;
- KEY_InitStruct.GPIO_Pin = KEY0_PIN|KEY1_PIN|KEY2_PIN;
- KEY_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
- KEY_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(KEY0_PORT ,&KEY_InitStruct);
- GPIO_Init(KEY1_PORT ,&KEY_InitStruct);
- GPIO_Init(KEY2_PORT ,&KEY_InitStruct);
- }
- static uint8_t Key0Value=0;
- static uint8_t Key1Value=0;
- static uint8_t Key2Value=0;
- void KeyScan(void)
- {
- static uint16_t Key0Timer=0;
- static uint16_t Key1Timer=0;
- static uint16_t Key2Timer=0;
- if(KEY0==0)
- {
- if(Key0Timer<10)
- {
- Key0Timer++;
- if(Key0Timer>=10)
- Key0Value=1;
- }
- }
- else
- {
- Key0Timer = 0;
- }
- if(KEY1==0)
- {
- if(Key1Timer<10)
- {
- Key1Timer++;
- if(Key1Timer>=10)
- Key1Value=1;
- }
- }
- else
- {
- Key1Timer = 0;
- }
- if(KEY2==0)
- {
- if(Key2Timer<10)
- {
- Key2Timer++;
- if(Key2Timer>=10)
- Key2Value=1;
- }
- }
- else
- {
- Key2Timer = 0;
- }
- }
- uint8_t GetKey0(void)
- {
- uint8_t Key=Key0Value;
- Key0Value=0;
- return Key;
- }
- uint8_t GetKey1(void)
- {
- uint8_t Key=Key1Value;
- Key1Value=0;
- return Key;
- }
- uint8_t GetKey2(void)
- {
- uint8_t Key=Key2Value;
- Key2Value=0;
- return Key;
- }
- #ifndef __KEY_H_
- #define __KEY_H_
- #include "stm32f10x.h"
- #define KEY0_CLK RCC_APB2Periph_GPIOA
- #define KEY0_PORT GPIOA
- #define KEY0_PIN GPIO_Pin_0
- #define KEY1_CLK RCC_APB2Periph_GPIOA
- #define KEY1_PORT GPIOA
- #define KEY1_PIN GPIO_Pin_1
- #define KEY2_CLK RCC_APB2Periph_GPIOA
- #define KEY2_PORT GPIOA
- #define KEY2_PIN GPIO_Pin_2
- #define KEY0 GPIO_ReadInputDataBit(KEY0_PORT,KEY0_PIN)
- #define KEY1 GPIO_ReadInputDataBit(KEY1_PORT,KEY1_PIN)
- #define KEY2 GPIO_ReadInputDataBit(KEY2_PORT,KEY2_PIN)
- void KEY_Init(void);
- void KeyScan(void);
- uint8_t GetKey0(void);
- uint8_t GetKey1(void);
- uint8_t GetKey2(void);
- #endif
- <b>
- </b>
- #include "main.h"
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- USART1_Init(9600);
- //printf("打印串口初始化 OK !\r\n");
- SysTick_Init();
- //printf("系统嘀嗒初始化 OK !\r\n");
- LED_Init();
- //printf("状态指示初始化 OK !\r\n");
- KEY_Init();
- //printf("按键配置初始化 OK !\r\n");
- while(1)
- {
- LED_Task();
- if(GetKey0())
- {
- GPIO_TogglePin(LED1_PORT,LED1_PIN);
- //JiaoHua(1-currentDataPoint.valueRelay_1);
- }
- if(GetKey1())
- {
- GPIO_TogglePin(LED2_PORT,LED2_PIN);
- //gizwitsSetMode(WIFI_AIRLINK_MODE);
- //按键进入配网模式
- }
- if(GetKey2())
- {
- GPIO_TogglePin(LED3_PORT,LED3_PIN);
- }
- }
- }
串口1 驱动代码
- #include "usart1.h"
- #include <stdio.h>
- void USART1_NVIC_Config(void)
- {
- //接收中断使能
- NVIC_InitTypeDef NVIC_InitStruct;
- /*NVIC控制器配置*/
- NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;//具体中断源名字
- NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//NVIC响应通道使能
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级值
- NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;//响应优先级别值
- NVIC_Init(&NVIC_InitStruct);
- }
- /*打印调试串口*/
- void USART1_Init(uint32_t BaudRate)
- {
- USART_DeInit(USART1);
- //1.打开GPIO的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
- //2.配置相关结构体
- GPIO_InitTypeDef GPIO_InitStruct;
- //串口发送引脚的配置 PA9->复用推挽输出
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIO_InitStruct);
- //串口接收引脚的配置 PA10->浮空输入模式
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIO_InitStruct);
- //1.打开串口的时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//注意APB2
- USART_InitTypeDef USART1_InitStruct;
- //串口的参数配置 波特率可以更改
- //无硬件流控制 收发模式
- //1起始位 8数据位 无奇偶校验 1位停止位
- USART1_InitStruct.USART_BaudRate = BaudRate;
- USART1_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART1_InitStruct.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
- USART1_InitStruct.USART_Parity = USART_Parity_No;
- USART1_InitStruct.USART_StopBits = USART_StopBits_1;
- USART1_InitStruct.USART_WordLength = USART_WordLength_8b;
- //串口1初始化
- USART_Init(USART1,&USART1_InitStruct);
- /*******************/
- //开串口中断
- USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//接收中断
- //USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//空闲中断
- //中断优先级配置
- USART1_NVIC_Config();
- USART_Cmd(USART1,ENABLE);
- }