arduino入门-用arduino uno制作基于蓝牙的数据监控系统

Posted 工大小蒋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arduino入门-用arduino uno制作基于蓝牙的数据监控系统相关的知识,希望对你有一定的参考价值。

arduino入门-用arduino uno制作基于蓝牙的数据监控系统

一、前言

本文章所制作装置是一个以arduino uno为核心的、基于蓝牙的数据监控系统,其中涵盖包含(1)对舵机的控制(2)读取电位器电压信号(3)蓝牙串口通讯(4)oled显示 四部分内容,仅供教学以及实验使用,不深入探究实用价值。
上文所提及四部分内容单独链接:
(1)对舵机的控制
arduino控制舵机缓慢旋转90°

(2)读取电位器电压信号
arduino读取电压相对值(模拟读取传感器数值)

(3)蓝牙串口通讯
arduino完成两个HC-05蓝牙模块间的配对,实现简单的无线串口通讯

(4)oled显示
arduino控制.96寸oled显示图案、中英文文字、以及变量

一、准备工作

需要准备的材料有:arduino uno、电位器一个、HC-05蓝牙模块两个、舵机一个、0.969寸oled显示屏一个、面包板一个、usb转ttl串口模块一个、杜邦线若干
需要准备的软件:串口调试助手

二、接线图

总接线图如下图所示:

接线图略显复杂,但是其实大部分都是正负极的接线,若把正负极去掉,既可以简单明了的看出接线的规则:

传感器接口单片机接口
蓝牙 RXarduino TX
蓝牙 TXarduino RX
电位器信号口arduno A1引脚
舵机信号口arduino 9号引脚
oled SCLarduino A5引脚
oled SDAarduino A4引脚

即:

三、数据监控系统代码

代码为前言提到的四个部分代码的组合,可以阅读其四个部分的文章了解详情。
代码如下:

#include <U8g2lib.h>                       //u8g2库
#include <Servo.h>                         //舵机库
Servo myservo;                             //定义舵机命名其为myservo
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,SCL,SDA);   //配置构造函数      
int a=10;                                  //定义变量a代表传感器数值

void setup() 

    u8g2.begin();                          //启动u8g2驱动程序
    myservo.attach(9);                     //设置舵机控制引脚为9号 
    rotation(5);                           //舵机旋转至5°
    face();                                //显示logo
    delay(1000);                           //显示logo持续一秒钟
    Serial.begin(9600);                    //打开串口,设置波特率9600

 
void loop() 

    a=analogRead(A1);                      //读取电位器数值,模拟传感器数据,将其值赋给变量b
    Serial.println(a);                     //将b在串口中打印,(从而通过蓝牙传输到电脑中)
    if(a>900)                              //如果传感器数值大于阈值900,则舵机旋转115°(模拟警报动作)
    
        rotation(120);                     //舵机旋转至120°
    
    else
    
        rotation(5);                       //小于阈值,则舵机旋转至5°
    
    letter(a);                             //显示变量数值 



void face()

    u8g2.clearBuffer();                                    //清空显示屏缓存
    
    u8g2.drawCircle(56,40,8,U8G2_DRAW_LOWER_LEFT);         //画四分之一圆,圆心坐标(56,44),半径8
    u8g2.drawCircle(56,40,8,U8G2_DRAW_LOWER_RIGHT);        //画四分之一圆
    u8g2.drawCircle(72,40,8,U8G2_DRAW_LOWER_LEFT);         //画四分之一圆
    u8g2.drawCircle(72,40,8,U8G2_DRAW_LOWER_RIGHT);        //画四分之一圆
    u8g2.drawCircle(56,41,8,U8G2_DRAW_LOWER_LEFT);         //加粗画四分之一圆
    u8g2.drawCircle(56,41,8,U8G2_DRAW_LOWER_RIGHT);        //加粗画四分之一圆
    u8g2.drawCircle(72,41,8,U8G2_DRAW_LOWER_LEFT);         //加粗画四分之一圆
    u8g2.drawCircle(72,41,8,U8G2_DRAW_LOWER_RIGHT);        //加粗画四分之一圆
    u8g2.drawLine(40,18,20,30);                            //画斜线,两端点坐标分别是(40,18)(20,30)
    u8g2.drawLine(88,18,108,30);                           //画斜线
    u8g2.drawLine(40,17,20,29);                            //加粗画斜线
    u8g2.drawLine(88,17,108,29);                           //加粗画斜线
    
    u8g2.sendBuffer();                                     //加载以上内容


  void letter(int a)
   
    u8g2.clearBuffer();                                    //清空显示屏缓存
    
    //int8_t a=u8g2.getMaxCharHeight();                      //获取最大高度
    //int8_t b=u8g2.getMaxCharWidth();                       //获取最大宽度
    
    u8g2.setFont(u8g2_font_unifont_t_chinese2);            //设置字体
    u8g2.drawUTF8(20,17,"智能检测系统");                    //显示文字,左下角位置坐标为(20,17)
    u8g2.drawUTF8(50,34,":");                             //显示:,左下角坐标为(50,34)
    u8g2.drawUTF8(0,34,"位移为:");
    u8g2.setCursor(64,34);                                 //设置将要打印变量的左下角坐标
    u8g2.drawUTF8(0,34,"位移为:");
    u8g2.print(a);                                         //打印变量a
     
    u8g2.sendBuffer();                                     // 加载以上内容
  

void rotation(int angle)                //舵机旋转函数,输入目标角度angle

  int anglex=myservo.read();          //读取舵机实际角度,将其值赋给anglex
    if(angle>anglex)                    //如果实际角度小于目标角度,则逐渐增大角度至目标角度为止
    
        for(int i=anglex;i<angle;i++)
        
          myservo.write(i);   
            delay(15);
         
    
    else if(angle<anglex)               //如果实际角度大于目标角度,则逐渐减小角度至目标角度为止
    
        for(int i=anglex;i>angle;i--)
        
          myservo.write(i);  
            delay(15); 
        
      

四、系统调试

**常见问题
(1)设置完毕蓝牙扔无法配对:
解决方法:
首先确保蓝牙配置正确,即量蓝牙密码相同、地址已设置、波特率一致
若配置正确,则假设使用到的蓝牙分别为A和B,先对A进行断电重启,等待数秒,查看是否配对成功;若不成功则对B进行断电重启,等待数秒直至配对成功。
(2)arduino上传出错
先拔掉蓝牙两根数据线再进行上传即可
(3)oled不亮
arduino断电重启等待数秒

调试完毕后可以实现如下功能:
(1)开机显示logo图案一秒钟
(2)旋转电位器,可以看到oled上的数值动态变化
(3)数值大于900,则舵机转到120°位置
(4)数值小于900,舵机自动旋转回5°原点位置
(5)打开串口通讯助手,可以看到数值同步通过蓝牙传输到电脑当中(可以编写电脑程序来对传输来的数据进行监控、分析以及处理)
调试完毕后效果如下:
启动效果:

启动完毕:

旋转电位器:

蓝牙通讯:

以上是关于arduino入门-用arduino uno制作基于蓝牙的数据监控系统的主要内容,如果未能解决你的问题,请参考以下文章

为啥arduino uno只能保留两位小数

用 Arduino Uno 给 Arduino Mini(Pro)烧录程序

arduino uno和arduino mini 有啥不同?

从0 开始 DIY你的Arduino UNO

Arduino UNO 利用74HC164循环显示(0-F)

用Proteus仿真Arduino UNO ADC模数转换