首页 > 其他分享 >基于Arduino Uno的温湿度传感器设计

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

时间:2024-11-28 11:01:22浏览次数:8  
标签:引脚 int 温湿度 Arduino lcd print Serial 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

标签:引脚,int,温湿度,Arduino,lcd,print,Serial,Uno
From: https://blog.csdn.net/Proton17/article/details/144095345

相关文章

  • Arduino开发环境搭建
    目录Arduino 开发环境搭建1. 开发方式的选择2.环境搭建2.1Arduino IDE软件安装包下载2.2Arduino IDE软件安装2.3 认识Arduino IDE2.4Arduino-esp32库介绍2.5 安装arduino-esp32库安装方式一:使用ArduinoIDE的开发板管理器来安装安装方式二:离......
  • ESP32 TWAI CAN Arduino库驱动小米电机(CyberGear微电机)
    前言鉴于项目要使用小米电机,并且要使用esp32上自带的CAN库来控制,但是没有找到合适的、能用的库,只能从现有STM32小米电机控制库的基础上进行修改。为了方便快速实现,采用Arduino的平台对esp32进行编程,对应需要修改成Arduino的库一、前置任务CAN通信基础ESP32自带CAN控制器—TW......
  • EPS32+DHT11温湿传感器+OLEAD显示屏整合MicroPython实现温湿度读取并显示 - 幽络源
    环境需求Python版本大于等于3.8、Thonny软件、EPS32已烧录MicroPython固件,可参考上一篇文章 ESP32初学教程Python版-从环境搭建到完成控制LED灯闪烁硬件需求EPS32开发板、DHT11的温湿度传感器、OLEAD显示屏、杜邦线、安卓数据线引脚连接DHT11温湿度传感器连接ESP32使用......
  • 基于51单片机温湿度、烟雾浓度、人体检测报警
    基于51单片机智能环境监测(仿真+程序+原理图+设计报告)功能介绍具体功能:1.使用DHT11检测温湿度,MQ-2与ADC0832模数转换器检测烟雾,HC-SR501检测人体;2.LCD1602显示温湿度、烟雾信息;3.按键设定温湿度上下限、烟雾上限值,打开/关闭人体检测;4.超过设定范围发生对应的声光报警;5.......
  • 如何快速下载Suno AI平台上的音乐歌曲?保存为MP3格式
            如果你在最近火出圈的SunoAI平台上听到比较喜欢的歌曲,并想要下载到自己的手机电脑上,遗憾的是,SunoAI平台本身并不直接提供下载歌曲MP3的方法。SunoAI怎么下载其他人的音乐到本地?SunoAI获取歌曲直链,充实你的mp3?SunoAI上的歌很好听,我想下载到手机上,怎么下......
  • AI编程Arduino单片机点亮WS2812灯带彩虹灯效
    引言随着物联网(IoT)和智能家居的迅速发展,LED灯带因其灵活性和多样的显示效果,广泛应用于装饰、广告、舞台等多个领域。WS2812作为一种智能可控的LED灯带,以其独立控制、丰富的色彩和高亮度,成为众多开发者的首选。而在控制WS2812灯带的过程中,编写高效、稳定的单片机代码至关重要。......
  • 《ESP32从0到1》收官篇:wifi版温湿度蓝牙网关
            文章内容:以“wifi版温湿度蓝牙网关”这一具体项目为载体,对《ESP32从0到1》专辑前面所有内容的整合练习。        本篇设定为VIP可见,未开通VIP的可移至如下链接,每个组件功能之前均有单独发布,且涉及到的源码也已上传,可自行下载。《ESP32从0到1》快速......
  • 单色LED灯 Arduino
    单色LED灯1.LightEmittingDiode/发光二极管,简称LED。它是一种能够发出单一颜色光的半导体设备。它由PN结构成的,当电流通过时,电子与空穴复合,释放能量以形成光。单色LED的颜色取决于发光材料的能带结构,常见的颜色有红色、绿色、蓝色和黄色LED的优点包括:高能效:消耗较少电......
  • Arduino UNO R3自学笔记24 之 Arduino如何使用MAX7219控制多个数码管?
    注意:学习和写作过程中,部分资料搜集于互联网,如有侵权请联系删除。前言:前面学习了单个数码管的控制,但是在大多场合一个数码管是满足不了使用场景的,因此对于数码管的学习,应该学会用尽可能少的端口去驱动更多的数码管,在此情况下,MAX7219比较适合我们使用。1.MAX7219引脚及功能介绍......
  • 基于Arduino的超声波和舵机模块集成使用
    一.超声波模块和舵机模块集成使用超声波模块:HC-SR04舵机模块:SG90目的:通过ArduinoUNO核心板控制舵机旋转到不同位置,同时获取不同位置超声波模块和障碍物间的距离,配合控制算法,进行基于超声波智能避障小车的制作。二.源代码#include<Servo.h>#definetrigPin2#define......