arduino物联网学习

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

选择如下:复制下载地址

image

(接下来这几步看着官方文档操作接可以了)

2、远程连接你的服务器 执行命令 : wget 刚才复制的网址

3 、解压下载的文件

4、进入到解压的文件夹里面:cd emqttd

配置成功。

5、浏览器输入你的服务器IP地址加18083 即可进入后台管理界面如:192.168.4.4:18083

账号是admin、密码是public 可以修改

image

如果不能访问,那就是你的服务器安全组没有允许18083该端口访问配置即可,(顺便把1883端口也允许访问)

四、安装Arduino IDE

https://www.arduino.cc/

五、配置Arduino IDE 的 ESP8266开发环境

打开Arduino IDE(这里安装IDE就不讲了,可以到官网下载安装包,不过要记住安装位置),在菜单"文件->首选项"弹出的对话框的"附加开发板管理网址"框中填入http://arduino.esp8266.com/stable/package_esp8266com_index.json

如图:

image

六、把ESP-01与DHT11连接

引脚接线:

DHT11---ESP8266-01

Singnal--IO2,

GND----GND,

VCC----VCC

DHT11引脚说明:

image

ESP8266-01/ESP8266-01S引脚说明:

image

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固件文档进行设置

CCS811 CO2传感器 esp8266程序

使用rx tx串口进行通信, 返回的数据是ASCII码,

连线图

const char stopchar = '\n';

String str = "";

void setup() {
  Serial.begin(9600);//打开串口波特率9600
}
 
void loop() {
   str = Serial.readStringUntil(stopchar); //读取字符串以stopchar结束
   Serial.print(str);
   delay(2000);
}

posted @ 2021-05-29 15:22  嫌疑的羊  阅读(445)  评论(0)    收藏  举报