Arduino Uno零基础入门学习笔记——智能时钟(可以显示温湿度)【LCD1602+DS1302+温湿度传感器+红外接收器+LED+蜂鸣器】

一、电路连接

需要以下几个外设

  1. LCD1602(IIC驱动)
  2. DS1302
  3. 1-WIRE温湿度检测器
  4. 红外接收器
  5. 遥控器
  6. 两个LED(一红一蓝)
  7. 蜂鸣器

LCD1602IIC

LCD1602IIC引脚Arduino引脚
VCC5V
GNDGND
SDAA4
SCLA5

我这里的LCD1602是IIC的,所以只需要4根线

在这里插入图片描述

1-WIRE温湿度检测器

传感器引脚Arduino引脚
-GND
S8
+5V

在这里插入图片描述
中间的线是要接5V的

红外接收器

红外接收器引脚Arduino引脚
-GND
+5V
S11

在这里插入图片描述

DS1302

DS1302引脚Arduino引脚
VCC5V
GNDGND
RSTA0(14)
DATA1(15)
SCKA2(16)

在这里插入图片描述

蜂鸣器

蜂鸣器引脚Arduino引脚
-GND
+5V
I/O5

在这里插入图片描述

LED

LED引脚Arduino引脚
红色LED6
蓝色LED7

在这里插入图片描述

二、程序

这里需要下载4个库:

  • dht11
  • LiquidCrystal_I2C
  • IRremote
  • DS1302

我把他们都传到我的Github里面了:SmartClock
程序里面的红外遥控器是按任何一个按键都可以切换模式,因为我这个遥控器的解码有点问题,可能是这个库的时序问题,大家可以自己个性化自己的按键,改一下就能用了

功能简介

LCD1602屏默认显示温度和湿度,在按下遥控器任何一个按键时,LCD1602屏显示时间,再按下显示温度和湿度。温度湿度还有时间数据都会在串口打印出来,方便调试。在温度高于一定阈值之后,亮红灯,在湿度低于一定阈值后,亮蓝灯。时钟到设定的时间后,蜂鸣器叫10声。

#include <dht11.h>   //引用dht11库文件,使得下面可以调用相关参数
#include <Wire.h> 
#include <LiquidCrystal_I2C.h> //引用I2C库
#include <DS1302.h>
#include<IRremote.h>

#define dht11Pin 8   //定义温湿度针脚号为8号引脚
#define ledBlue 6 //定义湿度阈值灯为6号引脚
#define ledRed 7 //定义温度阈值灯为7号引脚
#define beep 5 //定义蜂鸣器为5号引脚
dht11 dht;    //实例化一个对象
char buf1[50];
char buf2[50];
LiquidCrystal_I2C lcd(0x27,16,2); //这里是0x27
DS1302 rtc(14, 15, 16); //对应DS1302的RST,DAT,CLK
int RECV_PIN = 11;   //红外线接收器OUTPUT端接在pin 11
int Keynum=1;
IRrecv irrecv(RECV_PIN);   // 定义IRrecv 对象来接收红外线信号
decode_results results;   //解码结果放在decode_results构造的对象results里

void initRTCTime(void)//初始化RTC时钟
{
  rtc.writeProtect(false); //关闭写保护
  rtc.halt(false); //清除时钟停止标志
  Time t(2022, 12, 19, 16, 25, 50, 4); //新建时间对象 最后参数位星期数据,周日为1,周一为2以此类推
  rtc.time(t);//向DS1302设置时间数据
}
void printTime()//打印时间数据
{
  Time tim = rtc.time(); //从DS1302获取时间数据
  
  snprintf(buf1, sizeof(buf1), "%04d-%02d-%02d ",
           tim.yr, tim.mon, tim.date
           );
  snprintf(buf2, sizeof(buf2), "%02d:%02d:%02d",
           tim.hr, tim.min, tim.sec);

  Serial.println(buf1);
  Serial.println(buf2);

}
void setup()    //初始化函数,只执行一次
{
  Serial.begin(9600);      //设置波特率参数
  pinMode(dht11Pin, OUTPUT);    //通过定义将Arduino开发板上dht11Pin引脚(8号口)的工作模式转化为输出模式
  pinMode(ledBlue, OUTPUT);
  pinMode(ledRed, OUTPUT);
  pinMode(beep, OUTPUT);

  lcd.init();                  // 初始化LCD
  lcd.backlight();             //设置LCD背景等亮
  initRTCTime();
  irrecv.enableIRIn(); //    启动红外解码
  delay(2000);
}

void loop()     //loop函数,重复循环执行
{
  
  if (irrecv.decode(&results)!=0)  
  {        
      delay(500);
      Keynum++;
      delay(500);
      lcd.clear();
      if(Keynum>=3)
      {
        Keynum=1;
      }
      irrecv.resume();
  }
  switch(Keynum)
  {
    case 1:  SerialTem();ther();TemJudge();alarm();break;
    case 2:  printTime();TemJudge();
            Time tim = rtc.time(); //从DS1302获取时间数据
            lcd.setCursor(0,0);
            lcd.print(buf1);
            lcd.setCursor(0,1);
            lcd.print(buf2);
            alarm();
            break;
    default: break;
  }   
}
void ther()//温湿度计
{
  int tol = dht.read(dht11Pin);    //将读取到的值赋给tol
  int temp = (float)dht.temperature; //将温度值赋值给temp
  int humi = (float)dht.humidity; //将湿度值赋给humi

  lcd.setCursor(0,0);
  lcd.print("Tem:");
  lcd.setCursor(4,0);
  lcd.print(temp);
  lcd.setCursor(6,0);
  lcd.print("C");

  lcd.setCursor(0,1);
  lcd.print("Hum:");
  lcd.setCursor(4,1);
  lcd.print(humi);
  lcd.setCursor(6,1);
  lcd.print("%");
}
void TemJudge()
{
  int tol = dht.read(dht11Pin);    //将读取到的值赋给tol
  int temp = (float)dht.temperature; //将温度值赋值给temp
  int humi = (float)dht.humidity; //将湿度值赋给humi
  if(temp>=20)//假如温度高于20度亮红灯
  {
    digitalWrite(ledBlue,HIGH);
  }
  else digitalWrite(ledBlue,LOW);
  if(humi>=34)//假如湿度高于34%亮蓝灯
  {
    digitalWrite(ledRed,HIGH);
  }
  else digitalWrite(ledRed,LOW);

}
void alarm()
{
  digitalWrite(beep,HIGH);
  int alarm_hr=16;//设置闹钟小时
  int alarm_min=26;//设置闹钟分钟
  int alarm_sec=0;//设置闹钟秒
    Time tim = rtc.time(); //从DS1302获取时间数据
  
  snprintf(buf2, sizeof(buf2), "%02d:%02d:%02d",
           tim.hr, tim.min, tim.sec);
  if((tim.hr==alarm_hr)&&(tim.min==alarm_min)&&(tim.sec==alarm_sec))
  {
    for(int i=0;i<20;i++)
    {
    digitalWrite(beep,LOW);
    delay(100);
    digitalWrite(beep,HIGH);
    delay(100);
    }
  }
}
void SerialTem()//串口打印温度湿度
{
  int tol = dht.read(dht11Pin);    //将读取到的值赋给tol
  int temp = (float)dht.temperature; //将温度值赋值给temp
  int humi = (float)dht.humidity; //将湿度值赋给humi
  Serial.print("Temperature:");     //在串口打印出Tempeature:
  Serial.print(temp);       //在串口打印温度结果
  Serial.println(".C");    //在串口打印出℃
  Serial.print("Humidity:");     //在串口打印出Humidity:
  Serial.print(humi);     //在串口打印出湿度结果
  Serial.println("%");     //在串口打印出%  
}

三、效果

请添加图片描述

  • 18
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
好的,这是一个关于Arduino Uno和ESP-01S模块的项目,主要用于接收DHT11温湿度传感器的数据并将其通过ESP-01S模块发送到远程服务器上。以下是具体的步骤: 1. 将DHT11温湿度传感器连接到Arduino Uno上,可以参考以下连接方式: DHT11 VCC - Arduino 5V DHT11 GND - Arduino GND DHT11 DATA - Arduino Digital Pin 2 2. 下载并安装ESP8266库,这里我们使用的是ESP8266WiFi库和ESP8266HTTPClient库。打开Arduino IDE,选择菜单栏:Sketch -> Include Library -> Manage Libraries,搜索并安装这两个库。 3. 连接ESP-01S模块到Arduino Uno上,可以参考以下连接方式: ESP-01S VCC - Arduino 3.3V ESP-01S GND - Arduino GND ESP-01S RX - Arduino Digital Pin 3 ESP-01S TX - Arduino Digital Pin 4 4. 编写Arduino代码,实现从DHT11传感器读取数据并将其发送到远程服务器上,可以参考以下代码: ``` #include <DHT.h> #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #define DHTPIN 2 #define DHTTYPE DHT11 const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; const char* serverName = "your_SERVER_NAME"; DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } Serial.println("Connected to WiFi"); } void loop() { float temp = dht.readTemperature(); float humidity = dht.readHumidity(); if (isnan(temp) || isnan(humidity)) { Serial.println("Failed to read from DHT sensor!"); return; } Serial.print("Temperature: "); Serial.print(temp); Serial.print("C, Humidity: "); Serial.print(humidity); Serial.println("%"); if (WiFi.status() == WL_CONNECTED) { HTTPClient http; String serverPath = serverName + "/temperature=" + String(temp) + "&humidity=" + String(humidity); http.begin(serverPath.c_str()); int httpCode = http.GET(); if (httpCode > 0) { String payload = http.getString(); Serial.println(payload); } else { Serial.println("Error on HTTP request"); } http.end(); } delay(5000); } ``` 5. 将代码上传到Arduino Uno板子上。 到这里,你已经完成了将温湿度传感器数据发送到远程服务器的过程。如果你有一个Web服务器,你可以将其部署到服务器上并收集数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sol-itude

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值