一. 项目介绍
本次我选择了只能家居的项目, 此次设计一款可以自动同步时间的网络点阵时钟
硬件:
本次使用到的主控为ESP8266, 供电使用AID的ADP151AUJZ-3.3-R7线性稳压器, 显示为8*32的LED点阵屏, 使用Maxim的MAX7219EWG驱动点阵屏显示. 同时搭配Maxim的DS3231模块, 保存时间, 保证离线时正确显示时间.
软件:
使用Aduino IDE进行开发, 主要使用到了SPI, Ticker, ESP8266WiFi, Wire, time等模块
系统框图:
二. 项目用到的板卡、芯片、模块、仪器、设备等介绍
-
MAX7219EWG
MAX7219/MAX7221是紧凑型、串行输入/输出共阴极显示驱动器,可将微处理器连接到多达8位的7段数字LED显示器、条形图显示器或64个独立LED . 片上包括一个 BCD 代码 B 解码器、多路扫描电路、段和数字驱动器,以及一个存储每个数字的 8x8 静态 RAM。 只需要一个外部电阻来设置所有 LED 的段电流。
-
ADP151AUJZ-3.3-R7
ADP151 是一款超低噪声、低压差线性稳压器,工作电压范围为 2.2 V 至 5.5 V,并提供高达 200 mA 的输出电流。 200 mA 负载下 140 mV 的低压差提高了效率并允许在较宽的输入电压范围内工作。 ADP151 采用创新的电路拓扑结构,无需旁路电容器即可实现超低噪声性能,非常适合对噪声敏感的模拟和 RF 应用。 ADP151 还实现了超低噪声性能,而不会影响 PSRR 或瞬态线路和负载性能。 200 mA 负载下 265 μA 的低静态电流使 ADP151 适用于电池供电的便携式设备。
-
DS3231
DS3231是一款高精度I2C实时时钟器件,具有集成的温度补偿晶体振荡器,集成的晶体振荡器可提高器件的长期精确度. 该器件包含电池输入端, 断开主电源时仍可保持精确计.
-
ESP82666
ESP8266 系列模组是深圳市安信可科技有限公司开发的一系列基于乐鑫ESP8266EX的低功耗UART-WiFi芯片模组,可以方便地进行二次开发,块核心处理器 ESP8266 在较小尺寸封装中集成了业界领先的 Tensilica L106 超低功耗 32 位微型 MCU,带有 16 位精简模式,主频支持 80 MHz 和 160 MHz,支持 RTOS,集成 Wi-Fi MAC/ BB/RF/PA/LNA,板载天线。支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。
关键性代码及说明
-
WiFi配置, 连接之前保存的WiFi, 尝试10次, 如果连接成功,则返回, 如果连接失败, 则进行下一次尝试, 直到10次循环结束.
bool WifiConfig()
{
WiFi.begin(); //先尝试已经保存的WIFI
for (int i = 0; i < 10; i++)
{
char2Arr('W', 28, 0);
char2Arr('i', 22, 0);
char2Arr('-', 18, 0);
char2Arr('F', 12, 0);
char2Arr('i', 6, 0);
refresh_display();
if (WiFi.status() == WL_CONNECTED)
{
Serial.println("WifiConfig Success");
Serial.printf("SSID:%s\r\n", WiFi.SSID().c_str());
Serial.printf("PSW:%s\r\n", WiFi.psk().c_str());
clear_Display();
char2Arr('O', 25, 0);
char2Arr('K', 19, 0);
char2Arr('!', 12, 0);
char2Arr('!', 6, 0);
refresh_display();
Serial.println("WiFi connected");
Serial.println(WiFi.localIP());
Serial.println("Starting UDP");
udp.begin(localPort);
Serial.print("Local port: ");
Serial.println(udp.localPort());
return true;
}
else{
Serial.print("WifiConfig Waiting......");
Serial.println(WiFi.status());
delay(1000);
}
}
clear_Display();
char2Arr('E', 25, 0);
char2Arr('r', 19, 0);
char2Arr('r', 12, 0);
char2Arr('!', 6, 0);
refresh_display();
delay(1000);
Serial.println("AutoConfig Faild!" );
return false;
}
-
读写DS3221模块, 读取和保存当前时间, 使用DS3221模块,
unsigned char rtc_Read(unsigned char regaddress) {
Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(regaddress);
Wire.endTransmission();
Wire.requestFrom((unsigned char) DS3231_ADDRESS, (unsigned char) 1);
return (Wire.read());
}
void rtc_Write(unsigned char regaddress, unsigned char value) {
Wire.beginTransmission(DS3231_ADDRESS);
Wire.write(regaddress);
Wire.write(value);
Wire.endTransmission();
}
-
通过SPI驱动MAX7219, 将信息显示到点阵屏上
void refresh_display() //take info into LEDarr
{
unsigned short i, j;
#ifdef ROTATE_90
rotate_90();
#endif
for (i = 0; i < 8; i++) //8 rows
{
digitalWrite(CS, LOW);
delayMicroseconds(1);
for (j = 1; j <= anzMAX; j++) {
SPI.write(i + 1); //current row
#ifdef REVERSE_HORIZONTAL
SPI.setBitOrder(LSBFIRST); // bitorder for reverse columns
#endif
#ifdef REVERSE_VERTICAL
SPI.write(LEDarr[j - 1][7-i]);
#else
SPI.write(LEDarr[j - 1][i]);
#endif
#ifdef REVERSE_HORIZONTAL
SPI.setBitOrder(MSBFIRST); // reset bitorder
#endif
}
digitalWrite(CS, HIGH);
}
}
三. 功能演示结果及说明
-
连接WIFI
-
显示时间
四. 对本活动的心得体会
-
了解了MAX7219EWG, 了解到了点阵屏的使用方法, 使用MAX7219, 可以实现仅使用3个IO空控制32*8 点阵屏, 大大节省了IO口的使用
-
了解了DS3231等芯片的基本使用, 如果仅仅使用网络进行时间同步的话, 离线条件下仍然会导致时间的不稳定, 使用DS3231芯片可以保证离线情况下的时间稳定性.