文章目录
单片机发送AT指令给ESP8266
以下是一个简单的示例,演示了如何使用AT指令从单片机发送数据给ESP8266模块,并通过Wi-Fi发送到远程服务器:
假设您的单片机使用UART与ESP8266通信,下面是一个示例代码:
c
#include <SoftwareSerial.h>
SoftwareSerial espSerial(2, 3); // RX, TX
void setup() {
Serial.begin(9600); // 串口监视器
espSerial.begin(115200); // ESP8266串口通信
}
void loop() {
// 从传感器中读取数据
int sensorData = analogRead(A0);
// 将数据转换为字符串
String dataToSend = String(sensorData);
// 发送AT指令给ESP8266模块
espSerial.println("AT+CIPSTART=\"TCP\",\"your_server_ip\",your_server_port");
delay(1000);
espSerial.println("AT+CIPSEND=" + String(dataToSend.length() + 2));
delay(500);
espSerial.println(dataToSend);
delay(5000); // 延时等待数据发送完成
// 关闭TCP连接
espSerial.println("AT+CIPCLOSE");
delay(1000);
delay(5000); // 每隔一段时间进行一次数据发送
}
在这个示例中,单片机通过软串口(SoftwareSerial)与ESP8266模块通信。它首先从传感器中读取数据,然后将数据转换为字符串并发送给ESP8266模块。单片机通过发送AT指令来控制ESP8266模块的行为,包括建立TCP连接、发送数据以及关闭连接。
请注意,您需要根据您的实际情况修改代码中的IP地址和端口号,并确保ESP8266模块已正确配置以连接到您的Wi-Fi网络。此外,由于示例代码中使用了延时函数,实际应用中可能需要根据需要进行更复杂的时间控制和错误处理。
接收手机app数据的结构体
c
typedef struct app
{
u8 wifiSta; // WiFi连接状态
u8 waterSta; // // 1.水泵开启或关闭
float temp; //温度
u8 turbidity; // 浑浊度
float ph; // PH值
u8 tds; // tds
}appData;
C语言的枚举类
枚举类的隐式的定义
c
enum DAY
{
MON, //默认0
TUE, //默认1
WED, //默认2
THU, //默认3
FRI, //默认4
SAT, //默认5
SUN //默认6
};
1.在c语言中,枚举类中的是枚举成员,默认枚举成员默认是整数类型。
2.隐式定义时,第一个枚举成员的默认值为0,后续成员值依次递加1。
3.可以自定义枚举类型的值,从而自定义某个范围内的整数。
4.枚举型是预处理指令#define的替代。
枚举类的显式的定义
c
enum DAY
{
MON = 1, //显式指定值为1
TUE = 5, //显式指定值为5
WED = 19, //
THU = 27, //
FRI = 121, //
SAT = 123, //
SUN = 345 //
};
枚举类的应用
mygpio.h文件
c
typedef enum GPIONUM
{
BEEP, //蜂鸣器默认为0
PUMP, //水泵默认为1
GPIOMAX, //GPIOMAX默认为2
} GPIONUM;
typedef struct GPIOCOFIG
{
GPIO_TypeDef *GPIOx;
uint16_t GPIO_Pin;
uint32_t RCC_APB2Periph;
GPIOMode_TypeDef ioMode;
} GPIOCOFIG;
设置水泵开启关闭代码分析
c
// 从app获取水泵数据0或1,然后设置水泵状态
if (g_appdata.waterSta == 1)
{
ggpio.gpio_set(PUMP, 1);
}
else
{
ggpio.gpio_set(PUMP, 0);
}
ggpio.gpio_set(PUMP, 1);
这里对水泵进行了设置 ,实际是ggpio.gpio_set(1, 1);
->GPIO_SetBits(gpioconf[1].GPIOx, gpioconf[1].GPIO_Pin);
->GPIO_SetBits(GPIOB, GPIO_Pin_10);
可以看出水泵的引脚是B10,那蜂鸣器的引脚是A4
mygpio.c文件如下
c
#include "stm32f10x.h"
#include "mygpio.h"
#include "sys.h"
#include "delay.h"
#include "stdio.h"
#include "string.h"
#include "hmi_common.h"
#include "gizwits_protocol.h"
static void init(void);
static void gpio_scan(void);
static void gpio_set(GPIONUM gpiox, uint8_t levelid);
//定义了一个GPIOCOFIG 数组,数组名为gpioconf,GPIOMAX为2
static GPIOCOFIG gpioconf[GPIOMAX] = {
// 管脚组 管脚号 管脚组时钟 IOMODE
{GPIOA, GPIO_Pin_4, RCC_APB2Periph_GPIOA, GPIO_Mode_Out_PP},
{GPIOB, GPIO_Pin_10, RCC_APB2Periph_GPIOB, GPIO_Mode_Out_PP},
};
GPIO ggpio = {
.gpio_init = init,
.gpio_scan = gpio_scan,
.gpio_set = gpio_set,
};
uint8_t g_gpio_statu[GPIOMAX];
// 按键初始化函数
static void init(void) // IO初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
uint8_t i = 0;
for (i = 0; i < GPIOMAX; i++)
{
memset(&GPIO_InitStructure, 0, sizeof(GPIO_InitTypeDef));
RCC_APB2PeriphClockCmd(gpioconf[i].RCC_APB2Periph, ENABLE);
GPIO_InitStructure.GPIO_Pin = gpioconf[i].GPIO_Pin;
GPIO_InitStructure.GPIO_Mode = gpioconf[i].ioMode; // 浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(gpioconf[i].GPIOx, &GPIO_InitStructure); // 根据设定参数初始化
}
ggpio.gpio_set(BEEP, 1);
ggpio.gpio_set(PUMP, 0);
}
static void gpio_scan(void)
{
int i = 0;
for (i = 0; i < GPIOMAX; i++)
{
g_gpio_statu[i] = GPIO_ReadInputDataBit(gpioconf[i].GPIOx, gpioconf[i].GPIO_Pin);
}
}
static void gpio_set(GPIONUM gpiox, uint8_t level)
{
if (level == 1)
{
GPIO_SetBits(gpioconf[gpiox].GPIOx, gpioconf[gpiox].GPIO_Pin);
}
else
{
GPIO_ResetBits(gpioconf[gpiox].GPIOx, gpioconf[gpiox].GPIO_Pin);
}
}
DS18B20的端口
dsl8b20的端口PA0
c
u8 DS18B20_Check(void)
{
u8 retry=0;
DS18B20_IO_IN();//SET PA0 INPUT
while (DS18B20_DQ_IN&&retry<200)
{
retry++;
delay_us(1);
};
if(retry>=200)return 1;
else retry=0;
while (!DS18B20_DQ_IN&&retry<240)
{
retry++;
delay_us(1);
};
if(retry>=240)return 1;
return 0;
}