arduino物联网学习
arduino物联网学习
20200215 OLED屏幕使用教程
材料:
0.96英寸OLED屏幕(4针脚)
arduino板子
dht11 温湿度传感器
将OLED屏幕的SDA针脚接到A4口,SCL针脚接到A5接口0 (不太清楚为什么,只是看网上就这么接的)
DHT11 的DATA针脚接到2
软件
需要在arduino ide 中 安装两个库 < Adafruit_SSD1306.h> <Adafruit_GFX.h> 搜索ssd1306 和gfx安装即可
于此同时需要wire库和SimpleDHT库
需要软件PCtoLCD2002这个软件将汉字转换位16进制的形式进行表示
代码注释
#define OLED_RESET 4
Adafruit_SSD1306 display(128, 64, &Wire,OLED_RESET); //创建一个对象的作用,只知道前两个参数用来是OLED屏幕的分辨率
static const unsigned char PROGMEM str1[] =
{0x00,0x00,0x00,0x00,0x6F,0x80,0x10,0x80,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x80,
0x0F,0x00,0x00,0x00};/*"℃",0*/ //将十六进制字模放到这个数组中,这个字模由PCtoLCD2002产生
display.begin(SSD1306_SWITCHCAPVCC,0x3C); //开启屏幕,应该就是规定,需要这么写
display.setTextColor(WHITE);//开像素点发光
display.clearDisplay();//清屏
display.drawBitmap(40, 32, str2, 20, 20, 1); //汉字显示:前两个参数是位置,中间是字符,在后面两个是字模的大小,最后一个是字体大小,不知道为啥字模超过16*16就显示错了
display.display(); // 开显示
display.println("%"); //普通字符用这个生成就可以
display.setTextSize(1); //设置字体大小 设置一次后面的都可以生效,display.drawBitmap()函数的除外
完整代码
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include<SimpleDHT.h>
int pin = 2;
SimpleDHT11 dht11(pin);
#define OLED_RESET 4
Adafruit_SSD1306 display(128, 64, &Wire,OLED_RESET);
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
static const unsigned char PROGMEM str1[] =
{0x00,0x00,0x00,0x00,0x6F,0x80,0x10,0x80,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x80,
0x0F,0x00,0x00,0x00};/*"℃",0*/
//温度为
static const unsigned char PROGMEM str2[] =
{0x00,0x00,0x47,0x00,0x0F,0x00,0x09,0x00,0x6F,0x00,0x20,0x00,0x29,0x00,0x56,0x80,
0x56,0x80,0x7F,0x80};/*"温",0*/
static const unsigned char PROGMEM str3[] =
{0x00,0x00,0x00,0x00,0x35,0x80,0x7F,0x80,0x4A,0x00,0x4E,0x00,0x45,0x00,0x4A,0x00,
0x46,0x00,0x99,0x80};/*"度",1*/
static const unsigned char PROGMEM str4[] =
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
0x40,0x00,0x00,0x00};/*":",2*/
//湿度为
static const unsigned char PROGMEM str5[] =
{0x00,0x00,0x47,0x80,0x0F,0x80,0x88,0x80,0x69,0x80,0x36,0x00,0x56,0x80,0x56,0x80,
0x47,0x00,0x7F,0x80};/*"湿",0*/
static const unsigned char PROGMEM str6[] =
{0x00,0x00,0x00,0x00,0x35,0x80,0x7F,0x80,0x4A,0x00,0x4E,0x00,0x45,0x00,0x4A,0x00,
0x46,0x00,0x99,0x80};/*"度",1*/
static const unsigned char PROGMEM str7[] =
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
0x40,0x00,0x00,0x00};/*":",2*/
//智慧养猪舍
static const unsigned char PROGMEM str8[] =
{0x20,0x00,0x3E,0x7C,0x48,0x44,0x08,0x44,0xFF,0x44,0x14,0x44,0x22,0x7C,0x40,0x00,
0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10};/*"智",0*/
static const unsigned char PROGMEM str9[] =
{0x10,0x10,0xFE,0xFE,0x10,0x10,0x7C,0x7C,0x10,0x10,0xFE,0xFE,0x10,0x10,0x3F,0xF8,
0x00,0x08,0x1F,0xF8,0x00,0x08,0x3F,0xF8,0x01,0x00,0x48,0x84,0x48,0x12,0x87,0xF2};/*"慧",1*/
static const unsigned char PROGMEM str10[] =
{0x08,0x20,0x04,0x40,0x00,0x00,0x7F,0xFC,0x01,0x00,0x3F,0xF8,0x02,0x00,0xFF,0xFE,
0x04,0x40,0x08,0x20,0x34,0x58,0xC4,0x46,0x04,0x40,0x08,0x40,0x10,0x40,0x20,0x40};/*"养",2*/
static const unsigned char PROGMEM str11[] =
{0x00,0x40,0x88,0x44,0x53,0xF4,0x20,0x48,0x50,0x50,0x97,0xFE,0x10,0x40,0x10,0x80,
0x31,0xF8,0x53,0x08,0x95,0x08,0x11,0xF8,0x11,0x08,0x11,0x08,0xA1,0xF8,0x41,0x08};/*"猪",3*/
static const unsigned char PROGMEM str12[] =
{0x01,0x00,0x02,0x80,0x04,0x40,0x08,0x20,0x30,0x18,0xCF,0xE6,0x01,0x00,0x01,0x00,
0x3F,0xF8,0x01,0x00,0x01,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10};/*"舍",4*/
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC,0x3C);
display.setTextColor(WHITE);//开像素点发光
display.clearDisplay();//清屏
// //display.setTextSize(2); //设置字体大小
// display.setCursor(1, 20);//设置显示位置
// display.println("i love you");
// display.setTextSize(2);//设置字体大小
// display.setCursor(15, 30);//设置显示位置
// display.println("你好");
//display.drawBitmap(30, 30, str1, 16, 16, 1); //画出字符对应点阵数据
// display.drawBitmap(40, 32, str2, 20, 20, 1); //画出字符对应点阵数据
// display.drawBitmap(60, 32, str2, 20, 20, 1); //画出字符对应点阵数据
//display.display(); // 开显示
}
void loop() {
display.clearDisplay();//清屏
if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess)
{
return;
}
Serial.print("温度:");
Serial.print((float)temperature);
Serial.print("度 ");
Serial.print("相对湿度:");
Serial.print((float)humidity);
Serial.println("%");
//智慧养猪舍
display.drawBitmap(24, 8, str8, 16, 16,1);
display.drawBitmap(40, 8, str9, 16, 16,1);
display.drawBitmap(56, 8, str10, 16, 16,1);
display.drawBitmap(72, 8, str11, 16, 16,1);
display.drawBitmap(88, 8, str12, 16, 16,1);
//温度
display.drawBitmap(28, 35, str2, 10, 10,1);
display.drawBitmap(38, 35, str3, 10, 10,1);
display.drawBitmap(48, 35, str4, 10, 10,1);
display.setTextSize(1); //设置字体大小
display.setCursor(58, 37);//设置显示位置
display.println((float)temperature);
display.drawBitmap(88, 35, str1, 10, 10,1);
//湿度
display.drawBitmap(28, 48, str5, 10, 10,1);
display.drawBitmap(38, 48, str6, 10, 10,1);
display.drawBitmap(48, 48, str7, 10, 10,1);
display.setCursor(58, 50);//设置显示位置
display.println((float)humidity);
display.setCursor(90, 50);//设置显示位置
display.println("%");
display.display(); // 开显示
delay(10000);
}
Arduino IDE 开发 ESP-01S/ESP-01物联网实战检测温度湿度上传MQTT服务器 2021/12/17
一、硬件准备
USB转ESP8266两块、DHT11温度湿度传感器、ESP8266-01/ESP8266-01一块(如果学习的话多买几块,ESP-01/ESP-01S的区别)
USB转ESP8266 说明:为什么要买两块
二、软件准备
Arduino、EMQX(这是mqtt服务器可以部署在本地也可以放在远程服务器上)、MQTTBox(mqtt客户端程序)、如果是Window系统的话 安装相关USB驱动程序。
三、安装EMQX 下面介绍的方法是部署在远程服务器上。
先来说说mqtt协议:
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,它比较适合于在低带宽、不可靠的网络的进行远程传感器和控制设备通讯等,正在日益成为物联网通信协议的重要组成部分。
MQTT服务器:
EMQX:在github上有5K以上的Star。
为什么要选择它?
- 非常小的通信开销(最小的消息大小为 2 字节);
- 支持各种流行编程语言(包括C,Java,Ruby,Python 等等)且易于使用的客户端;
- 支持发布 / 预定模型,简化应用程序的开发;
- 提供三种不同消息传递等级,让消息能按需到达目的地,适应在不稳定工作的网络传输需求。
- 他是开源的。
安装方法:
1、先找到下载地址:https://www.emqx.io/cn/downloads
选择如下:复制下载地址
(接下来这几步看着官方文档操作接可以了)
2、远程连接你的服务器 执行命令 : wget 刚才复制的网址
3 、解压下载的文件
4、进入到解压的文件夹里面:cd emqttd
配置成功。
5、浏览器输入你的服务器IP地址加18083 即可进入后台管理界面如:192.168.4.4:18083
账号是admin、密码是public 可以修改
如果不能访问,那就是你的服务器安全组没有允许18083该端口访问配置即可,(顺便把1883端口也允许访问)
四、安装Arduino IDE
五、配置Arduino IDE 的 ESP8266开发环境
打开Arduino IDE(这里安装IDE就不讲了,可以到官网下载安装包,不过要记住安装位置),在菜单"文件->首选项"弹出的对话框的"附加开发板管理网址"框中填入http://arduino.esp8266.com/stable/package_esp8266com_index.json
如图:
六、把ESP-01与DHT11连接
引脚接线:
DHT11---ESP8266-01
Singnal--IO2,
GND----GND,
VCC----VCC
DHT11引脚说明:
ESP8266-01/ESP8266-01S引脚说明:
Arduino 工具>管理库>搜索并安装SimpleDHT
七、打开Arduino IDE 编写代码
注意修改 Wi-Fi名和 Wi-Fi密码,如果是本地mqtt服务器的话地址填 127.0.0.1
#include <SimpleDHT.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
int pinDHT11 = 2; // GPIO2 of ESP8266
const char* ssid = "XXXXX";//手机Wi-Fi热点
const char* password = "XXXX";//手机Wi-Fi密码
const char* mqtt_server = "XXXXXXX";//服务器网址或者IP地址
//const String macAddress = WiFi.macAddress();
//const char* clientID = macAddress.c_str(); //MAC地址
const char* clientID = "ESP8266_01_A"; //连接mqtt用户名
WiFiClient espClient;
PubSubClient client(espClient);
SimpleDHT11 dht11(pinDHT11);
long lastMsg = 0;
char msg[50];
int value = 0;
void setup() {
//pinMode(BUILTIN_LED, OUTPUT); // 将BUILTIN_LED引脚初始化为输出
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void setup_wifi() {
delay(10);
WiFi.begin(ssid, password); // 我们从连接到WiFi网络开始
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.println("WiFi connected");
}
///接收反馈
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
}
void reconnect() {
// 循环,直到我们重新连接
while (!client.connected()) {
if (client.connect(clientID)) { //connected
Serial.print("MQTT连接成功"); // 连接mqtt成功
// client.publish("ESP_01主题", "hello world"); // 一旦连接,发布公告…
client.subscribe("ESP_01主题"); // 一旦连接,发布主题
} else {
delay(5000); // 等待5秒再重试
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
////////温度湿度
byte temperature = 0;
byte humidity = 0;
int err = SimpleDHTErrSuccess;
if ((err = dht11.read(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
return;
}
String tmp = "温度:"; //字符串拼接
tmp += String(temperature);
tmp += String(" 湿度:");
tmp += String(humidity);
Serial.print((int)temperature); Serial.print(" *C, ");
Serial.print((int)humidity); Serial.println(" H");
client.publish("ESP_01主题", tmp.c_str());//发送主题
delay(2000);
////////温度湿度
}
八、烧录程序
用改装过的 USB转ESP8266 连接ESP-01连接电脑,准备烧录。
点击IDE左上角的箭头开始烧录。
九、测试程序
把烧录好的ESP8266,取下来,装到 USB转ESP8266 没改装的转换器上,插入电脑,打开IDE右上角的图标,即可看到运行状态。
十、打开MQTTBox 订阅ESP_01主题
使用python代码进行订阅
import paho.mqtt.client as mqtt
import time
address = '192.168.3.29'
client = mqtt.Client("computer")
def on_message(client,userdata,message):
print(str(message.payload.decode("utf-8")))
# print("主题为",message.topic)
# print("message qos=",message.qos)
# print("message retain flag=",message.retain)
client.on_message = on_message
print("连接盒子")
client.connect(address)
#开始循环接受消息
client.loop_start()
client.subscribe('002') #订阅01主题
#client.publish('001')
time.sleep(1000)
client.loop_stop()
python版订阅
import paho.mqtt.client as mqtt
import time
address = '192.168.3.29'
client = mqtt.Client("computer")
def on_message(client,userdata,message):
print(str(message.payload.decode("utf-8")))
# print("主题为",message.topic)
# print("message qos=",message.qos)
# print("message retain flag=",message.retain)
client.on_message = on_message
print("连接盒子")
client.connect(address)
#开始循环接受消息
client.loop_start()
client.subscribe('002') #订阅01主题
#client.publish('001')
time.sleep(1000)
client.loop_stop()
ESP8266破解校园网
烧录AT固件
打开串口调试助手进行调试
根据AT固件文档进行设置
arduino物联网学习的更多相关文章
- Arduino小车学习与研究
信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(20135225) ---------- 索引 ...
- Arduino小车学习与研究博客
Arduino小车学习与研究博客 信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(201352 ...
- 物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus
物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus 物联网 (IoT) 不只是新技术,还是与旧技术的集成,其关键在于通信.可用的通信方法各不相同,但是,各种不同的协议在将海量“事物”连接 ...
- Arduino入门学习
一直听到许多做物联网.智能家居的控制器使用的是Arduino,从师兄那里拿到了一块Arduino开发板,进行了一下午的学习,感觉这个适合小孩子们玩:) 废话少说,总结一下,便于以后可能会用得到.我主要 ...
- 总结:ARM逻辑和高级C(朱老师物联网学习)
开始学习朱老师物联网的视频是国庆节的那几天开始的,刚刚开始的时候是想自己在网上找一些嵌入式方面的视频资料,也找了很多的资料臂如“国嵌视频”“达内的视频”,之后也化了十几块钱在淘宝上面买了几十个G的视频 ...
- 解析-ESP01模块开发Arduino物联网wifi开关模块
本文将解析<完美图解物联网Iot实操 ESP8266>中 第五章 P177页 动手做的代码2(使用SPIFFS文件系统的代码) 首先我们先动手使用Arduino IDE编译并且上传代码,上 ...
- 物联网学习之路——物联网通信技术:NBIoT
NBIoT是什么 NB-IoT,Narrow Band Internet of Things,窄带物联网,是一种专为万物互联打造的蜂窝网络连接技术.顾名思义,NB-IoT所占用的带宽很窄,只需约180 ...
- 物联网学习之路——IoT概况
物联网IoT概念 IoT,Internet of Things,即物物相连的互联网.它包含两层意思:一,以互联网为基础:二,物物相连,实现信息的交换和通信.物联网通过智能感知.识别技术与普适计算等通信 ...
- 物联网学习笔记——构建RESTFul平台1
0.前言 前些时间顺着Yeelink学习了RESTFUL,使用PHP和Slim框架尝试实现简单的REST API,树莓派可通过GET方法获得JSON数据包,通过这种方式实现了树莓派和服务器(我 ...
随机推荐
- [LeetCode]621. Task Scheduler 任务安排 题解
题目描述 给定一个char数组,代表CPU需要做的任务,包含A-Z,不用考虑顺序,每个任务能在1个单位完成.但是有规定一个非负整数n代表两个相同任务之间需要至少n个时间单位.球最少数量的时间单位完成所 ...
- 1036 - A Refining Company
1036 - A Refining Company PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 32 ...
- javascript原始值和引用值类型及区别
原始值和引用值类型及区别 首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变. 原始值(简单数据类型) 存储在栈中的简单 ...
- 用C++创建Https客户端,用Mingw编译
- 「算法笔记」FHQ-Treap
右转→https://www.cnblogs.com/mytqwqq/p/15057231.html 下面放个板子 (禁止莱莱白嫖板子) P3369 [模板]普通平衡树 #include<bit ...
- Java集合与数组的联系和区别
数组特点 存放一组相同的数据类型(基本类型和对象类型)的数据,从而实现对数据的管理. 优势:可以快速的通过下标对数组元素进行访问,效率高 劣势:容量实现定义好了,不能随着需求变化而扩容. 集合特点 集 ...
- 使用delve调试golang
目录 前置要求 使用方式 使用funcs查找支持的函数 使用break(b)打断点 使用breakpoints查看当前活动的断点. 使用clear清除断点 使用goroutines查看所有协程 使用s ...
- js_给元素增加或移除style属性
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 关于MySQL中group by的一些问题的记录
only full group by问题的解约方案 这个报错的原因是,在SQL语句中,你查询的字段应该是你分组的依据,即select的column应该全部跟在group by之后.这个也和MySQL的 ...
- Redis之持久化方式详解
背景:Redis之所以能够在技术革新发展迅速的时代超越Memcache等其他Nosql数据库,最主要的一点是Redis提供数据持久化,能够根据持久化策略将缓存数据灵活的写到磁盘上,更好地满足了当下海量 ...