stm32知识记录

devtools/2024/9/25 17:03:57/

文章目录

  • 单片机发送AT指令给ESP8266
  • 接收手机app数据的结构体
  • C语言的枚举类
    • 枚举类的应用
  • 设置水泵开启关闭代码分析
  • DS18B20的端口

单片机发送AT指令给ESP8266

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

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

#include <SoftwareSerial.h>SoftwareSerial espSerial(2, 3); // RX, TXvoid 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数据的结构体

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

C语言的枚举类

枚举类的隐式的定义

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

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

枚举类的显式的定义

enum DAY
{MON = 1,          //显式指定值为1TUE = 5,			//显式指定值为5WED = 19,			//THU = 27,			//FRI = 121,  		//SAT = 123,		//SUN = 345			//
};

枚举类的应用

mygpio.h文件

typedef enum GPIONUM
{BEEP,   //蜂鸣器默认为0PUMP,	//水泵默认为1GPIOMAX, //GPIOMAX默认为2
} GPIONUM;  typedef struct GPIOCOFIG
{GPIO_TypeDef *GPIOx;uint16_t GPIO_Pin;uint32_t RCC_APB2Periph;GPIOMode_TypeDef ioMode;
} GPIOCOFIG;

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

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

#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口速度为50MHzGPIO_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

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

http://www.ppmy.cn/devtools/5680.html

相关文章

leetcode39--组合总数I

1. 题意 给一堆数&#xff0c;和一个目标和&#xff0c;求所有可能的不重复的组合。 组合总数 2. 题解 主要是去重&#xff0c;每次推入数到目标数组&#xff0c;将下次枚举的数的开头设为当前的下标就不会重复噜噜o_O 即如何避免 2 3 2 2\ 3\ 2 2 3 2 和 3 2 2 3\ 2\ 2 3…

Promise

Promise Promise 是异步编程的一种解决方案, 可以解决传统 Ajax 回调函数嵌套问题。 案例&#xff1a;模拟使用ajax连续发起两次请求 第一次请求monster.json获取到monster的id {"id": 1,"name": "黑山老妖" }第二次请求需要根据第一次获取到的…

20240417,友元 FRIEND

本来要学习的吃瓜吃了一下午 目录 3.1 全局函数做友元 3.2 友元类 3.3 成员函数做友元 三&#xff0c;友元 3.1 全局函数做友元 #include<iostream> using namespace std; class Building {friend void goodGay(Building* building);//好朋友&#xff0c;可以访问…

数据结构-基于ArrayList的源码模拟

文章目录 继承关系 :1. 构造方法的模拟2. 扩容机制的分析3. 查找方法的模拟4. 获取,修改元素的方法模拟5. 添加元素的模拟6. 删除元素的模拟7. removeAll与retainAll的模拟总结: 边缘方法以及总代码 继承关系 : 1. 构造方法的模拟 源码中我们的ArrayList的构造方法给出了三种实…

SQLite 的命令行 Shell(三十一)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite FTS5 扩展&#xff08;三十&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 1. 入门 SQLite 项目提供了一个名为 sqlite3&#xff08;或 Windows 上的sqlite3.exe&#xff09;的简单命令行程序 …

深度学习基础——卷积神经网络的感受野、参数量、计算量

深度学习基础——卷积神经网络的感受野、参数量、计算量 深度学习在图像处理领域取得了巨大的成功&#xff0c;其中卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;是一种非常重要的网络结构。本文将介绍卷积神经网络的三个重要指标&#…

MongoDB快速启动

两种方法: 方式 1 &#xff1a;命令行参数方式启动服务 在 bin 目录中打开命令行提示符&#xff0c;输入如下命令&#xff1a; (mongod --dbpath..\data\db) mongod --dbpath..\data\db 方式 2 &#xff1a;配置文件方式启动服务 在解压目录中新建 config 文件夹&#xff0…

踏上R语言之旅:解锁数据世界的神秘密码(二)

R语言学习 文章目录 R语言学习1.数据的R语言表示2.多元数据的R语言调用3.多元数据的简单R语言分析 总结 1.数据的R语言表示 数据框&#xff08;data frame) R语言中用函数data.frame()生成数据框&#xff0c;其句法是&#xff1a; data.frame(data1,data2,…)&#xff0c;例如…