亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

日期、时间、温度和湿度显示

组件和用品

Arduino UNO
× 1
DHT11 温湿度传感器(4 针)
× 1
Maxim Integrated DS3231
× 1
电阻 10k ohm
× 1
Adafruit 128x64 OLED 图形显示器
× 1
面包板(通用)
× 1
跳线(通用)
× 15

关于这个项目

您有没有想过制作自己的界面来显示时间、日期以及温度和湿度?嗯,这比你想象的要容易得多。

需要一些重要的组件,如下所示。

Arduino Uno/纳米

首先,我们需要一个微控制器。我在我的项目中使用了 Arduino Uno,但 Arduino Nano 也有足够的引脚。

DHT11

DHT11 是一款非常实惠的数字温度和湿度传感器。它使用电容式湿度传感器和热敏电阻来测量周围的空气。读数的时机至关重要,建议每 2 秒读数一次。

有一点要记住。 设置一次时间后,请务必注释该行,然后再次编译。 这样,RTC 将跟踪时间,并且时间不会设置为您编译它之前的任何时间。

DS3231

DS3231 是 RTC 模块,与常用的 DS1307 模块相同。它比它的 DS1307 对应物便宜得多,而且准确得多。它包含一个集成的温度补偿晶体振荡器 (TCXO) 和晶体。该设备包含一个电池输入,并在设备的主电源中断时保持准确的计时。

128x64 OLED 图形显示

OLED 屏幕将显示我们的数据。这个屏幕尺寸非常紧凑,屏幕亮度令人印象深刻。 Adafruit OLED 屏幕可以使用 SPI 或 I2C 接口进行控制,可以在屏幕背面进行调整。您也可以使用更实惠的屏幕(eBay 上有很多),但要小心购买哪一个,因为屏幕需要处理我们将通过 Adafruit 的库使用的头文件。

代码

  • Time_Temp_Humidity_Display.ino
Time_Temp_Humidity_Display.inoArduino
这是编译项目的代码。记得添加必要的头文件,不带项目是不行的。
//Greetings hackster.io users!//日期、时间、温度和湿度显示//////////// ////////////对于OLED//////////////////////#include #include #include #include // 如果使用软件 SPI(默认情况):#define OLED_MOSI 9 //MOSI aka SDA#define OLED_CLK 10 //CLK aka SCL#define OLED_DC 11 #define OLED_CS 12#define OLED_RESET 13Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);#if (SSD1306_LCDHEIGHT !=64)#error("高度不正确,请修复Adafruit_SSD1306");#endhif ////////////////////////////////////////////////// //////////////////////////////////对于DHT//////////// ////////////#includedht DHT;#define DHT11_PIN 3int DHTtimer =0;//////////////// ////////////////////////////////////////////////// /////////////////////对于RTC(DS3231)//////////////////////// ////SDA转A4,SCL转A5#define DS3231_I2C_A DDRESS 0x68// 将普通十进制数转换为二进制编码的十进制数byte decToBcd(byte val){ return( (val/10*16) + (val%10) );}// 将二进制编码的十进制数转换为普通十进制数byte bcdToDec(byte val) ){ return( (val/16*10) + (val%16) );}//////////////////////////// /////////////////////////////void setup() { Wire.begin(); Serial.begin(9600); //这里设置初始时间,设置时间后,注释本节 //DS3231秒,分,小时,日,日,月,年 //setDS3231time(00,24,12,6,3,2,17); display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay();}//////////////////////////DS3231编码//////////// /////////////void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, bytedayOfMonth, byte month, byte year){ // 设置时间和日期数据到 DS3231 Wire.beginTransmission( DS3231_I2C_ADDRESS); Wire.write(0); // 设置下一个输入从秒寄存器开始 Wire.write(decToBcd(second)); // 设置秒 Wire.write(decToBcd(minute)); // 设置分钟 Wire.write(decToBcd(hour)); // 设置小时 Wire.write(decToBcd(dayOfWeek)); // 设置星期几 (1=Sunday, 7=Saturday) Wire.write(decToBcd(dayOfMonth)); // 设置日期(1 到 31) Wire.write(decToBcd(month)); // 设置月份 Wire.write(decToBcd(year)); // 设置年份(0 到 99) Wire.endTransmission();}void readDS3231time(byte *second,byte *minute,byte *hour,byte *dayOfWeek,byte *dayOfMonth,byte *month,byte *year){ Wire.开始传输(DS3231_I2C_ADDRESS); Wire.write(0); // 将 DS3231 寄存器指针设置为 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // 从寄存器 00h 开始从 DS3231 请求七个字节的数据 *second =bcdToDec(Wire.read() &0x7f); *分钟 =bcdToDec(Wire.read()); *小时 =bcdToDec(Wire.read() &0x3f); *dayOfWeek =bcdToDec(Wire.read()); *dayOfMonth =bcdToDec(Wire.read()); *month =bcdToDec(Wire.read()); *year =bcdToDec(Wire.read());}void displayTime(){ byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; // 从 DS3231 检索数据 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // 将其发送到串行监视器 Serial.print(hour, DEC); // 显示时将字节变量转换为十进制数 Serial.print(":");如果(分钟<10){ Serial.print(“0”); Serial.print(minute, DEC); Serial.print(":"); if (second<10) { Serial.print("0"); Serial.print(second, DEC); Serial.print(" "); Serial.print(dayOfMonth, DEC); Serial.print("/"); Serial.print(month, DEC); Serial.print("/"); Serial.print(year, DEC); Serial.print(" 星期几:");//////////////////////////////////// ////////////////////////// display.setCursor(50,0); display.print(dayOfMonth, DEC); display.print(","); display.setCursor(91,0); display.print("20"); display.print(year, DEC); if (hour<10) { display.setCursor(40,10); display.print("0");显示。打印(小时,DEC); display.print(":"); } if (hour>9) { display.setCursor(40,10);显示。打印(小时,DEC); display.print(":"); } if (minute<10) { display.setCursor(58,10); display.print("0");显示。打印(分钟,DEC); display.print(":"); } if (minute>9) { display.setCursor(58,10);显示。打印(分钟,DEC); display.print(":"); } if (second<10) { display.setCursor(75,10); display.print("0"); display.print(second, DEC); } if (second>9) { display.setCursor(75,10); display.print(second, DEC); } ///////////////////////////////////////////////// /////////////////////////////////////////////////今天WEEK////////////////// switch(dayOfWeek){ case 1:Serial.println("Sunday"); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(20,0); display.print("太阳");休息;情况 2:Serial.println("星期一"); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(20,0); display.print("星期一");休息;案例 3:Serial.println("Tuesday"); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(20,0); display.print("周二");休息;案例 4:Serial.println("星期三"); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(20,0); display.print("星期三");休息;案例 5:Serial.println("星期四"); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(20,0); display.print("星期四");休息;案例 6:Serial.println("星期五"); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(20,0); display.print("星期五");休息;案例 7:Serial.println("星期六"); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(20,0); display.print("周六");休息; }////////////////////////////本月//////////////// //// switch(month) { case 1:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("Jan");休息;情况 2:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("二月");休息;情况 3:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("Mar");休息;情况 4:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("Apr");休息;案例 5:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("五月");休息;情况 6:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("君");休息;情况 7:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("七月");休息;案例 8:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("八月");休息;案例 9:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("Sep");休息;案例 10:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("Oct");休息;案例 11:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("Nov");休息;案例 12:display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,0); display.print("Dec");休息; } /////////////小时指针///////////// 浮动x1, y1, a, b;常量浮点 pi =3.14; a=((小时-15)*30); b =(a*pi)/180; x1=40+(9*cos(b)); y1=41+(9*sin(b)); display.drawLine(40,41, x1, y1, WHITE); /////////////分钟指针/////////////// float x1, y1, a, b;// const float pi =3.14; a=((分钟-15)*6); b =(a*pi)/180; x1=40+(17*cos(b)); y1=41+(17*sin(b)); display.drawLine(40,41, x1, y1, WHITE); /////////////第二手///////////// //浮动x1, y1, a, b; a=((second-15)*6); b =(a*pi)/180; x1=40+(19*cos(b)); y1=41+(19*sin(b)); display.drawLine(40,41, x1, y1, WHITE); //////////////不会移动的模拟时钟部分//////////////display.drawCircle(40, 41, 22, WHITE);display.drawCircle(40, 41, 1, WHITE);display.drawLine(40, 20, 40, 25, WHITE); //12display.drawLine(40, 63, 40, 58, WHITE); //6display.drawLine(62, 41, 57, 41, WHITE); //3display.drawLine(19, 41, 24, 41, WHITE); //9display.drawLine(50, 24, 47, 28, WHITE); //1display.drawLine(57, 31, 53, 34, WHITE); //2display.drawLine(60, 51, 54, 48, WHITE); //4display.drawLine(51, 58, 48, 54, WHITE); //5display.drawLine(29, 58, 32, 54, WHITE); //7display.drawLine(21, 51, 25, 48, WHITE); //8display.drawLine(22, 31, 27, 33, WHITE); //10display.drawLine(30, 23, 32, 28, WHITE); //11 }void ReadTempAndHum(){ int chk =DHT.read11(DHT11_PIN); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,45); display.print("温度:"); display.print(DHT.温度, 0); display.print("C"); display.setCursor(70,56); display.print("嗡嗡声:");显示。打印(DHT。湿度,0); display.print("%");Serial.print("湿度:");Serial.print(DHT.湿度,1);Serial.print("%");Serial.print("|温度:"); Serial.print(DHT.temperature, 1);Serial.println("C");}void loop() { displayTime(); // 在串口监视器上显示实时时钟数据,DHTtimer =DHTtimer + 1; //为了确保每 2 秒只读取一次 DHT,我们进行 2 秒的计数 if (DHTtimer> 1) { display.fillRect(70, 45, 128, 64, BLACK); ReadTempAndHum(); DHTtimer =0; } 延迟(1000);显示。显示(); //显示时间和日期的屏幕部分被清除 display.fillRect(0, 0, 64, 64, BLACK); display.fillRect(0, 0, 128, 20, BLACK);}

定制零件和外壳

adafruit_ssd1306-master_KOASsXZpW2.zip adafruit-gfx-library-master_2IU6g1UpF6.zip dht_library_Xgke1ZhPls.zip dht-sensor-library-master_Al4SeQRvaS.zip arduinortclibrary-master_hKLoSjCilY.zip

示意图

注意:我在 Fritzing 上找不到合适的 OLED 屏幕。如果您需要进一步说明 OLED 引脚的位置,请查看代码注释。 breadboard_diagram_QvhPKCpIo5.fzz注意:我在 Fritzing 上找不到合适的 OLED 屏幕。如果您需要进一步说明 OLED 引脚的位置,请查看代码注释。 原理图_XKU0jQoWbx.fzz

制造工艺

  1. 电容充放电
  2. 如何在 Python 中获取当前日期和时间?
  3. Raspberry Pi 温湿度网络监视器
  4. Python 和 Raspberry Pi 温度传感器
  5. Raspberry Pi 上的简易温度和湿度
  6. 实验室“气象站”
  7. Raspberry Pi 温度和光传感器
  8. 如何检查和校准湿度传感器
  9. 按时生产新疫苗和生物制剂
  10. Java - 日期和时间
  11. C++ 日期和时间
  12. Python - 日期和时间