stm32知识记录

文章目录

单片机发送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;
}
相关推荐
-Springer-23 分钟前
STM32 学习 —— 个人学习笔记5(EXTI 外部中断 & 对射式红外传感器及旋转编码器计数)
笔记·stm32·学习
LS_learner41 分钟前
树莓派(ARM64 架构)Ubuntu 24.04 (Noble) 系统 `apt update` 报错解决方案
嵌入式硬件
来自晴朗的明天1 小时前
16、电压跟随器(缓冲器)电路
单片机·嵌入式硬件·硬件工程
钰珠AIOT2 小时前
在同一块电路板上同时存在 0805 0603 不同的封装有什么利弊?
嵌入式硬件
代码游侠2 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
代码游侠13 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
xuxg200515 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT16 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen17 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制