arduino 编程esp8266

概述:

      1.wifi连接,扫描WiFi连接json序列化,http.get和http.post。

       2.数据的存储和全局常量的flash定义。

       3.文件的存储读写。 

       4.板子外设资源的访问:Libraries - Arduino Reference

    注意:开发板未nodeMCU1.0(esp-12e)(esp8266-01s上调试的。)

1.添加arduino提供的库

  代码: 

    #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本质没有区别,只不过在封装的时候考虑了标志,数据的位置,服务器的解析。

2.数据的动态存储和读写

     

#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(){}

6.全局常量定义在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

3.文件的操作(有的开发板不支持,差一些开发板的资料) 

      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 для хранения любых данных в файлах

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ISIS知识点【笔记】

isis配置 【Isis进程&#xff0c;Isis实体认证,Is-level&#xff0c;Isis接口开启功能&#xff1a;isis enable 1】 【Isis接口认证】 【49.0002.0000.0000.0004.00 前两段&#xff1a;区域ID。第三&#xff0c;四&#xff0c;五&#xff1a;主机ID。00&#xff…

Java后端八股------消息中间件篇

自动确认没收到&#xff0c;实现重复消费问题&#xff0c;可以用业务唯一标识来确定业务是否被消费。 TTL也就是超时时间&#xff0c;一般去dead letter的时间为min(消息的ttl,queue的ttl)。 acksall设置是最安全的&#xff0c;但是效率太低了&#xff0c;实际的生…

鲜花销售小程序|基于微信小程序的鲜花销售系统设计与实现(源码+数据库+文档)

鲜花销售小程序目录 目录 基于微信小程序的鲜花销售系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1前台功能模块 2、后台功能模块 1、管理员功能模块 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 六、论文参考 七、…

Java开发从入门到精通(一):ZK 集群的部署

ZK 集群的部署 server.<节点ID>:<数据同步端口>:<选举端口> 节点 ID&#xff1a;为 1 到 125 之间的数字&#xff0c;写到对应服务节点的{dataDir}/myid 文件中。 IP 地址&#xff1a;节点的远程 IP 地址&#xff0c;可以相同&#xff0c;生产环境建议用不同…

突破编程_C++_设计模式(享元模式)

1 享元模式的基本概念 享元模式&#xff08;Flyweight Pattern&#xff09;是一种主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能的设计模式。它通过使用共享对象来支持大量的细粒度对象&#xff0c;从而减少了内存占用。在享元模式中&#xff0c;有些对象可…

【io.net】问题汇总

【io.net】问题汇总 大家最近挖挖的如火如荼&#xff0c;可是不论是社区活动积分和参与挖矿积分&#xff0c;大家遇到了很多类似问题&#xff0c;重复解决。 因此我这里整理了一下常见的相关问题&#xff0c;大家可以一站式找到解决方案。解决方案主要分为运营和挖矿两个两面…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的障碍物检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发障碍物检测系统对于道路安全性具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个障碍物检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模型间的性能…

如何解决由触发器导致 MySQL 内存溢出?

由触发器导致得 OOM 案例分析过程和解决方式。 作者&#xff1a;龚唐杰&#xff0c;爱可生 DBA 团队成员&#xff0c;主要负责 MySQL 技术支持&#xff0c;擅长 MySQL、PG、国产数据库。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编…

JavaScript 面试题

问题 1 // 请解释下面代码的输出结果 console.log(1 "2" "2"); console.log(1 "2" "2"); console.log(1 -"1" "2"); console.log("A" - "B" "2"); console.log(&qu…

零基础学习JS--基础篇--使用对象

JavaScript 的设计是一个简单的基于对象的范式。一个对象就是一系列属性的集合&#xff0c;一个属性包含一个名和一个值。一个属性的值可以是函数&#xff0c;这种情况下属性也被称为方法。除了浏览器里面预定义的那些对象之外&#xff0c;你也可以定义你自己的对象。本章节讲述…

苹果cms模板保护设置,防止被扒

苹果cms模板保护设置&#xff0c;防止被扒 如今互联网时代&#xff0c;网站模板前端被扒是常有的事&#xff0c;如何防止模板数据被扒&#xff1f; 保护设置方法&#xff1a; 登录宝塔 找到安装模板的网站 设置禁止访问文件 方法参考截图后缀填&#xff1a;php|html 目录填&a…

OA系统中的九大常用审批场景,你都晓得吗?

Hi&#xff0c;我是贝格前端工场&#xff0c;今天继续来剖析OA的功能&#xff0c;这次重点分析审批功能&#xff0c;欢迎老铁们点赞评论转发。 一、OA的审批功能和流程 OA的审批功能是指在办公自动化系统中&#xff0c;通过电子化的方式实现对各种申请、请求或业务流程的审批管…

项目管理工具及模板(甘特图、OKR周报、任务管理、头脑风暴等)

项目管理常用模板大全&#xff1a; 1. 项目组OKR周报 2. 项目组传统周报工作法 3. 项目甘特图 4. 团队名单 5. 招聘跟进表 6. 出勤统计 7. 年度工作日历 8. 项目工作年计划 9. 版本排期 10. 项目组任务管理 11. 项目规划模板 12. 产品分析报告 13. 头脑风暴 信息化项目建设全套…

阻塞队列学习

1、什么是阻塞队列&#xff1f; 顾名思义&#xff0c;就是支持阻塞的队列&#xff0c;相比于其他的队列&#xff0c;阻塞队列支持以下特性&#xff1a; 队列为空的时候&#xff0c;获取元素的线程会等待队列变为非空。队列为满的时候&#xff0c;存储元素的线程会等待队列可以…

Python 单元测试

本篇为Python的单元测试的方法及示例 目录 概念 结果 示例 对函数进行测试 创建函数文件 创建测试文件 测试结果 对类进行测试 创建待测试类 创建测试文件 文档测试 创建函数 进行测试 总结 概念 用来对一个函数、一个类或者一个模块来进行正确性校验工作 结果 …

提取B站视频教程详情

提取B站视频教程详情 背景 B站这个视频列表是真的体验感太差了,有时候想把章节复制下来,再对应的章节下面做笔记,实在是太难搞了,于是就有了这篇文文章 根据关键字获取视频id Test public void list() {String url "https://api.bilibili.com/x/web-interface/wbi/sea…

虚拟机(KVM)克隆

当需要批量部署虚拟机时&#xff0c;可以使用克隆虚拟机的方式来进行。 使用图形界面来克隆虚拟机。 [rootzhoujunru_node1 zhou]# virsh list --allId Name State ------------------------------ vm01 shut off- vm01-clone shut off克隆完成。

Django入门 整体流程跑通

Django学习笔记 一、Django整体流程跑通 1.1安装 pip install django //安装 import django //在python环境中导入django django.get_version() //获取版本号&#xff0c;如果能获取到&#xff0c;说明安装成功Django目录结构 Python310-Scripts\django-admi…

Centos7 安装mongodb 7.0

官方手册参考&#xff1a; https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-red-hat/ Mongodb支持的版本 安装 MongoDB 社区版 按照以下步骤使用包管理器安装 MongoDB Community Edition yum。 配置包管理系统 ( yum) 创建一个/etc/yum.repos.d/mongodb-o…

Mabatis缓存详细介绍

MyBatis缓存分为一级缓存和二级缓存&#xff0c;是 MyBatis 中用于提高性能的两种缓存机制。 一级缓存 定义&#xff1a; 一级缓存指的是在同一个 SqlSession 中执行相同的查询语句时&#xff0c;第二次及后续的查询会直接从内存中获取结果&#xff0c;而不需要再次查询数据库…