目录
Version 1 —- 单显示屏( LCD1602A General)
Version 2—-双显示屏方案(LCD1602A I2C+ LCD1602A General)
一、Arduino nano
(一)PIN分析
- VIN是电源引脚(接+)
- GND是接地(接-)
- ANALOG是模拟引脚(模拟信号,可以输出和读取波形电压)
- DIGITAL式数字引脚(数字信号,即只有高电平和低电平)
- D13是一个测试引脚它自带一个LED灯名字叫L(用于快速测速板子bootloader是否正常安装)
(二)Blink程序(Arduino基本程序)分析
二、HIGH和LOW引脚的两种状态辨析
HIGH
(参考引脚)的含义取决于引脚(pin)的设置,引脚定义为INPUT或OUTPUT时含义有所不同。当一个引脚通过pinMode被设置为INPUT
,并通过digitalRead读取(read)时。如果当前引脚的电压大于等于3V,微控制器将会返回为HIGH
。 引脚也可以通过pinMode被设置为OUTPUT
,并通过digitalWrite设置为HIGH
。输入引脚的值将被一个内在的20K上拉电阻 控制 在HIGH上,除非一个外部电路将其拉低到LOW。 当一个引脚通过pinMode被设置为OUTPUT,并digitalWrite设置为HIGH时,引脚的电压应在5V。在这种状态下,它可以输出电流 。例如,点亮一个通过一串电阻接地或设置为LOW的OUTPUT属性引脚的LEDLOW
的含义同样取决于引脚设置,引脚定义为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) |
Arduino Uno 引脚 | <-> | DHT11 引脚 |
5V | <-> | VCC |
GND | <-> | GND |
Pin 13 | <-> | DATA |
Arduino Uno 引脚 | <-> | 蜂鸣器 引脚 |
5V | <-> | VCC |
GND | <-> | GND |
Pin 9 | <-> | I/O |
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制作一款温度传感器