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数据包,通过这种方式实现了树莓派和服务器(我 ...
随机推荐
- Mobile phones(poj1195)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 18453 Accepted: 8542 De ...
- 1091. Tmutarakan Exams
1091. Tmutarakan Exams Time limit: 1.0 secondMemory limit: 64 MB University of New Tmutarakan trains ...
- <学习opencv>图像变换
拉伸.收缩.扭曲和旋转 统一调整大小 我们经常会遇到一些我们希望转换为其他尺寸的图像. 我们可能想要扩大或缩小图像; 这两项任务都是由同一个功能完成的. cv::resize() 该cv::resiz ...
- 教你10分钟对接人大金仓EF Core 6.x
前言 目前.NET Core中据我了解到除了官方的EF Core外,还用的比较多的ORM框架(恕我孤陋寡闻哈,可能还有别的)有FreeSql.SqlSugar(排名不分先后).FreeSql和SqlS ...
- Cube 技术解读 | Cube 小程序技术详解
本文为<Cube 技术解读>系列第三篇文章,之前上线的<支付宝新一代动态化技术架构与选型综述>与<Cube卡片技术栈解读>欢迎大家回顾. 魔方卡片(Cube)已在「 ...
- GeoWave实践2:使用命令行将本地矢量数据注入hbase并发布至GeoServer
目录 步骤 补充 步骤 在GeoWave所在的节点打开两个会话窗口. 会话1 //运行GeoServer,默认端口8080 geowave gs run 会话2 //为GeoWave创建数据库Test ...
- 算法竞赛——BFS广度优先搜索
BFS 广度优先搜索:一层一层的搜索(类似于树的层次遍历) BFS基本框架 基本步骤: 初始状态(起点)加到队列里 while(队列不为空) 队头弹出 扩展队头元素(邻接节点入队) 最后队为空,结束 ...
- linux 之 导出远程oracle数据库表结构及数据
导出用户下所有表结构及数据 exp 用户名/密码@ip/数据库 file=文件路径/文件名.dmp owner='用户' 导出用户下所有表结构,不导出数据 exp 用户名/密码@ip/数据库 file ...
- Window10系统修改hosts文件的方法
背景: 调试smtp程序时遇到问题,度娘说需要修改hosts文件 使用老方法修改了很久,始终无法保存 又百度了一下,在此重温,以加深记忆 方法: Step1.同时按住Windows+X Step2.选 ...
- 编写java程序压缩Linux本地目录
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6809285459722633736/ 创建工程 使用maven工程 勾选,然后下一步 填写基本信息 注意改一下编码 ...