当前位置:   article > 正文

stm32知识记录

stm32知识记录

单片机发送AT指令给ESP8266

以下是一个简单的示例,演示了如何使用AT指令从单片机发送数据给ESP8266模块,并通过Wi-Fi发送到远程服务器:

假设您的单片机使用UART与ESP8266通信,下面是一个示例代码:

#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); // 每隔一段时间进行一次数据发送
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

在这个示例中,单片机通过软串口(SoftwareSerial)与ESP8266模块通信。它首先从传感器中读取数据,然后将数据转换为字符串并发送给ESP8266模块。单片机通过发送AT指令来控制ESP8266模块的行为,包括建立TCP连接、发送数据以及关闭连接。

请注意,您需要根据您的实际情况修改代码中的IP地址和端口号,并确保ESP8266模块已正确配置以连接到您的Wi-Fi网络。此外,由于示例代码中使用了延时函数,实际应用中可能需要根据需要进行更复杂的时间控制和错误处理。

接收手机app数据的结构体

typedef struct app
{
    
    u8 wifiSta;  // WiFi连接状态
    u8 waterSta; // // 1.水泵开启或关闭
    float temp;			//温度
    u8 turbidity;       // 浑浊度
    float ph;              // PH值
    u8 tds; // tds

}appData;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

C语言的枚举类

枚举类的隐式的定义

enum DAY
{
  MON,          //默认0
  TUE,			//默认1
  WED,			//默认2
  THU,			//默认3
  FRI,  		//默认4
  SAT,			//默认5
  SUN			//默认6
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

1.在c语言中,枚举类中的是枚举成员,默认枚举成员默认是整数类型。
2.隐式定义时,第一个枚举成员的默认值为0,后续成员值依次递加1。
3.可以自定义枚举类型的值,从而自定义某个范围内的整数。
4.枚举型是预处理指令#define的替代。

枚举类的显式的定义

enum DAY
{
  MON = 1,          //显式指定值为1
  TUE = 5,			//显式指定值为5
  WED = 19,			//
  THU = 27,			//
  FRI = 121,  		//
  SAT = 123,		//
  SUN = 345			//
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

枚举类的应用

mygpio.h文件

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;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

设置水泵开启关闭代码分析

// 从app获取水泵数据0或1,然后设置水泵状态
			if (g_appdata.waterSta == 1)
			{
				ggpio.gpio_set(PUMP, 1);
			}
			else
			{
				ggpio.gpio_set(PUMP, 0);
			}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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文件如下

#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);
    }
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

DS18B20的端口

dsl8b20的端口PA0

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/462404
推荐阅读
相关标签
  

闽ICP备14008679号