0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用ESP8266制作一个迷你功能齐全的时钟

科技观察员 来源:Sagar Saini 作者:Sagar Saini 2022-05-13 15:05 次阅读

我准备做的是一个迷你但功能齐全的时钟,并且还具有RGB效果和温度监控功能。

构建

首先,我想做一个7段显示器。但这一次需要显示较大的数字和RGB效果。因为这可用于显示一些读数,例如使用Nodemcu的时钟,使用Arduino进行温度监控。此外,还可以选择在每秒钟或下一次读数后改变颜色。

poYBAGJ-An-AN0QNAANcxItVJ7Q299.png

之前因为我使用2个LED来显示每段数字,致使我们的眼睛无法快速准确地识别数字。意味着我们需要专注,我对设计很满意,但现在是时候更新了。

pYYBAGJ-AnuAF6vkAATl2bPXI6Y767.png

这款迷你LED具有额定电压:3.0v至5.5volts@16mA(每个LED)。我们的NodeMCU具有3.3伏稳压器,可正确驱动所有LED。

LEDWS2812B3030:

我使用了ws2812Neopixelled,它带有集成ic,因此我们可以单独处理每个段。不仅LED是可寻址的,而且每个像素的颜色也可以改变,在0-255(8位值)之间改变数字值。

pYYBAGJ-AnaAbBoHAALjHmh8U8g864.png

这个LED有4个引脚,引脚的配置可以在上面提到的图片中看到。此外,这些LED带有数据输入和数据输出功能,这能够使它们更有趣,通过这个我们可以加入它们来显示文本或数据。

使用新像素LED制作7段显示:

要制作面板,首先我们必须仔细看看实际的液晶显示器。这样我们就可以复制段的排列并为此设计代码。

pYYBAGJ-AnKAebwxAAFKvm7CK7M540.png

所以在这里,段被命名为A,B,C……到G,所以为了连接所有的段,我们使用串联数据和并联功率的方法。所有电源线、GND和VCC与所有LED并联。数据OUT被串联提供给下一个Led的数据输入。始终将第一个面板的Dout连接到第二个面板的Din。

连接:

pYYBAGJ-Am6AKbvmAAWsec_UA_c736.png

为了连接小时和分钟面板,中间有一块名为Dash的小PCB,包含2个LED作为二进制数字。这2个LED每秒都会发光。

poYBAGJ-AmqAclePAAUHPqmj1PM183.png

NodeMCU/ESP8266的需求:

ESP8266集成了32位Tensilica处理器,标准数字外设接口

poYBAGJ-AmaAeQOvAAMB5m6bEy4987.png

我们的Esp8266具有板载Wi-Fi支持,通过它我们可以在没有任何RTC(实时时钟)模块的情况下通过互联网调整时间。这将减少连接并使该项目变得简单。

如果您使用我的代码,那么您可以在这个7段时钟中添加2个额外功能。

1)温湿度采用轻触开关

在引脚13上添加DHT11传感器,在引脚12上添加触觉按钮,以获取屏幕上摄氏或华氏温度的温度值。

poYBAGJ-AmKAaJlcAAJVlmBU5pg329.png

使用10k电阻将按钮引脚12连接到5伏,另一端连接到GND。表示当按钮引脚下拉至GND时,显示屏将显示温度读数。该代码在没有此温度传感器的情况下也可以工作,因此如果您想保持简单,则不需要这些连接。

2)在引脚A0使用LDR传感器进行亮度控制

pYYBAGJ-AluAR3XSAAKEMrnQFS0961.png

通过在A0引脚上制作一个电阻分压器网络来添加一个带有10k电阻的LDR传感器,这将相应地改变亮度。白天亮度高,晚上亮度低。如果您不想调节亮度,该代码也可以在没有这些传感器的情况下工作,它将锁定默认设置。

7-段时钟:

pYYBAGJ-AliARB40AAPRbiCX7Qo031.png

我在EasyEDA中为每个部分设计了电路,这里我使用3个LED。因此,每个面板总共需要21个LED才能进行此配置。我在底层制作了连接引脚,这样第二个人就看不到连接和布线。

poYBAGJ-AlSAdju7AARTGQoerV0806.png

现在在中间连接破折号并使用下面给出的示意图连接NodeMCU:

pYYBAGJ-AlCAScR6AARnUfjbvMA543.png

我一直在使用cirkit设计器软件,我认为这是表达和呈现电路的最佳方式。

pYYBAGJ-AkuAHviYAAKcHIzIcl0789.png

代码:
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
    RGB
    +关注

    关注

    4

    文章

    797

    浏览量

    58344
  • 时钟
    +关注

    关注

    10

    文章

    1716

    浏览量

    131302
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    44771
收藏 人收藏

    评论

    相关推荐

    如何利用ESP8266和OLED显示屏来做一个网络时钟

    如何利用ESP8266和OLED显示屏来做一个网络时钟呢?有哪些制作步骤?
    发表于 02-15 06:11

    ESP8266-NodeMCU

    ²C1.8 SPI1.9 ESP8266引脚功能ESP8266-NodeMCU引脚功能1.1 可用引脚  
    发表于 10-25 16:51 43次下载
    <b class='flag-5'>ESP8266</b>-NodeMCU

    esp8266 nodemcu oled_esp8266开发笔记(二):OLED显示屏制作网络时钟

    大家好,我是阿普。搬运知识,分享经验的Joker在开发笔记()中,我们已经对ESP8266有了比较基础的了解了。这期我们用ESP8266
    发表于 12-17 18:00 14次下载
    <b class='flag-5'>esp8266</b> nodemcu oled_<b class='flag-5'>esp8266</b>开发笔记(二):OLED显示屏<b class='flag-5'>制作</b>网络<b class='flag-5'>时钟</b>

    使用ESP8266-01制作WIFI遥控小车(

    使用ESP8266-01制作WIFI遥控小车()ESP8266简介ESP8266有三种工作模式:STA、AP以及STA+AP。STA 模式
    发表于 01-12 19:47 46次下载
    使用<b class='flag-5'>ESP8266</b>-01<b class='flag-5'>制作</b>WIFI遥控小车(<b class='flag-5'>一</b>)

    如何利用ESP8266制作简单的四轴飞行器

    这个项目里我将向您展示如何使用ESP8266(12e)制作四轴飞行器,我们使用ESP8266作为飞行控制器。并且据说这架无人机可以爬墙,你是不是很震惊?开玩笑的,让我们继续往下看吧!
    的头像 发表于 05-07 17:27 4809次阅读
    如何<b class='flag-5'>利用</b><b class='flag-5'>ESP8266</b><b class='flag-5'>制作</b><b class='flag-5'>一</b><b class='flag-5'>个</b>简单的四轴飞行器

    如何使用ESP8266制作可配置的Web服务器

    在这个项目中,我们首先研究如何在 Arduino IDE 中安装 ESP8266 插件,然后使用 ESP8266 制作可配置的 Web 服务器。
    的头像 发表于 05-10 15:18 1.3w次阅读
    如何使用<b class='flag-5'>ESP8266</b><b class='flag-5'>制作</b>可配置的Web服务器

    ESP8266迷你测试板开源资料分享

    电子发烧友网站提供《ESP8266迷你测试板开源资料分享.zip》资料免费下载
    发表于 07-01 15:18 2次下载
    <b class='flag-5'>ESP8266</b><b class='flag-5'>迷你</b>测试板开源资料分享

    stm32和esp8266上的简单时钟

    电子发烧友网站提供《stm32和esp8266上的简单时钟.zip》资料免费下载
    发表于 07-27 11:24 4次下载
    stm32和<b class='flag-5'>esp8266</b>上的简单<b class='flag-5'>时钟</b>

    ESP8266矩阵时钟PCB设计

    电子发烧友网站提供《ESP8266矩阵时钟PCB设计.zip》资料免费下载
    发表于 08-05 10:24 7次下载
    <b class='flag-5'>ESP8266</b>矩阵<b class='flag-5'>时钟</b>PCB设计

    ESP8266迷你系统开源分享

    电子发烧友网站提供《ESP8266迷你系统开源分享.zip》资料免费下载
    发表于 08-08 10:07 7次下载
    <b class='flag-5'>ESP8266</b><b class='flag-5'>迷你</b>系统开源分享

    BIM时钟ESP8266开源项目

    电子发烧友网站提供《BIM时钟ESP8266开源项目.zip》资料免费下载
    发表于 08-16 11:18 1次下载
    BIM<b class='flag-5'>时钟</b><b class='flag-5'>ESP8266</b>开源项目

    制作MQTT ESP8266家庭自动化项目

    电子发烧友网站提供《制作MQTT ESP8266家庭自动化项目.zip》资料免费下载
    发表于 11-09 11:15 0次下载
    <b class='flag-5'>制作</b><b class='flag-5'>一</b><b class='flag-5'>个</b>MQTT <b class='flag-5'>ESP8266</b>家庭自动化项目

    基于ESP8266的NTP时钟

    电子发烧友网站提供《基于ESP8266的NTP时钟.zip》资料免费下载
    发表于 11-11 10:06 3次下载
    基于<b class='flag-5'>ESP8266</b>的NTP<b class='flag-5'>时钟</b>

    使用ESP8266制作基于物联网的数字世界时钟

    电子发烧友网站提供《使用ESP8266制作基于物联网的数字世界时钟.zip》资料免费下载
    发表于 07-05 10:47 36次下载
    使用<b class='flag-5'>ESP8266</b><b class='flag-5'>制作</b>基于物联网的数字世界<b class='flag-5'>时钟</b>

    ESP8266网络天气时钟OLED显示

    基于ESP8266实现网络获取天气和时钟并OLED显示
    的头像 发表于 06-28 04:46 959次阅读
    <b class='flag-5'>ESP8266</b>网络天气<b class='flag-5'>时钟</b>OLED显示