基于Arduino Uno的温湿度传感器设计

目录

一、Arduino nano

(一)PIN分析

(二)Blink程序(Arduino基本程序)分析

二、HIGH和LOW引脚的两种状态辨析

三、UNO

四、接线图

五、代码部分

Version 1 —- 单显示屏( LCD1602A General)

Version 2—-双显示屏方案(LCD1602A I2C+ LCD1602A General)

五、IOT物联网方案(Esp8266实现)

Thinkspeak—-Matlab云端数据可视化分析


一、Arduino nano

(一)PIN分析

  • VIN是电源引脚(接+)
  • GND是接地(接-)
  • ANALOG是模拟引脚(模拟信号,可以输出和读取波形电压)
  • DIGITAL式数字引脚(数字信号,即只有高电平和低电平)
  • D13是一个测试引脚它自带一个LED灯名字叫L(用于快速测速板子bootloader是否正常安装)

(二)Blink程序(Arduino基本程序)分析

二、HIGH和LOW引脚的两种状态辨析

  1. HIGH(参考引脚)的含义取决于引脚(pin)的设置,引脚定义为INPUT或OUTPUT时含义有所不同。当一个引脚通过pinMode被设置为INPUT,并通过digitalRead读取(read)时。如果当前引脚的电压大于等于3V,微控制器将会返回为HIGH。 引脚也可以通过pinMode被设置为OUTPUT,并通过digitalWrite设置为HIGH。输入引脚的值将被一个内在的20K上拉电阻 控制 在HIGH上,除非一个外部电路将其拉低到LOW。 当一个引脚通过pinMode被设置为OUTPUT,并digitalWrite设置为HIGH时,引脚的电压应在5V。在这种状态下,它可以输出电流 。例如,点亮一个通过一串电阻接地或设置为LOW的OUTPUT属性引脚的LED
  2. LOW的含义同样取决于引脚设置,引脚定义为INPUT或OUTPUT时含义有所不同。当一个引脚通过pinMode配置为INPUT,通过digitalRead设置为读取(read)时,如果当前引脚的电压小于等于2V,微控制器将返回为LOW。 当一个引脚通过pinMode配置为OUTPUT,并通过digitalWrite设置为LOW时,引脚为0V。在这种状态下,它可以 !!!倒灌!!! 电流。例如,点亮一个通过串联电阻连接到+5V,或到另一个引脚配置为OUTPUT、HIGH的的LED。 数字引脚(Digital pins)定义,INPUT和OUTPUT
  • pinMode() //引脚的模式,step函数开头使用
    • void pinMode (uint8_t pin, uint8_t mode) //设置引脚的模式
    • 参数:
      • pin 引脚编号
      • mode: INPUT, OUTPUT, 或 INPUT_PULLUP.
  • digitalWrite() //写引脚的状态,也就是控制高低电压(LED亮,LED灭) 注意:!!!digital!!!
    • void digitalWrite (uint8_t pin, uint8_t value)
    • 参数
      • pin 参数:需要输出的引脚号。
      • value 参数:需要对应引脚输出的状态,value 只能是一个布尔值,也就是 0 和非 0。当 value 为 0 时,输出为 0V,当 value 为非 0 时,输出 5V。

三、UNO

有I2C模块引脚:

四、接线图

没有I2C整合的情况

LCD1602

电位器/PWN(有待测试)

Arduino Uno 引脚<->LCD1602 引脚
GND<->VSS
5V<->VDD
Pin 6(错误的带PWN功能的引脚会干扰lcd的正常工作)<->V0(用于控制显示屏对比度)
Pin 12<->RS
GND<->RW
Pin 11<->EN
Pin 5<->D4
Pin 4<->D5
Pin 3<->D6
Pin 2<->D7
3.3V<->BLA(A)
GND<->BLK(K)
DHT11
Arduino Uno 引脚<->DHT11 引脚
5V<->VCC
GND<->GND
Pin 13<->DATA
蜂鸣器
Arduino Uno 引脚<->蜂鸣器 引脚
5V<->VCC
GND<->GND
Pin 9<->I/O
LED
Arduino Uno 引脚<->LED引脚
Pin 8<->VCC/IN
GND<->GND

五、代码部分

LCD运行一段时间后出现乱码,已解决(4线接法,I2C模块还未测)

1.使用delaymicro(),疑似有效,通过在代码间设置微秒级别的延迟防止lcd读写忙导致数据丢失进而产生乱码

2.接线进行晃动测试,发现乱码问题并非线路接触不良

3.供电排查:v0不要使用pwn,会对lcd造成干扰,解决方法使用电位器串联5v实现降压同时又可以保证不会对lcd造成干扰,从而避免了乱码的问题

Version 1 —- 单显示屏( LCD1602A General)

#include<DHT.h>   //加载DHT的库
#include <LiquidCrystal.h> // 加载LCD1602的库

//定义LCD1602a
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;  // 定义引脚
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);   // 根据引脚,创建一个 lcd 实例
int contrast = 6; //   定义对比度控制引脚,这里需要选择有PWM功能的引脚

byte thisChar[8] = {
    0b00111,
    0b00101,
    0b00111,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
};


//定义DHT11
int dhtpin = 7;
DHT dht(dhtpin, DHT11);

//定义蜂鸣器
int buzzer = 9;

//定义LED
int led = 8;

void setup()
{
  //串口显示
	Serial.begin(9600); //设置波特率

  //LED启动配置
  pinMode(led,OUTPUT);

	//buzzer启动配置
	pinMode(buzzer, OUTPUT);

	//DHT11启动配置
	dht.begin();//让传感器开始工作

	//LCD启动配置
  
	pinMode(contrast, OUTPUT); // 配置 引脚模式为输出模式
	analogWrite(contrast, 120); // 该引脚一个固定频率的PWM信号,例如130
	lcd.begin(16, 2); //   初始化lcd ,并定义LCD1602的规格
  lcd.createChar(1, thisChar);
	lcd.setCursor(0, 0); //   设置指针 在x=0,y=0的位置
	lcd.print("Proton17   ^_^");  //   lcd 显示字符串
	lcd.setCursor(0, 1); //   设置指针 在x=0,y=1的位置
	lcd.print("ID:20050102"); //   lcd 显示字符串
	delay(5000);
	lcd.clear();
}

void loop() {
	int h = dht.readHumidity();//定义一个浮点数类型的变量,为传感器的湿度
	int t = dht.readTemperature();//定义一个浮点数类型的变量,为传感器的温度

	lcd.setCursor(0, 0);//显示在第1列,第1行
	lcd.print("Temperature:");//在显示屏上打印“温度是:”
	lcd.print(t);//在显示屏上打印温度值
  lcd.write(1);
	lcd.write("C");

	lcd.setCursor(0, 1);//显示在第1列,第2行
	lcd.print("  Humidity:");//在显示屏上打印“湿度是:”
	lcd.print(h);//在显示屏上打印湿度值
  lcd.write("%");
	if(t > 30 || h > 90){
    delay(1000);
  }
  else{
    delay(5000);
  }
	lcd.clear();

    //当温度大于30度或者湿度大于90的时候蜂鸣器报警,显示器给出相应警示
	if (t > 30 && h <= 90) {
        digitalWrite(led,HIGH);
        lcd.clear(); 
        digitalWrite(buzzer,HIGH);
        lcd.setCursor(0, 0);
        lcd.print("WARNING !!!");
        lcd.setCursor(0, 1);
        lcd.print("TOO HOT !");
        delay(3000);
	}
    else if(h > 90 && t <= 35){
        digitalWrite(led,HIGH);
        lcd.clear();   
        digitalWrite(buzzer,HIGH);
        lcd.setCursor(0, 0);
        lcd.print("WARNING !!!");
        lcd.setCursor(0, 1);
        lcd.print("TOO WET");
        delay(3000);
    }
    else if(h > 90 && t > 35){
        digitalWrite(led,HIGH);
        lcd.clear();   
        digitalWrite(buzzer,HIGH);
        lcd.setCursor(0, 0);
        lcd.print("WARNING !!!");
        lcd.setCursor(0, 1);
        lcd.print("TOO WET AND HOT !");
        delay(3000);
    }
    else{
        digitalWrite(led,LOW);
        digitalWrite(buzzer,LOW);
    }

    lcd.clear();

	//串口输出部分
	Serial.print("Humidity: ");
	Serial.print(h);
	Serial.print(" %\t");
	Serial.print("Temperature: ");
	Serial.print(t);
	Serial.print(" *C ");
	Serial.println(); //输入一个换行符

}

Version 2—-双显示屏方案(LCD1602A I2C+ LCD1602A General)

ADDRESS的寻找 Arduino实践(二)lcd1602使用说明,源码,寻找IIC

商家:0x27

#include<DHT.h>   //加载DHT的库
#include <LiquidCrystal.h> // 加载LCD1602的库
#include <LiquidCrystal_I2C.h>//调用LCD1602 I2c显示屏的库

//定义LCD1602a I2C
LiquidCrystal_I2C lcd_1(0x27, 20, 4);//将 LCD 地址设置为???,用于 16 个字符和 2 行显示,ADDRESS

//定义LCD1602a General
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;  // 定义引脚
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);   // 根据引脚,创建一个 lcd 实例

//定义°这个符号默认字库中没有
byte thisChar[8] = {
    0b00111,
    0b00101,
    0b00111,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
    0b00000,
};


//警报温度和湿度的修改
const int W_Ham = 65;
const  int W_Temp = 29;


//定义DHT11
int dhtpin = 10;                      //定义一个int类型的
DHT dht(dhtpin, DHT11);              //利用DHT这个类(class)创建一个对象名字叫dht,C++面对对象(这个创建过程叫实例化)部分

//定义蜂鸣器
int buzzer = 9;

//定义LED
int led = 8;

void setup()
{
    //当看见xxx.xx()是代表调用的是方法,.是成员运算符,作用是可以是访问类中的成员函数或者成员变量(访问成员变量这里没有出现)



    //串口显示
    Serial.begin(9600);             //设置波特率,对应IDE中的设置,串口监视器中可以看到目前的波特率

                                    /*方法:类中的成员函数。为什么我没有看到
                                    Serial的实例化过程却可以使用它对应的方法,这是因为Serial是一个内置对象
                                    (Arduino已经为我们实例化了)*/

    //LED启动配置
    pinMode(led, OUTPUT);           //pinMode()是Arduino的内置函数,意为设置对应编号引脚的模式

    //buzzer启动配置
    pinMode(buzzer, OUTPUT);

    //DHT11启动配置
    dht.begin();                    //让DHT11传感器开始工作,语句为调用dht这个对象begin()这个方法

    //LCD启动配置
  

    lcd.begin(16, 2);               //初始化lcd ,并定义LCD1602的规格,调用lcd这个实例的begin()方法
    lcd.createChar(1, thisChar);    //初始化字库中没有的字符,调用lcd实例的createChar()方法

    //LCD_1启动配置,这个LCD和上面的LCD不是一块屏幕
    lcd_1.backlight();              //打开显示屏背光灯,调用lcd_1这个实例的backlight()方法
    lcd_1.init();                   //初始化液晶屏,调用lcd_1这个实例的init()方法
    lcd_1.begin(16, 2);             //设置行列值,调用lcd_1这个实例的begin()方法,后面类似
    lcd_1.setCursor(0, 0);          //设置输入光标位置这个(0,0)可以将显示屏理解成二维数组,从0开始(不理解不看)
    lcd_1.print("Proton17   ^_^");  //打印名字
    lcd_1.setCursor(0, 1);          //设置光标位置
    lcd_1.print("ID:20050102");      //打印一卡通号
}

void loop() {
  int h = dht.readHumidity();//定义一个浮点数类型的变量,为传感器的湿度
	int t = dht.readTemperature();//定义一个浮点数类型的变量,为传感器的温度

	lcd.setCursor(0, 0);//显示在第1列,第1行
  delayMicroseconds(1);
	lcd.print("Temperature:");//在显示屏上打印“温度是:”
  delayMicroseconds(1);
	lcd.print(t);//在显示屏上打印温度值
  delayMicroseconds(1);
  lcd.write(1);
  delayMicroseconds(1);
	lcd.write("C");
  delayMicroseconds(1);

	lcd.setCursor(0, 1);//显示在第1列,第2行
  delayMicroseconds(1);
	lcd.print("  Humidity:");//在显示屏上打印“湿度是:”
  delayMicroseconds(1);
	lcd.print(h);//在显示屏上打印湿度值
  delayMicroseconds(1);
  lcd.write("%");
  delayMicroseconds(1);

	if(t > W_Temp || h > W_Ham ){
    delay(500);
  }
  else{
    delay(1500);
  }
	lcd.clear();

    //当温度大于29度或者湿度大于65的时候蜂鸣器报警,显示器给出相应警示
	if (t >  W_Temp && h <= W_Ham ) {
        digitalWrite(led,HIGH);
        lcd.clear(); 
        digitalWrite(buzzer,HIGH);
        lcd.setCursor(0, 0);
        delayMicroseconds(1);
        lcd.print("WARNING !!!");
        delayMicroseconds(1);
        lcd.setCursor(0, 1);
        delayMicroseconds(1);
        lcd.print("TOO HOT !");
        delay(1500);
        lcd.clear();
	}
    else if(h > W_Ham && t <=  W_Temp){
        digitalWrite(led,HIGH);
        lcd.clear();
        delayMicroseconds(1);
        digitalWrite(buzzer,HIGH);
        lcd.setCursor(0, 0);
        delayMicroseconds(1);
        lcd.print("WARNING !!!");
        delayMicroseconds(1);
        lcd.setCursor(0, 1);
        delayMicroseconds(1);
        lcd.print("TOO WET");
        delay(1500);
        lcd.clear();
    }
    else if(h > W_Ham && t >  W_Temp){
        digitalWrite(led,HIGH);
        lcd.clear();   
        digitalWrite(buzzer,HIGH);
        lcd.setCursor(0, 0);
        delayMicroseconds(1);
        lcd.print("WARNING !!!");
        delayMicroseconds(1);
        lcd.setCursor(0, 1);
        delayMicroseconds(1);
        lcd.print("TOO WET AND HOT !");
        delayMicroseconds(1);
        delay(1500);
        lcd.clear();
    }
    else{
        digitalWrite(led,LOW);
        digitalWrite(buzzer,LOW);
	      lcd.clear();
    }                   


    //串口输出部分,随便看看
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.print(" *C ");
    Serial.println();                //输入一个换行符

}

五、IOT物联网方案(Esp8266实现)

Arduino IOT: Temperature and Humidity ( With ESP8266 WiFi)

Thinkspeak—-Matlab云端数据可视化分析

如何使用ThingSpeak和Arduino制作一款温度传感器

API Keys - ThingSpeak IoT

ESP8266 IOT Using Arduino and ThingSpeak : 5 Steps

GitHub - mathworks/thingspeak-arduino: ThingSpeak Communication Library for Arduino, ESP8266 and ESP32

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值