arduino 编程esp8266
概述:
1.板子外设资源的访问:Libraries - Arduino Reference
注意:开发板未nodeMCU1.0(esp-12e)(esp8266-01s上调试的。)
2.硬件接线
en,vcc接3.3v,gnd接地(也就是和串口共地),gpio1接地。tx接串口rx,rx接串口tx,rst不接的化烧录完断电重启就行,拔掉gpio1。
3,界面配置
烧录波特率:
9600,停止位,无校验,8位数据,硬件流控制无。9600不行试一下115200。
等编译完成显示uplodaing的时候再给板子上电,当然你买的现成开发板就不用看这个,因为这个是esp8266-01s那个模块的。
4.加载库和寻找库
直接搜,然后安装,安装完点那个三点下载例程。
5.WiFi连接扫描和http
代码:
#include <ESP8266WiFi.h>//默认,加载WIFI头文件#include <Arduino_JSON.h> //加载解析文件库#include <ArduinoHttpClient.h> //加载http客户端库WiFiClient espClient;const char * ssid="wifi_name";//wifi名称const chat * pwd="wifi_password";//WiFi 密码HttpClient http = HttpClient(espClient,"www.baidu.com",80);//定义一个http客户端String mes;
void setup(){WiFi.begin(ssid.pwd);//连接wifiif(WiFi.state()==3)printf("连接成功");delay(500);int n=WiFi.scanNetworks();//扫描附近wifimes=JsonSerialization(n); //将扫描出的WiFi信息json序列化printf(mes);//打印出扫描到的附近wifidelay(100);
}void loop(){String contentType="application/json"; //请求内容格式String url=""; //数据路径httpm.get(url);//发送get请求,所有的东西都在url中int mhttpCode = http.responseStatusCode();//阻塞响应,就是等待响应,一般10s超时跳过String mresponse = http.responseBody(); //获得响应数据JSONVar mtemp=JSON.parse(mresponse);//将字符串转成json格式if (JSON.typeof(mtemp) == "undefined") {Serial.println("Parsing input failed!");return;}delay(1000);String contentType="application/json";String url="";http.post(url, contentType, message); //可以发现post和get还是比较像的,数据和url不在一起int httpCode = http.responseStatusCode();String response = http.responseBody(); printf(response);delay(1000);}
总结:
非常简单,基本上全部封装到位,只需要简单的调用填参数就行。http中的get和post本质没有区别,只不过在封装的时候考虑了标志,数据的位置,服务器的解析。
6.数据的动态存储和读写
#include <se_eeprom.h> //这个库包含了arduino.h和eeprom.h//可以读取1字节到32字节的数据
void setup(){SE_EEPROM my_eeprom;//建立对象unsigned short eeprom_size=256;//flash存储区大小my_eeprom.SetEEPROMSize(256);//申请一个256字节的flash存储区my_eeprom.WriteEEPROMByte(1, ver);//写1到数据区索引1ver=my_eeprom.ReadEEPROMByte(1);//在数据区索引1读取数据my_eeprom.WriteEEPROMStr32(64, "Hello World!!!");//写字符串到数据区索引64Serial.println(my_eeprom.ReadEEPROMStr32(64));//从数据区索引64读取字符串
}
//这个库是毛子写的,可以发现这个库非常好用
//直接搜就可以在ide上搜到
void loop(){}
7.全局常量定义在flash节省ram空间
//字节和整数
// 保存无符号整型
const PROGMEM uint16_t charSet[] = { 65000, 32796, 16843, 10, 11234};// 保存字符
const char signMessage[] PROGMEM = {"I AM PREDATOR, UNSEEN COMBATANT. CREATED BY THE UNITED STATES DEPART"};unsigned int displayInt;
char myChar;void setup() {Serial.begin(9600);while (!Serial); // wait for serial port to connect. Needed for native USB// put your setup code here, to run once:// 读回一个2字节长整型for (byte k = 0; k < 5; k++) {displayInt = pgm_read_word_near(charSet + k);Serial.println(displayInt);}Serial.println();// 读回一个字符int signMessageLength = strlen_P(signMessage);for (byte k = 0; k < signMessageLength; k++) {myChar = pgm_read_byte_near(signMessage + k);Serial.print(myChar);}Serial.println();
}void loop() {// put your main code here, to run repeatedly:
}//存储字符串
/*PROGMEM string demoHow to store a table of strings in program memory (flash),and retrieve them.Information summarized from:http://www.nongnu.org/avr-libc/user-manual/pgmspace.htmlSetting up a table (array) of strings in program memory is slightly complicated, buthere is a good template to follow.Setting up the strings is a two-step process. First, define the strings.
*/#include <avr/pgmspace.h>
const char string_0[] PROGMEM = "String 0"; // "String 0" 等将以表格式存储
const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";
const char string_3[] PROGMEM = "String 3";
const char string_4[] PROGMEM = "String 4";
const char string_5[] PROGMEM = "String 5";
//字符串// 把字符串放到表中.const char *const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5};char buffer[30]; // 确认能够存储字符串的最大长度void setup() {Serial.begin(9600);while (!Serial); // wait for serial port to connect. Needed for native USBSerial.println("OK");
}void loop() {/* Using the string table in program memory requires the use of special functions to retrieve the data.The strcpy_P function copies a string from program space to a string in RAM ("buffer").Make sure your receiving string in RAM is large enough to hold whateveryou are retrieving from program space. *//*这段话的意思是使用字符串表编程到内存,需要特殊的函数复原数据,而strcpy_P就是把数据从内存拷贝到ram区域,保证ram区有足够的空间。*/for (int i = 0; i < 6; i++) {strcpy_P(buffer, (char *)pgm_read_ptr(&(string_table[i]))); // 必要的格式转换和定义Serial.println(buffer);delay(500);}
}/*ram是程序运行区,flash也就是eeprom就是程序存储区*/
/*大部分程序都是三级流水线*///取指:把数据从存储区取出来放到缓存区//译码:把缓存区的数据解析,它们该去哪?有的去寄存器,有的去堆栈,有的去外设//执行:把数据放到它应该去的地方,然后晶振一动,数据就被运行,然后pc+1
代码是官网上抄的,官网全英文,不想区去官网看英文的可以看这个。
官网地址:PROGMEM - Arduino Reference
8.文件的操作(有的开发板不支持,差一些开发板的资料)
esp32和esp8266架构支持。毛子的话看不懂,但是代码很清晰简单。
#include <Arduino.h>
#include <FileData.h>
#include <LittleFS.h>struct Data {uint8_t val8;uint16_t val16;uint32_t val32 = 12345;char str[20];
};
Data mydata;FileData data(&LittleFS, "/data.dat", 'B', &mydata, sizeof(mydata));void setup() {Serial.begin(115200);delay(1000);Serial.println();LittleFS.begin();// прочитать данные из файла в переменную// при первом запуске в файл запишутся данные из структурыFDstat_t stat = data.read();switch (stat) {case FD_FS_ERR: Serial.println("FS Error");break;case FD_FILE_ERR: Serial.println("Error");break;case FD_WRITE: Serial.println("Data Write");break;case FD_ADD: Serial.println("Data Add");break;case FD_READ: Serial.println("Data Read");break;default:break;}Serial.println("Data read:");Serial.println(mydata.val8);Serial.println(mydata.val16);Serial.println(mydata.val32);Serial.println(mydata.str);
}void loop() {// data.tick(); // вызывать тикер в loop// можно отловить момент записиif (data.tick() == FD_WRITE) Serial.println("Data updated!");// запишем в данные строку из монитора порта// а также присвоим остальным переменным случайные значенияif (Serial.available()) {int len = Serial.readBytes(mydata.str, 20);mydata.str[len] = '\0';mydata.val8 = random(255);mydata.val16 = random(65000);Serial.println("Update");// отложить обновлениеdata.update();}
}
代码地址:GitHub - GyverLibs/FileData: Замена EEPROM для ESP8266/32 для хранения любых данных в файлах
相关文章:

arduino 编程esp8266
概述: 1.板子外设资源的访问:Libraries - Arduino Reference 注意:开发板未nodeMCU1.0(esp-12e)(esp8266-01s上调试的。) 2.硬件接线 en,vcc接3.3v,gnd接地(也就是和串口共地),gpio1接地。tx接串口rx,rx接串…...

基于springboot实现数据资产管理系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现数据资产管理系统演示 摘要 固定资产管理系统主要是完成对系统用户管理、资产信息管理、资产变更管理、资产用途管理、资产类别管理和资产增减管理。因为利用本系统管理员可以直接录入信息,修改信息,删除信息,并且若在录入…...
在Java中如何将十进制转换为二进制,八进制,十六进制以及它们之间的互相转换
目录 一、算法实现进制之间的转换 (1)十进制转换为二进制 (2)二进制转换成十进制 二、Java中的API实现进制转换 (1)十进制转换为二进制 (2)十进制转换为八进制 (3…...
AK/SK加密认证
一、AK/SK概念 Access Key (AK):AK是一个全局唯一的字符串标识符,用于标识用户。它类似于用户名,但仅用于身份识别,并不包含任何秘密信息。 Secret Access Key (SK):SK则是一个高度保密的密钥,类似于密码&…...
前端实现websocket通信讲解(vue2框架)
websocket: WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议 websocket提供的api&a…...
解决ffmpeg播放摄像头延时的问题(项目案例使用有效)
第一1.目前使用的对接的海康威视的摄像机,并且采用的流媒体服务器NodeMediaServer 进行收数据流并发流数据。但是延时达到了20秒,所以客户看到的效果不是很乐观,没有办法,只能开始优化播放延时的问题,至于对接摄像头的方案有好几种。我这种情况是时间没有延迟只有画面是有…...

Android 音频系统
导入 早期Linux版本采用的是OSS框架,它也是Unix及类Unix系统中广泛使用的一种音频体系。 ALSA是Linux社区为了取代OSS而提出的一种框架,是一个源代码完全开放的系统(遵循GNU GPL和GNU LGPL)。ALSA在Kernel 2.5版本中被正式引入后,OSS就逐步…...
Java必须掌握的二叉堆知识点(含面试大厂题含源码)
二叉堆是一种常用的优先队列数据结构,广泛应用于各种场景,比如任务调度、带权图的最短路径算法(如Dijkstra算法)等。在Java面试中,了解二叉堆的基本概念、实现方式和操作是非常重要的。下面是一些关于二叉堆的关键知识…...

[Java、Android面试]_03_java内存管理:虚拟内存、堆、垃圾回收
本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料,感兴趣的朋友可收藏关注, 现分享如下: 文章目录 1. Java虚拟机运行时数据区2. Java堆3. 垃圾回收3.1 如…...

PTA题解 --- 求整数段和(C语言)
今天是PTA题库解法讲解的第二天,接下来讲解求整数段和,题目如下: 为了解决这个问题,你可以遵循以下的思路: 1. 读取输入的两个整数A和B。 2. 使用一个for循环,从A遍历到B。 3. 在循环中,打印当…...
virsh管理虚拟机的命令行工具
virsh是一个管理虚拟机的命令行工具,提供了丰富的命令来查看、创建、管理虚拟机。以下是一些常用的virsh命令: 查看帮助和版本: virsh --help:查看virsh命令的帮助信息。virsh -version:查看virsh的版本信息。 查看虚…...

数据集成平台选型建议
一 数据集成介绍 数据集成平台是一种用于管理和协调数据流动的软件工具或服务。它的主要目标是将来自多个不同数据源的数据整合到一个统一的、易于访问和分析的数据存储库中。这些数据源可以包括数据库、云应用、传感器、日志文件、社交媒体等等。数据集成平台的关键任务是确保…...

Centos8安装Docker,使用阿里云源
一、前期准备 1.关闭防火墙,SELINUX systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 sed -i "s/SELINUXenforcing/SELINUXdisabled/g" /etc/selinux/config查看状态 systemctl status firewalld systemctl status…...
FFmpeg概念和简单使用
FFmpeg是一个开源的跨平台多媒体处理工具套件,包含了用于处理音频、视频和图像的各种工具、库和命令行程序。它由一个主要的命令行工具ffmpeg和一系列相关工具组成,可以执行各种各样的多媒体操作。以下是FFmpeg中一些重要的概念: 音频、视频和…...

OJ_最长公共子序列
题干 C实现 #include <iostream> #include <stdio.h> #include <algorithm> using namespace std;int dp[1002][1002];int main() {int n,m;char s1[1001];char s2[1001];scanf("%d%d",&n,&m);scanf("%s%s",s1,s2);//dp[i][j]是…...
SpringBoot拦截器获取token用户对象优雅地传递到Controller层
项目场景: SpringBoot拦截器获取token用户对象优雅地传递到Controller层 问题描述 后端有许多接口都需要请求中携带有正确的Token,这时采用拦截器来验证token,但是每个接口都还是需要解析一遍token,浪费资源,不免显得…...
从零开始学HCIA之SDN03
1、VXLAN相关概念 (1)NVE(Network Virtual Edge),网络虚拟化边界,是运行VXLAN的设备,其实体是一种虚拟逻辑接口,负责VXLAN数据的封装和解封装,其主要参数包括源VTEP以及…...
C语言深度理解之——结构体内存对齐
前言: 在C语言中,结构体(struct)是一种用户自定义的数据类型,可以包含不同类型的数据成员。在定义结构体时,编译器会根据平台的要求对结构体的内存进行对齐,以提高内存访问的效率。结构体内存对…...

LeetCode 热题 100 | 回溯(二)
目录 1 39. 组合总和 2 22. 括号生成 3 79. 单词搜索 菜鸟做题,语言是 C,感冒快好版 关于对回溯算法的理解请参照我的上一篇博客; 在之后的博客中,我将只分析回溯算法中的 for 循环。 1 39. 组合总和 题眼:c…...

混合内容错误https中加载了http
一、遇到问题 iframe嵌套时,混合内容错误https中加载了http,但是已经确认了ifreme中是https的,最后发现在/my/edit?applyid1改为/my/edit/?applyid1,加了一个斜杠,直接解决了 /my/edit是vue页面,其他页…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...