采集AHT10温度传感器信息通过DT-06WiFi模块发送到服务器
admin · 杂项文章 · 2024年09月27日

硬件接线

DT-06 vcc接3.3v gnd接地 RXD接P2^3模拟串口的txd 三根线

AHT10 vin接3.3v gnd接地 SCL接P2^0模拟IIC的SCL口 SDA接 P2^1模拟IIC的SDA口

单片机使用STC90C52单片机

网站

局域网建立一个页面 my_home_status.php 用于显示和接收WiFi模块发送过来的数据

注意:接收过来的数据需要做处理,否则如果char字符组合成某个中文或者特殊字符的话会出现404错误

请求

首先单片机设置每10秒通过IIC协议采集一次AHT10温度传感器的数据

先将采集到的6个字节的数据做特殊处理,这里采用高低4字节加60作为12个字符发送,到达请求页面在依次处理。然后把这12个字符通过GET请求发送过去

串口发送给WiFi模块的内容格式为 "GET my_home_status.php?xxx=yyy"

再在这个页面中将接收到的内容结果处理之后保存到数据库中

完整代码如下:


#include <reg52.h>

sbit RXD2 = P2^2;

sbit TXD2 = P2^3;

sbit TXD1 = P3^1;

//iic

sbit DT06_SDA = P2^0;

sbit DT06_SCL = P2^1;

//GET /my_home_status.php?action=putdata&name=wendu&value=114

unsigned char buffer[56] = "GET /my_home_status.php?action=putdata&name=wendu&value="; //接收缓存

int getbuffernum,putbuffernum,num;

void delay1(void);

void Delay10ms(unsigned int c);

void putdata(unsigned char str);

void putdata2(unsigned char str);

//

unsigned char IIC_send(unsigned char data1);

void IIC_end_ack();

unsigned char IIC_read();

void IIC_stop();

void IIC_start();

void Delay(unsigned int a);

void main(){

unsigned char i;

long data1;

unsigned char datas[6];

unsigned char data2[6];

float temp;//临时变量

  //初始化aht10

IIC_start();

IIC_send(0x70);

IIC_send(0xba);

IIC_stop();

Delay(3000);

  while(1){

  //初始化aht10  不知道为什么测量的温度不会变化

IIC_start();

IIC_send(0x70);

IIC_send(0xba);

IIC_stop();

Delay(3000);

//请求测量

IIC_start();

IIC_send(0x70);   //0x38

IIC_send(0xac);

IIC_send(0x33);

IIC_send(0x00);

IIC_stop();

Delay(5000); //延时82ms

//获取数据

IIC_start();

Delay(1);

IIC_send(0x71);

datas[0] = IIC_read();

IIC_end_ack();

datas[1] = IIC_read();

IIC_end_ack();

datas[2] = IIC_read();

IIC_end_ack();

datas[3] = IIC_read();

IIC_end_ack();

datas[4] = IIC_read();

IIC_end_ack();

datas[5] = IIC_read();

IIC_end_ack();

IIC_stop();

  data1 = (datas[3] & 0xf) * 65536 + datas[4] * 256 + datas[5];

  temp = data1  / 1048576 * 200 - 50;

  data1 = temp * 1;

  data2[0] = datas[3];//(data1 / 10) + 48;

  data2[1] = datas[4];//(data1 % 10) + 48;

for(i=0;i<56;i++){

putdata(buffer[i]);

}

putdata((datas[0]>>4) + 'A');

putdata((datas[0]&0xf) + 'A');

putdata((datas[1]>>4) + 'A');

putdata((datas[1]&0xf) + 'A');

putdata((datas[2]>>4) + 'A');

putdata((datas[2]&0xf) + 'A');

putdata((datas[3]>>4) + 'A');

putdata((datas[3]&0xf) + 'A');

putdata((datas[4]>>4) + 'A');

putdata((datas[4]&0xf) + 'A');

putdata((datas[5]>>4) + 'A');

putdata((datas[5]&0xf) + 'A');

putdata2(datas[0]);

putdata2(datas[1]);

putdata2(datas[2]);

putdata2(datas[3]);

putdata2(datas[4]);

putdata2(datas[5]);

putdata(0x0d); //DT-06 WIFI模块需要发送回车和换行

putdata(0x0a);

Delay10ms(1000);//10秒

  }

}

void putdata(unsigned char str){

TXD2 = 0;

delay1();

TXD2 = str & 0x1;

delay1();

str >>= 1;

TXD2 = str & 0x1;

delay1();

str >>= 1;

TXD2 = str & 0x1;

delay1();

str >>= 1;

TXD2 = str & 0x1;

delay1();

str >>= 1;

TXD2 = str & 0x1;

delay1();

str >>= 1;

TXD2 = str & 0x1;

delay1();

str >>= 1;

TXD2 = str & 0x1;

delay1();

str >>= 1;

TXD2 = str & 0x1;

delay1();

TXD2 = 1;

delay1();

}

void putdata2(unsigned char str){

TXD1 = 0;

delay1();

TXD1 = str & 0x1;

delay1();

str >>= 1;

TXD1 = str & 0x1;

delay1();

str >>= 1;

TXD1 = str & 0x1;

delay1();

str >>= 1;

TXD1 = str & 0x1;

delay1();

str >>= 1;

TXD1 = str & 0x1;

delay1();

str >>= 1;

TXD1 = str & 0x1;

delay1();

str >>= 1;

TXD1 = str & 0x1;

delay1();

str >>= 1;

TXD1 = str & 0x1;

delay1();

TXD1 = 1;

delay1();

}

//104us 9600波特率是通过计算得出来的 num为7 表示 104us 误差 0.05us

void delay1(){

//i=134 2400 (415us)通过 i=67 4800 (208us)通过 i=32 9600 (104us)通过发送

  unsigned char i;

  for(i=0;i<134;i++){} 

}

////误差 0us

void Delay10ms(unsigned int c){

unsigned char a,b;

    for(;c>0;c--){

        for(b=38;b>0;b--){

            for(a=130;a>0;a--){

}

}

}

}

void usart0() interrupt 4{

  if(RI){

  RI = 0;

}


  if(TI){

  }

}

//IIC

//IIC起始信号

void IIC_start(){

  DT06_SCL = 0;

  Delay(1);  //6.33us左右,必须大于4.7us

  DT06_SDA = 1;

  Delay(1);

  DT06_SCL = 1;

  Delay(1);

  DT06_SDA = 0;

  Delay(1);

  DT06_SCL = 0;

}

//IIC停止信号

void IIC_stop(){

  DT06_SCL = 0;

  Delay(1);

  DT06_SDA = 0;

  Delay(1);

  DT06_SCL = 1; //接收时将SCL拉高表示总线空闲


  Delay(1);

  DT06_SDA = 1;

}

//IIC读取数据

unsigned char IIC_read(){

unsigned char i,data1;

DT06_SDA = 1; //这里设置为1应该是为了保险起见,因为一方发送完之后 SDA 和 SCL 都是高电平的

for(i=0; i<8; i++){

  Delay(1);

  DT06_SCL = 1;

  Delay(1);

  data1 <<= 1; //低位先接收

  data1 |= DT06_SDA; //低位或运算获取数据

  Delay(1);

  DT06_SCL = 0; //拉低等待对方设置数据吗?

  Delay(1);

}

return data1;

}

//IIC确认ACK

void IIC_end_ack(){

DT06_SCL = 0;

Delay(1);

DT06_SDA = 0;

Delay(1);

DT06_SCL = 1;

Delay(1);

DT06_SCL = 0;

Delay(1);

}

//IIC发送信号

unsigned char IIC_send(unsigned char data1){

unsigned char i,num;

DT06_SCL = 0;

Delay(1);

for(i=0; i<8; i++){

  //因为SCL现在时低电平,所以可以设置SDA  高位先发

  DT06_SDA = data1 >> 7; //第一位 12345678 >> 7 = 00000001 ←----┒

  data1 = data1 << 1; // 12345678 << 1 = 23456780 ---------┘

  Delay(1);

  DT06_SCL = 1;

  Delay(1);

  DT06_SCL = 0; //拉高再拉低

}

DT06_SDA = 1;

Delay(1);

DT06_SCL = 1;  //发送完一个字节,等待从机响应 ACK

num = 0;

while(DT06_SDA){

num++;

Delay(2);

  if(num > 200){//防止从机不响应死循环 1.几毫秒左右

  DT06_SCL = 0;

return 2;

  }

}

DT06_SCL = 0;  //从机响应

Delay(1);

return 1;

}

//IIC延时函数

void Delay(unsigned int a){ //6.33us

unsigned char b;

for(;a>0;a--)

{

for(b=3;b>0;b--);

}

}


标签1 ( 15 )
标签2 ( 12 )
标签3 ( 4 )
标签4 ( 2 )
标签5 ( 7 )
标签6 ( 5 )
标签 ( 2 )