arduino物联网学习

20200215 OLED屏幕使用教程

材料:

0.96英寸OLED屏幕(4针脚)

arduino板子

dht11 温湿度传感器

将OLED屏幕的SDA针脚接到A4口,SCL针脚接到A5接口0 (不太清楚为什么,只是看网上就这么接的)

DHT11 的DATA针脚接到2

软件

  1. 需要在arduino ide 中 安装两个库 < Adafruit_SSD1306.h> <Adafruit_GFX.h> 搜索ssd1306 和gfx安装即可

  2. 于此同时需要wire库和SimpleDHT库

  3. 需要软件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。

为什么要选择它?

  1. 非常小的通信开销(最小的消息大小为 2 字节);
  2. 支持各种流行编程语言(包括C,Java,Ruby,Python 等等)且易于使用的客户端;
  3. 支持发布 / 预定模型,简化应用程序的开发;
  4. 提供三种不同消息传递等级,让消息能按需到达目的地,适应在不稳定工作的网络传输需求。
  5. 他是开源的。

安装方法:

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

https://www.arduino.cc/

五、配置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物联网学习的更多相关文章

  1. Arduino小车学习与研究

    信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(20135225) ---------- 索引 ...

  2. Arduino小车学习与研究博客

    Arduino小车学习与研究博客 信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(201352 ...

  3. 物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus

    物联网学习笔记三:物联网网关协议比较:MQTT 和 Modbus 物联网 (IoT) 不只是新技术,还是与旧技术的集成,其关键在于通信.可用的通信方法各不相同,但是,各种不同的协议在将海量“事物”连接 ...

  4. Arduino入门学习

    一直听到许多做物联网.智能家居的控制器使用的是Arduino,从师兄那里拿到了一块Arduino开发板,进行了一下午的学习,感觉这个适合小孩子们玩:) 废话少说,总结一下,便于以后可能会用得到.我主要 ...

  5. 总结:ARM逻辑和高级C(朱老师物联网学习)

    开始学习朱老师物联网的视频是国庆节的那几天开始的,刚刚开始的时候是想自己在网上找一些嵌入式方面的视频资料,也找了很多的资料臂如“国嵌视频”“达内的视频”,之后也化了十几块钱在淘宝上面买了几十个G的视频 ...

  6. 解析-ESP01模块开发Arduino物联网wifi开关模块

    本文将解析<完美图解物联网Iot实操 ESP8266>中 第五章 P177页 动手做的代码2(使用SPIFFS文件系统的代码) 首先我们先动手使用Arduino IDE编译并且上传代码,上 ...

  7. 物联网学习之路——物联网通信技术:NBIoT

    NBIoT是什么 NB-IoT,Narrow Band Internet of Things,窄带物联网,是一种专为万物互联打造的蜂窝网络连接技术.顾名思义,NB-IoT所占用的带宽很窄,只需约180 ...

  8. 物联网学习之路——IoT概况

    物联网IoT概念 IoT,Internet of Things,即物物相连的互联网.它包含两层意思:一,以互联网为基础:二,物物相连,实现信息的交换和通信.物联网通过智能感知.识别技术与普适计算等通信 ...

  9. 物联网学习笔记——构建RESTFul平台1

    0.前言     前些时间顺着Yeelink学习了RESTFUL,使用PHP和Slim框架尝试实现简单的REST API,树莓派可通过GET方法获得JSON数据包,通过这种方式实现了树莓派和服务器(我 ...

随机推荐

  1. [LeetCode]621. Task Scheduler 任务安排 题解

    题目描述 给定一个char数组,代表CPU需要做的任务,包含A-Z,不用考虑顺序,每个任务能在1个单位完成.但是有规定一个非负整数n代表两个相同任务之间需要至少n个时间单位.球最少数量的时间单位完成所 ...

  2. 1036 - A Refining Company

    1036 - A Refining Company   PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 32 ...

  3. javascript原始值和引用值类型及区别

    原始值和引用值类型及区别 首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变. 原始值(简单数据类型) 存储在栈中的简单 ...

  4. 用C++创建Https客户端,用Mingw编译

  5. 「算法笔记」FHQ-Treap

    右转→https://www.cnblogs.com/mytqwqq/p/15057231.html 下面放个板子 (禁止莱莱白嫖板子) P3369 [模板]普通平衡树 #include<bit ...

  6. Java集合与数组的联系和区别

    数组特点 存放一组相同的数据类型(基本类型和对象类型)的数据,从而实现对数据的管理. 优势:可以快速的通过下标对数组元素进行访问,效率高 劣势:容量实现定义好了,不能随着需求变化而扩容. 集合特点 集 ...

  7. 使用delve调试golang

    目录 前置要求 使用方式 使用funcs查找支持的函数 使用break(b)打断点 使用breakpoints查看当前活动的断点. 使用clear清除断点 使用goroutines查看所有协程 使用s ...

  8. js_给元素增加或移除style属性

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 关于MySQL中group by的一些问题的记录

    only full group by问题的解约方案 这个报错的原因是,在SQL语句中,你查询的字段应该是你分组的依据,即select的column应该全部跟在group by之后.这个也和MySQL的 ...

  10. Redis之持久化方式详解

    背景:Redis之所以能够在技术革新发展迅速的时代超越Memcache等其他Nosql数据库,最主要的一点是Redis提供数据持久化,能够根据持久化策略将缓存数据灵活的写到磁盘上,更好地满足了当下海量 ...