我準備做的是一個迷你但功能齊全的時鐘,并且還具有RGB效果和溫度監控功能。
構建
首先,我想做一個7段顯示器。但這一次需要顯示較大的數字和RGB效果。因為這可用于顯示一些讀數,例如使用Nodemcu的時鐘,使用Arduino進行溫度監控。此外,還可以選擇在每秒鐘或下一次讀數后改變顏色。
之前因為我使用2個LED來顯示每段數字,致使我們的眼睛無法快速準確地識別數字。意味著我們需要專注,我對設計很滿意,但現在是時候更新了。
這款迷你LED具有額定電壓:3.0v至5.5volts@16mA(每個LED)。我們的NodeMCU具有3.3伏穩壓器,可正確驅動所有LED。
LEDWS2812B3030:
我使用了ws2812Neopixelled,它帶有集成ic,因此我們可以單獨處理每個段。不僅LED是可尋址的,而且每個像素的顏色也可以改變,在0-255(8位值)之間改變數字值。
這個LED有4個引腳,引腳的配置可以在上面提到的圖片中看到。此外,這些LED帶有數據輸入和數據輸出功能,這能夠使它們更有趣,通過這個我們可以加入它們來顯示文本或數據。
使用新像素LED制作7段顯示:
要制作面板,首先我們必須仔細看看實際的液晶顯示器。這樣我們就可以復制段的排列并為此設計代碼。
所以在這里,段被命名為A,B,C……到G,所以為了連接所有的段,我們使用串聯數據和并聯功率的方法。所有電源線、GND和VCC與所有LED并聯。數據OUT被串聯提供給下一個Led的數據輸入。始終將第一個面板的Dout連接到第二個面板的Din。
連接:
為了連接小時和分鐘面板,中間有一塊名為Dash的小PCB,包含2個LED作為二進制數字。這2個LED每秒都會發光。
NodeMCU/ESP8266的需求:
ESP8266集成了32位Tensilica處理器,標準數字外設接口。
我們的Esp8266具有板載Wi-Fi支持,通過它我們可以在沒有任何RTC(實時時鐘)模塊的情況下通過互聯網調整時間。這將減少連接并使該項目變得簡單。
如果您使用我的代碼,那么您可以在這個7段時鐘中添加2個額外功能。
1)溫濕度采用輕觸開關
在引腳13上添加DHT11傳感器,在引腳12上添加觸覺按鈕,以獲取屏幕上攝氏或華氏溫度的溫度值。
使用10k電阻將按鈕引腳12連接到5伏,另一端連接到GND。表示當按鈕引腳下拉至GND時,顯示屏將顯示溫度讀數。該代碼在沒有此溫度傳感器的情況下也可以工作,因此如果您想保持簡單,則不需要這些連接。
2)在引腳A0使用LDR傳感器進行亮度控制
通過在A0引腳上制作一個電阻分壓器網絡來添加一個帶有10k電阻的LDR傳感器,這將相應地改變亮度。白天亮度高,晚上亮度低。如果您不想調節亮度,該代碼也可以在沒有這些傳感器的情況下工作,它將鎖定默認設置。
7-段時鐘:
我在EasyEDA中為每個部分設計了電路,這里我使用3個LED。因此,每個面板總共需要21個LED才能進行此配置。我在底層制作了連接引腳,這樣第二個人就看不到連接和布線。
現在在中間連接破折號并使用下面給出的示意圖連接NodeMCU:
我一直在使用cirkit設計器軟件,我認為這是表達和呈現電路的最佳方式。
代碼:
1)首先使用庫初始化代碼
#include
#include
#include
#include
#include
#include
#include
2) 定義所有像素、I/O 管腳、傳感器管腳:
#define PIXEL_PER_SEGMENT 3 // Number of LEDs in each Segment
#define PIXEL_DIGITS 4 // Number of connected Digits
#define PIXEL_PIN 2 // GPIO Pin
#define PIXEL_DASH 1 // Binary segment
#define LDR_PIN A0 // LDR pin
#define DHT_PIN 13 // DHT Sensor pin
#define BUTTON_PIN 12 // Button pin
3) 對于時間格式,使用 Wi-Fi 連接互聯網到 ESP8266
WiFi.begin(ssid, password);
Serial.print("Connecting.");
while ( WiFi.status() != WL_CONNECTED )
4) Pixel 上的時間設置
void disp_Time() {
clearDisplay();
writeDigit(0, Hour / 10);
writeDigit(1, Hour % 10);
writeDigit(2, Minute / 10);
writeDigit(3, Minute % 10);
writeDigit(4, Second / 10);
writeDigit(5, Second % 10);
disp_Dash();
5) 面板上的顏色設置:
if (index == 0 || index == 1 ) color = strip.Color(0, Brightness, 0);
if (index == 2 || index == 3 ) color = strip.Color(0, Brightness, 0);
if (index == 4 || index == 5 ) color = strip.Color(Brightness, 0, 0);
這些是關于代碼的簡要說明,代碼也有溫度和自動時間選項??梢允褂脭底忠_ 12 上的觸覺開關選擇溫度模式
工作代碼:
#include
#include
#include
#include
#include
#include
#include
#define PIXEL_PER_SEGMENT 3 // Number of LEDs in each Segment
#define PIXEL_DIGITS 4 // Number of connected Digits
#define PIXEL_PIN 2 // GPIO Pin
#define PIXEL_DASH 1 // Binary segment
#define LDR_PIN A0 // LDR pin
#define DHT_PIN 13 // DHT Sensor pin
#define BUTTON_PIN 12 // Button pin
// Uncomment the type of sensor in use
#define DHT_TYPE DHT11 // DHT 11
//#define DHT_TYPE DHT22 // DHT 22 (AM2302)
//#define DHT_TYPE DHT21 // DHT 21 (AM2301)
#define TIME_FORMAT 12 // 12 = 12 hours format || 24 = 24 hours format
Adafruit_NeoPixel strip = Adafruit_NeoPixel((PIXEL_PER_SEGMENT * 7 * PIXEL_DIGITS) + (PIXEL_DASH * 2), PIXEL_PIN, NEO_GRB + NEO_KHZ800);
DHT dht(DHT_PIN, DHT_TYPE);
// set Wi-Fi SSID and password
const char *ssid = "Hackster";
const char *password = "*************";
WiFiUDP ntpUDP;
// 'time.nist.gov' is used (default server) with +1 hour offset (3600 seconds) 60 seconds (60000 milliseconds) update interval
NTPClient timeClient(ntpUDP, "time.nist.gov", 19800, 60000); //GMT+5:30 : 5*3600+30*60=19800
int period = 2000; //Update frequency
unsigned long time_now = 0;
int Second, Minute, Hour;
// set default brightness
int Brightness = 40;
// current temperature, updated in loop()
int Temperature;
bool Show_Temp = false;
//Digits array
byte digits[12] = {
//abcdefg
0b1111110, // 0
0b0110000, // 1
0b1101101, // 2
0b1111001, // 3
0b0110011, // 4
0b1011011, // 5
0b1011111, // 6
0b1110000, // 7
0b1111111, // 8
0b1110011, // 9
0b1001110, // C
0b1000111, // F
};
//Clear all the Pixels
void clearDisplay() {
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
}
void setup() {
Serial.begin(115200);
strip.begin();
strip.show();
dht.begin();
pinMode(BUTTON_PIN, INPUT);
WiFi.begin(ssid, password);
Serial.print("Connecting.");
while ( WiFi.status() != WL_CONNECTED ) {
delay(500);
Serial.print(".");
}
Serial.println("connected");
timeClient.begin();
delay(10);
}
void loop() {
if (WiFi.status() == WL_CONNECTED) { // check WiFi connection status
int sensor_val = analogRead(LDR_PIN);
Brightness =40;
timeClient.update();
int Hours;
unsigned long unix_epoch = timeClient.getEpochTime(); // get UNIX Epoch time
Second = second(unix_epoch); // get seconds
Minute = minute(unix_epoch); // get minutes
Hours = hour(unix_epoch); // get hours
if (TIME_FORMAT == 12) {
if (Hours > 12) {
Hour = Hours - 12;
}
else
Hour = Hours;
}
else
Hour = Hours;
}
if (digitalRead(BUTTON_PIN) == LOW) {
Show_Temp = true;
}
else
Show_Temp = false;
if (Show_Temp) {
Temperature = dht.readTemperature();
Serial.println(Temperature);
clearDisplay();
writeDigit(0, Temperature / 10);
writeDigit(1, Temperature % 10);
writeDigit(2, 10);
strip.setPixelColor(28, strip.Color(Brightness, Brightness, Brightness));
strip.show();
delay(3000);
clearDisplay();
Show_Temp = false;
}
while (millis() > time_now + period) {
time_now = millis();
disp_Time(); // Show Time
}
}
void disp_Time() {
clearDisplay();
writeDigit(0, Hour / 10);
writeDigit(1, Hour % 10);
writeDigit(2, Minute / 10);
writeDigit(3, Minute % 10);
writeDigit(4, Second / 10);
writeDigit(5, Second % 10);
disp_Dash();
strip.show();
}
void disp_Dash() {
int dot, dash;
for (int i = 0; i < 2; i++) {
dot = 2 * (PIXEL_PER_SEGMENT * 7) + i;
for (int j = 0; j < PIXEL_DASH; j++) {
dash = dot + j * (2 * (PIXEL_PER_SEGMENT * 7) + 2);
Second % 2 == 0 ? strip.setPixelColor(dash, strip.Color(0,Brightness ,0)) : strip.setPixelColor(dash, strip.Color(0, Brightness,0));
}
}
}
void writeDigit(int index, int val) {
byte digit = digits[val];
int margin;
if (index == 0 || index == 1 ) margin = 0;
if (index == 2 || index == 3 ) margin = 1;
if (index == 4 || index == 5 ) margin = 2;
for (int i = 6; i >= 0; i--) {
int offset = index * (PIXEL_PER_SEGMENT * 7) + i * PIXEL_PER_SEGMENT + margin * 2;
uint32_t color;
if (digit & 0x01 != 0) {
if (index == 0 || index == 1 ) color = strip.Color(Brightness, 0, Brightness);
if (index == 2 || index == 3 ) color = strip.Color(Brightness, 0,Brightness);
if (index == 4 || index == 5 ) color = strip.Color(Brightness, 0, 0);
}
else
color = strip.Color(0, 0, 0);
for (int j = offset; j < offset + PIXEL_PER_SEGMENT; j++) {
strip.setPixelColor(j, color);
}
digit = digit >> 1;
}
}
-
RGB
+關注
關注
4文章
801瀏覽量
58716 -
時鐘
+關注
關注
11文章
1747瀏覽量
131803 -
ESP8266
+關注
關注
50文章
962瀏覽量
45332
發布評論請先 登錄
相關推薦
評論