从Ardiuno到物联网——记录一次Blynk的完全部署过程

这是记录关于我个人折腾Ardiuno UNO单片机和blynk的过程

本次制作的是一个可控灯、和远程LCD屏幕背光控制以及室内温湿度气象站的智能家居设备

通过这次的实际操作经历,也让我深入的体会到物联网的强大,以及万物互联的无限潜能

前言

说到物联网这个词,那么我们可以用四个字来概括一下,那就是——万物互联

说到万物互联,那么离我们最近的是什么呢?那就是智能家居

而单片机就是我们自己来开发属于自己物联网和智能家居设备的最好工具,科技的进步起源于折腾,那么事不宜迟,一起来折腾吧~

我是分割线

先来看看效果吧

实物照片,因为线缆比较多,所以看上去比较凌乱

由这台设备采集下来一个小时内的温湿度数据

手机控制中心这里我采用了非对称式设计的UI,看起来应该还不错吧233

在图中,用到的设备有如下

  • Ardiuno UNO开发板
  • LCD 1602
  • 角度传感器(这玩意我感觉不就是是个电位器吗= =....)
  • 红色食人鱼LED灯
  • DHT22温湿度传感器
  • 一根USB Type B线缆

在这里顺带提一下,这次折腾使用的器材都是我们学校的,在这里对提供给我们器材的学校表示感谢

正文开始

其实关于单片机的开发,我也是最近这半个月才开始真正意义上的折腾(从头开始学习)

在这方面上也遇上了很多比较麻烦的地方,比如说语言方面,这东西用的是c,而我比较常用的是java和php,不过好在这两个东西和c语法比较接近,也就没去学直接干,于是乎语言方面就这么先草草解决

然后是lcd屏幕的问题....不知道是屏幕的问题还是DF官方教程的问题,反正屏幕无法通讯,浪费了不少时间,用l2c检测代码都测不出来设备存在

最后去csdn上面上翻,看到上面说两根通讯引脚可以接在A4和A5上,然后就抱着试试看的心态插上去,结果能用了....这就离谱

但是也就是能用而已,输出屏幕的函数是有Bug的...很生草,只能显示该语句绘制的第一个字符

然后去网上查了一下,用一个自定义的函数直接绕开了事....

还有些别的,在下面慢慢说吧

接线

LCD 1602

  • vcc 5v
  • GND GND
  • SCL A5
  • SDA A4

DHT 22 接到 D2

角度传感器接到 A0

红色食人鱼LED接到 D10

代码

注意,如果你使用Ardiuno IDE,请确保你的电脑是win10系统,否则编译速度会

非常非常非常非常非常慢

非常非常非常非常非常慢

非常非常非常非常非常慢

这不是在开玩笑,是真的很慢.......

#include <dht11.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x20, 16, 2); //设置LCD的地址为0x20,可以设置2行,每行16个字符
//lcd1602连线
//SCL A5
//SDA A4

#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);

/* 声明物联网引用*/
#define BLYNK_PRINT DebugSerial
#include <SoftwareSerial.h>
SoftwareSerial DebugSerial(2, 3); // RX, TX
#include <BlynkSimpleStream.h>
char auth[] = "WH65kYz8ycqJcGn44s3Q6MxlZov5oton";

//LED

int potPin = 0;                   //电位器连接到模拟0
int ledPin = 10;                  //LED连接到数字10

void setup() {
  lcd.init();                 // LCD初始化设置
  lcd.backlight();           // 打开LCD背光

  lcd.setCursor(0, 0);               //设置显示指针
  MyPrintLCD("Hello, MoeWorld");     //输出字符到LCD1602上
  lcd.setCursor(0, 1);
  MyPrintLCD("By MoeSakura");
  lcd.setCursor(0, 0);
  delay(1000);

  lcd.init();
  //串口输出”Type, status, Humidity(%), Temperature(C)”

  lcd.print("Humidity(%): ");    //LCD屏显示” Humidity(%):”
  lcd.setCursor(0, 1);            //光标移到第2行,第一个字符
  lcd.print("Temp(C): ");         //LCD屏显示”Temp(C):”

  dht.begin();

  //LED
  pinMode(ledPin, OUTPUT);
  
  //物联网初始化
  // Debug console
  DebugSerial.begin(9600);

  // Blynk will work through Serial
  // Do not read or write this serial manually in your sketch
  Serial.begin(9600);
  Blynk.begin(Serial, auth);
}

void loop() {

  //读取传感器
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  //LCD显示温湿度值
  lcd.setCursor(12, 0);
  MyPrintLCD((String)h);
  lcd.setCursor(8, 1);
  MyPrintLCD((String)t);

  //LED
   int sensorValue = analogRead(potPin);    //读取模拟口0的值      
  //通过map()把0~1023的值转换为0~255
  int outputValue = map(sensorValue,0, 1023, 0, 255);   
  analogWrite(ledPin,outputValue);   //给LED写入对应值        
  int outputValue1 = map(sensorValue,0, 1023, 0, 100);   
  
  Blynk.run();
  //发送给app
  Blynk.virtualWrite(V0, t);
  Blynk.virtualWrite(V1, h);
  Blynk.virtualWrite(V4, sensorValue);
  Blynk.virtualWrite(V5, outputValue1);

  delay(500);
}

//从服务器获取数据
BLYNK_WRITE(V2) //Button Widget is writing to pin V2
{
  int pinData = param.asInt();
  if (pinData == 1)
  {
    lcd.backlight();
  }
  else
  {
    lcd.noBacklight();
  }
}

//字符输出修复
void MyPrintLCD(String MyString)
{
  for (int i = 0; i < MyString.length(); i++)
    lcd.write(MyString.charAt(i));
}

大家如果想要自己来玩的话可以把这个烧进主板去就好了

库的安装

在这里用到了I2C,DHT22和blynk的支持库

前面两个可以在DFrobot的官方论坛上面搜索找到,也蛮好找的

Blynk可以在Ardiuno的内置库管理里找到,不过建议直接取github上面下载打包好的库然后手动安装

https://github.com/blynkkk/blynk-library

请下载0.6.9版本而不是1.0.0,否则会无法通过编译

当初我在这里卡在浪费了好久的时间.....纯粹是被官方给坑了....

在这里注意一下库的安装地址,直接ide安装的话库在你的文档目录下

而手动安装的下请放在ide同目录的libraries目录下

搭建blynk服务器

你没看错....我一上来就直接自建服务器

Github地址:

https://github.com/blynkkk/blynk-server

然后扔到一个目录下面,然后用新建一个bat,用下面的代码来启动它

@echo off
title 空梦云 Blynk服务端
echo 即将启动Blynk服务端
pause
java -jar server-0.41.16.jar -dataFolder Blynk_DATA
pause

后来我去看了下这玩意的官方文档,这玩意不支持Mysql...可以洗洗睡了

注意!管理员密码只会在第一次启动时出现,请妥善保存!

客户端

首先你需要下个Blynk

为了防止出现什么奇奇怪怪的问题,我是直接去Google paly(需要科学上网)下的

大家如果上不去的话可以去尝试一下国内的下载站的能不能用

部分内容转载来源声明

注意,这里的图片和部分文本内容来自https://www.jianshu.com/p/540347299a37

因为懒得自己截图....懒癌发作(

登录

先注册个账户

配置自己服务器地址

也就是说app-后台-单片机要在一个局域网下哦,当然你可以搭在有外网ip的服务器下(或者可以通过FRP映射)

点击中间的开关到右边

然后下面的两个编辑框,左边为ip后边为端口(默认为9443)

照着改成你自己的

登录进入

点击上面的二维码图标(别管那个箭头)

克隆工程

然后扫描下面这个二维码,克隆我的工程

然后点击这个复制token,或者你配置了邮件也可以点击左边发送邮件

修改token

在代码中有这么一行

char auth[] = "WH65kYz8ycqJcGn44s3Q6MxlZov5oton";

把引号里的东西全部删掉,然后换成你的token重新烧写上传就ok了

是时候该让你的单片机连上网了!

还记得上面提到的那个blynk库的位置吗

打开它

找到图里的这个文件,然后右键编辑

这几行对着改成你自己的

set COMM_PORT=串口号
set COMM_BAUD=9600
set SERV_ADDR=服务器ip
set SERV_PORT=8080

注意blynk通讯的服务端口是8080不是9443....当初我被这玩意给搞纳闷了好久,就是连不上

然后插上你的单片机,然后双击这个文件

不出意外的话你就已经成功的能从手机上看到这个东西的数据啦~

操作说明

点击开启按钮可以打开/关闭LCD屏

选择模拟角度传感器可以调节LED亮度,并且同时你也可以在手机上看到读数(角度和LED亮度)

值得注意的是,为了减轻主板负担,代码里设置的是0.5s提交/检测一次数据

也就是说你转了一下模拟角度传感器你要稍微等下才会有反应....

最后

有了这次经历之后,我也只想感慨一句:亲手直接来搭建一个物联网平台的感觉和直接用现成的果然是截然不同的

因为时间有限,没法写出更详细的过程

看到了这里,不知道你是不是也跃跃欲试了呢?

其实从这里能延伸出来的东西也有很多,比如说搭配红外发射器来实现远程空调的开关,或者接上一个USB台灯来实现晚上的远程路灯开关

在这里再次祝大家端午节快乐!也祝大家如果感兴趣也能够在将来自己来亲手试一试

最后感谢学校和老师对我们创客项目和社团的大力支持以及物质上的帮助

也同样感谢各位的阅读!谢谢大家

点赞

赞助商广告

如果您的网络和设备条件允许,这里可能会显示来自Google和其他赞助商的广告

  1. 纯之说道:
    Google Chrome Windows 10/11
    膜拜大佬。。。话说现在的物联网确实挺丰富的,小米的米家就做的很成熟。还有图片链接貌似挂了哦。。。
    1. 晓空说道:
      Google Chrome Windows 10/11
      图片现在补上了 :huaji13:
      感谢提醒
      米家的小爱同学我感觉也是蛮香的233 :huaji19:
  2. Magma说道:
    Google Chrome Windows 10/11
    还是有图片404 :huaji13:

    > java -jar server-0.41.16.jar -dataFolder Blynk_DATA
    MC服务器既视感 :huaji12:
    1. 晓空说道:
      Google Chrome Windows 10/11
      图片嘛...之前图床出了点问题只能等学考完了再补 :huaji12:
      至于mc服务器既视感..... :huaji13:
      >java -jar minecraft_server.jar -xmx 1024 -xms 1024 :huaji8:

发表回复

电子邮件地址不会被公开。必填项已用 * 标注