上一个时钟只能显示时间,这次的这个又增加了温湿度,功能上更加完善。1602也改为了IIC的,方便接线。温湿度传感器使用的是DHT11,如果要精度再高点可以使用DHT22,他们用的是同一个库。
硬件连接(注意GPIO标号为板子后面的标示):
1602:
VCC —— VCC
GND —— GND
SCL —— SCL/GPIO4
SDA —— SDA/GPIO5
DHT11:
VCC —— VCC
GND —— GND
out——GPIO12
(D1 mini接线:
SCL —— D1
SDA —— D2
DHT11 out——D6)
代码:
/*
ESP8266+1602IIC wifi clock
by: linfengfeiwu
http://blog.readgroup.cn
*/
#include <ESP8266WiFi.h>
#include <Time.h>
#include <Timezone.h>
#include "NTP.h"
//DHT11 Sensor:
#include "DHT.h"
#define DHTPIN 12 // what digital pin we're connected to
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
//I2C LCD:
#include <Wire.h> // Comes with Arduino IDE
#include <LiquidCrystal_I2C_DS3231.h>
// Set the LCD I2C address
#define I2C_ADDR 0x27 // Define I2C Address for the PCF8574T
//---(Following are the PCF8574 pin assignments to LCD connections )----
// This are different than earlier/different I2C LCD displays
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
#define LED_OFF 0
#define LED_ON 1
/*-----( Declare objects )-----*/
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
// Set your WiFi login credentials
#define WIFI_SSID "xxx" // 使用时请修改为当前你的 wifi ssid
#define WIFI_PASS "xxx" // 使用时请修改为当前你的 wifi 密码
#define ledPin 14 // 定义ledPin连接到GPIO14
//年
byte Nian[8] = {0b01000,0b01111,0b10010, 0b01111, 0b01010, 0b11111, 0b00010, 0b00010};
//月
byte Yue[8] = {0b01111, 0b01001, 0b01111, 0b01001, 0b01111, 0b01001, 0b10011, 0b00001};
//日
byte Ri[8] = {0b01111, 0b01001, 0b01001, 0b01111, 0b01001, 0b01001, 0b01111, 0b00000};
//摄氏度
byte du[8] = {0b11000,0b11011,0b00100, 0b00100, 0b00100, 0b00100, 0b00011, 0b00000};
// This clock is in the Mountain Time Zone
// Change this for your timezone
// 北京时间时区
#define STD_TIMEZONE_OFFSET +8 // Standard Time offset (-7 is mountain time)
// ***************************************************************
// TimeZone and Daylight Savings Time Rules
// ***************************************************************
// Define daylight savings time rules for the China
TimeChangeRule mySTD = {"", First, Sun, Jan, 0, STD_TIMEZONE_OFFSET * 60};
Timezone myTZ(mySTD, mySTD);
WiFiClient client;
// This function is called once a second
void updateDisplay(void) {
TimeChangeRule *tcr; // Pointer to the time change rule
// Read the current UTC time from the NTP provider
time_t utc = now();
// Convert to local time taking DST into consideration
time_t localTime = myTZ.toLocal(utc, &tcr);
int hhhh = dht.readHumidity();
int tttt = dht.readTemperature();
// Map time to pixel positions
int weekdays= weekday(localTime);
int days = day(localTime);
int months = month(localTime);
int years = year(localTime);
int seconds = second(localTime);
int minutes = minute(localTime);
int hours = hour(localTime) ; //12 hour format use : hourFormat12(localTime) isPM()/isAM()
Serial.println("");
Serial.print("Current local time:");
Serial.print(days);
Serial.print("/");
Serial.print(months);
Serial.print("/");
Serial.print(years);
Serial.print(" - ");
Serial.print(hours);
Serial.print(":");
Serial.print(minutes);
Serial.print(":");
Serial.print(seconds);
Serial.print(" - ");
Serial.print(dayStr(weekdays));
Serial.println("");
lcd.clear();
lcd.setCursor(0,0);
lcd.print(years);
lcd.write(byte(0));
if(months<10)
{
lcd.print("0");
}
lcd.print(months);
lcd.write(byte(1));
if(days<10)
{
lcd.print("0");
}
lcd.print(days);
lcd.write(byte(2));
lcd.print(" ");
printWeek(weekdays);
lcd.setCursor(0,1);
if(hours<10)
{
lcd.print("0");
}
lcd.print(hours);
lcd.print(":");
if(minutes<10)
{
lcd.print("0");
}
lcd.print(minutes);
lcd.print(":");
if(seconds<10)
{
lcd.print("0");
}
lcd.print(seconds);
lcd.print(" ");
lcd.print(tttt);
lcd.write(byte(3));
lcd.print(" ");
lcd.print(hhhh);
lcd.print("%");
}
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
delay(10);
lcd.begin(16, 2);
// Switch on the backlight
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(LED_ON);
lcd.createChar(0, Nian);
lcd.createChar(1, Yue);
lcd.createChar(2, Ri);
lcd.createChar(3, du);
dht.begin();
// We start by connecting to a WiFi network
initNTP(WIFI_SSID, WIFI_PASS);
}
// Previous seconds value
time_t previousSecond = 0;
void loop() {
// Update the display only if time has changed
if (timeStatus() != timeNotSet) {
if (second() != previousSecond) {
previousSecond = second();
// Update the display
updateDisplay();
}
}
delay(1000);
}
void printWeek(int week)
{
switch(week)
{
case 1: lcd.print("Sun");break;
case 2: lcd.print("Mon");break;
case 3: lcd.print("Tue");break;
case 4: lcd.print("Wed");break;
case 5: lcd.print("Thr");break;
case 6: lcd.print("Fri");break;
case 7: lcd.print("Sat");break;
default: lcd.print("E");break;
}
}
NTP.h以及库文件见:http://blog.readgroup.cn/post/76
效果图: