一. 项目介绍
本次我选择了只能家居的项目, 此次设计一款可以自动同步时间的网络点阵时钟
硬件:
本次使用到的主控为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芯片可以保证离线情况下的时间稳定性. 

