SCUMaker入门培训第三弹-温湿度小电视

谁不想要一个温湿度小电视呢

你可以在这次项目学到

  1. PCB的绘制与订购简单了解(嘉立创&立创EDA)
  2. 焊接简单了解(插脚原件焊接)
  3. 激光雕刻的简单使用
  4. arduino开发入门
  5. IOT通讯了解(MQTT)

1 个赞

项目前期准备

  1. arduino IDE2.0
  2. u8g2、DHT sensor library、PubSubClient

本项目中的引脚定义:
IIC :
SCL— D1
SDA—D2

DHT11:
DATA—D4

相关资料链接

  1. PCB板项目 Maker入门项目01
  2. 8266相关资料
  3. IIC扩展阅读
  4. DHT11通讯协议介绍

Step1 准备好你的零件,准备焊接!

  1. 检查你的零件是否齐全
    你的手里应当拿到了四个零件,其中有一块电路板,一个wemos d1 mini模组,一个128*64 4线IIC OLED屏幕以及一个DHT11温湿度传感器。
  2. 准备焊接 我们这一次只是简单的联系,相对比较轻松,如果还是感觉不好驾驭,可以选择使用已经焊接好的板子进行学习,不过还是强烈建议大家尝试以下哦~
    2.1 wemosD1mini模组的焊接
    如图所示,在包装袋子里有一个模组,一对短排母,一对长排母还有一对排针。我们首先要做的是将短排母焊接到电路板上。这一步可能需要一些辅助,要注意不要让烙铁头接触到皮肤!

    完成这一步之后,就可以将排针的长脚插入刚刚焊接好的排座中,这样就起到了一个固定的作用,f方便我们后续将排针短的一脚焊接在模组上。

    然后就把模组放上,继续焊接,完成这一步就已经离成功不远了!

    2.2 OLED屏幕接口和DHT11传感器接口的焊接
    还记得我们的模组的包装里是不是还有一对长脚排母?他们也是有用的,我们按照图上的方式,使用水口钳将它剪成两部分,一部分有三根脚,另一部分有四根脚。

    聪明的你一定想到了,这个是为了电路板上剩下的两个接口准备的!把他们焊接好,就大功告成了!

STEP2 处理开发环境

下载配置arduinoIDE

  1. 进入arduino官网,在software中可以下载最新的2.0版本的IDE。下载后安装即可。
  2. 安装本次项目所需要的库。库的名称已经列在上文了,启动IDE后,将库名复制到图示的框内搜索,确认库名以及作者和给出的截图一致就可以安装了。

  3. 添加esp8266开发板,点击文件->首选项,将这个链接http://arduino.esp8266.com/stable/package_esp8266com_index.json
    添加到其他开发板管理器地址中
    image

    之后在开发板管理器中,搜素ESP8266下载安装就完成了!
  4. 驱动安装

STEP2.1 关于MQTT的准备

下载MQTT客户端 这里建议使用MQTTx 支持多平台的使用


进入后添加新的连接 按照图示信息填写(其实只需要写server的网址 scumaker.org PORT是默认1883)Name clientID都可以随意写

如果完成输出后是这样的,就成功了

Arduino 代码

基础版

#include <U8g2lib.h>
#include <Arduino.h>
#include "DHT.h"

#define DHTPIN D4 //参照BBS项目前期准备的内容
#define DHTTYPE DHT11

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ D1, /* data=*/ D2, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display
//这一条是使用u8g2库初始化屏幕实例的语句,是从example里面找到对应合适的屏幕种类后填入了我们对应的板子的引脚号

DHT dht(DHTPIN,DHTTYPE); //初始化DHT11 温湿度传感器

int t1 = 0; //用于储存温度值
int t2 = 0; //用于储存湿度值
int errorFlag = 0; //记录是否出错

void setup() {
    pinMode(D4, INPUT); //从D4这个接口读取温湿度的数据
    dht.begin();  
    u8g2.begin(); 
    u8g2.enableUTF8Print(); //一些初始化
    Serial.begin(115200); //建立串口通讯
}

void loop() {
    delay(2000); //可以自己调整一下,看看有什么效果

    if (isnan(dht.readTemperature())) {
      Serial.println(F("Error !"));
      errorFlag = 1;// 如果连接有问题或者传感器有问题就设置错误标记
    }

    t1 = (int)(dht.readTemperature());
    t2 = (int)(dht.readHumidity());
    //读取DHT11传感器内的信息

    Serial.println(t1);
    Serial.println(t2);
    //将信息打印在串口通讯

    u8g2.firstPage();//刷新页面
    do {
        u8g2.setFont(u8g2_font_ncenB08_tr);//u8g2_font_ncenB08_tr:先设置显示屏显示什么类型的文字,中文需要设置成另外的参数。
        
        if(!errorFlag){
          u8g2.drawStr(16, 13, "Tem:");//128*64,横坐标为128,纵坐标为64,原点在屏幕的左上角。在坐标为(6,13)的地方插入“Tem”。
          u8g2.setCursor(49,13);
          u8g2.print(t1); //print 之前需要先设置光标
          u8g2.setCursor(49,28);
          u8g2.print(t2);
          u8g2.drawCircle(62,3,1,U8G2_DRAW_ALL);
          u8g2.drawStr(63,13,"C");
          u8g2.drawStr(16, 28, "Hum:");
          u8g2.drawStr(62, 28, "%");
        }else{
          u8g2.setCursor(20,40);
          u8g2.print("Error"); //print 之前需要先设置光标
        }//加入DHT11连接错误的判断
        
        u8g2.setCursor(25,60);
        u8g2.print("Makers Go!");
    } while (u8g2.nextPage());

    errorFlag = 0; //标志位重置
}

进阶版

#include <U8g2lib.h>
#include <Arduino.h>
#include "DHT.h"
#include <ESP8266WiFi.h>
#include <PubSubClient.h>

#define DHTPIN D4 //参照BBS项目前期准备的内容
#define DHTTYPE DHT11

// Update these with values suitable for your network.

const char* ssid = "SCU_Makers";
const char* password = "xxxxxx"; //社团的WIFI和密码

const char* mqtt_server = "scumaker.org"; //MQTT服务器 默认的这个只能在校园网下访问

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE	(50)
char msg[MSG_BUFFER_SIZE];
int value = 0;

void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Create a random client ID
    String clientId = "ESP8266Client-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("outTopic", "hello world");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ D1, /* data=*/ D2, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display
//这一条是使用u8g2库初始化屏幕实例的语句,是从example里面找到对应合适的屏幕种类后填入了我们对应的板子的引脚号

DHT dht(DHTPIN,DHTTYPE); //初始化DHT11 温湿度传感器

int t1 = 0;
int t2 = 0;
int errorFlag = 0;

void setup() {
    setup_wifi();
    client.setServer(mqtt_server, 1883);
    pinMode(D4, INPUT); //从D4这个接口读取温湿度的数据
    dht.begin();
    u8g2.begin();
    u8g2.enableUTF8Print(); //一些初始化
    Serial.begin(115200);
}

void loop() {
   if (!client.connected()) {
      reconnect();
    }
    client.loop();

    delay(2000); //可以自己调整一下,看看有什么效果
    
    if (isnan(dht.readTemperature())) {
      Serial.println(F("Error !"));
      errorFlag = 1;// 如果连接有问题或者传感器有问题就设置错误标记
    }
    t1 = (int)(dht.readTemperature());
    t2 = (int)(dht.readHumidity());
    //读取DHT11传感器内的信息
    
    snprintf (msg, MSG_BUFFER_SIZE, "Temp: %d Humid: %d", t1,t2);
    client.publish("%$%$%", msg);
    
    Serial.println(t1);
    Serial.println(t2);

    //
    u8g2.firstPage();
    do {
        u8g2.setFont(u8g2_font_ncenB08_tr);//u8g2_font_ncenB08_tr:先设置显示屏显示什么类型的文字,中文需要设置成另外的参数。
        

        if(!errorFlag){
          u8g2.drawStr(16, 13, "Tem:");//128*64,横坐标为128,纵坐标为64,原点在屏幕的左上角。在坐标为(6,13)的地方插入“Tem”。
          u8g2.setCursor(49,13);
          u8g2.print(t1); //print 之前需要先设置光标
          u8g2.setCursor(49,28);
          u8g2.print(t2);
          u8g2.drawCircle(62,3,1,U8G2_DRAW_ALL);
          u8g2.drawStr(63,13,"C");
          u8g2.drawStr(16, 28, "Hum:");
          u8g2.drawStr(62, 28, "%");
        }else{
          u8g2.setCursor(20,40);
          u8g2.print("Error"); //print 之前需要先设置光标
    
        }//加入DHT11连接错误的判断
        
        u8g2.setCursor(25,60);
        u8g2.print("Makers Go!");
    } while (u8g2.nextPage());

    errorFlag = 0; //标志位重置
}

激光雕刻步骤

  1. 对激光雕刻机进行调焦;

    如图所示:使得显示的光电在你所需要雕刻的位置上最亮。
  2. 下载激光雕刻机对于的应用(后序会发到干事群中)。
  3. 按照该应用上教程进行雕刻。
  4. 成果图:

IOT通讯了解(MQTT)

  1. 运行并上传进阶版代码(需要修改代码中的话题);
  2. 在mqtt x 上创建并加入主题

    点击其中的“+New Subscription"加入你所写入的话题,点击connect。
  3. 效果图:

1 个赞

如果大家在非校园网环境下尝试MQTT服务器连接,可以使用 mqtt.toufupi.top port:1883