用ch579设计一个物联网温度计的详细实验过程及具体代码
时间: 2024-03-22 18:42:35 浏览: 111
以下是用CH579设计一个物联网温度计的详细实验过程及具体代码:
1. 硬件设计
(1)传感器选择:选择DS18B20数字温度传感器,该传感器具有精度高、使用方便等特点。
(2)接口电路设计:将传感器与CH579微控制器相连,采用单总线通信方式,将传感器的数据引脚连接到CH579的GPIO引脚上。
(3)通信模块的选型:选择SIM800L GSM模块,通过GSM网络将温度数据上传到云平台上。
(4)电源设计:采用3.7V锂电池供电。
2. 软件设计
(1)嵌入式软件设计:
```
#include "ch579.h"
#include "ch579_gpio.h"
#include "ch579_uart.h"
#include "ch579_spi.h"
#include "ch579_systick.h"
#define DS18B20_PIN 1
void delay_us(uint32_t us) {
uint32_t t = CH579ReadTick();
while( (CH579ReadTick()-t) < us );
}
uint8_t DS18B20_Init() {
uint8_t Presence = 0;
CH579_GPIO_SetOutput(DS18B20_PIN);
CH579_GPIO_Write(DS18B20_PIN, 1);
delay_us(2);
CH579_GPIO_Write(DS18B20_PIN, 0);
delay_us(480);
CH579_GPIO_Write(DS18B20_PIN, 1);
delay_us(60);
Presence = CH579_GPIO_Read(DS18B20_PIN);
delay_us(420);
return Presence;
}
void DS18B20_WriteByte(uint8_t dat) {
uint8_t i = 0;
for(i=0;i<8;i++) {
CH579_GPIO_SetOutput(DS18B20_PIN);
CH579_GPIO_Write(DS18B20_PIN, 0);
if( dat & (1<<i) ) {
CH579_GPIO_Write(DS18B20_PIN, 1);
}
delay_us(80);
CH579_GPIO_Write(DS18B20_PIN, 1);
}
}
uint8_t DS18B20_ReadByte() {
uint8_t i = 0;
uint8_t dat = 0;
for(i=0;i<8;i++) {
CH579_GPIO_SetOutput(DS18B20_PIN);
CH579_GPIO_Write(DS18B20_PIN, 0);
delay_us(2);
CH579_GPIO_Write(DS18B20_PIN, 1);
delay_us(8);
if( CH579_GPIO_Read(DS18B20_PIN) ) {
dat |= (1<<i);
}
delay_us(50);
}
return dat;
}
float DS18B20_GetTemp() {
uint8_t Temp_H, Temp_L;
float Temp = 0;
DS18B20_Init();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0x44);
delay_us(750);
DS18B20_Init();
DS18B20_WriteByte(0xCC);
DS18B20_WriteByte(0xBE);
Temp_L = DS18B20_ReadByte();
Temp_H = DS18B20_ReadByte();
Temp = (float)((Temp_H<<8)|Temp_L)/16.0;
return Temp;
}
int main() {
uint8_t buf[32] = {0};
float Temp = 0;
CH579Init();
while(1) {
Temp = DS18B20_GetTemp();
sprintf((char*)buf, "%.2f", Temp);
CH579_UART_SendData(CH579_UART1, buf, strlen((char*)buf));
CH579DelayMs(1000);
}
return 0;
}
```
(2)网络通信协议设计:编写GSM网络通信程序,通过AT指令控制SIM800L模块连接网络,并将温度数据发送到云平台上。
```
#include "ch579.h"
#include "ch579_uart.h"
#include "ch579_systick.h"
#define SIM800L_TX 6
#define SIM800L_RX 7
void delay_ms(uint32_t ms) {
CH579DelayMs(ms);
}
void SIM800L_SendCmd(char *cmd) {
CH579_UART_SendString(CH579_UART2, cmd);
delay_ms(100);
}
void SIM800L_SendData(char *data) {
char buf[128] = {0};
sprintf(buf, "AT+CIPSEND=%d\r\n", strlen(data));
CH579_UART_SendString(CH579_UART2, buf);
delay_ms(100);
CH579_UART_SendString(CH579_UART2, data);
}
int main() {
uint8_t buf[32] = {0};
float Temp = 0;
CH579Init();
while(1) {
Temp = DS18B20_GetTemp();
sprintf((char*)buf, "%.2f", Temp);
CH579_UART_SendData(CH579_UART1, buf, strlen((char*)buf));
SIM800L_SendCmd("AT\r\n");
SIM800L_SendCmd("AT+CPIN?\r\n");
SIM800L_SendCmd("AT+CREG?\r\n");
SIM800L_SendCmd("AT+CIPSHUT\r\n");
SIM800L_SendCmd("AT+CIPMUX=0\r\n");
SIM800L_SendCmd("AT+CSTT=\"CMNET\"\r\n");
SIM800L_SendCmd("AT+CIICR\r\n");
SIM800L_SendCmd("AT+CIFSR\r\n");
SIM800L_SendCmd("AT+CIPSTART=\"TCP\",\"IP地址\",\"端口号\"\r\n");
SIM800L_SendData((char*)buf);
CH579DelayMs(1000);
}
return 0;
}
```
3. 实验步骤
(1)将DS18B20传感器与CH579微控制器相连,将SIM800L模块与CH579相连,并将3.7V锂电池与CH579供电。
(2)编译并下载以上两个程序到CH579微控制器中。
(3)在云平台上注册并创建一个HTTP接口,用于接收温度数据。
(4)将云平台的IP地址和端口号填写到SIM800L程序中相应的位置。
4. 实验结果
通过上述实验,可以实现对环境温度的实时监测,并将数据通过GSM网络上传到云平台上。同时,还可以通过串口调试助手查看温度数据。
阅读全文