Преглед изворни кода

Добавил фукнцию заполнения индикаторов занаком 'минус'. Подправил инициализацию MAX.

Vladimir N. Shilov пре 9 година
родитељ
комит
dd01a0a2b7
3 измењених фајлова са 267 додато и 251 уклоњено
  1. 207 210
      app/application.cpp
  2. 51 34
      app/max7219.cpp
  3. 9 7
      include/max7219.h

+ 207 - 210
app/application.cpp

@@ -13,7 +13,7 @@
 DHT dht (DHT_PIN, DHT22);
 
 Timer procTimer, procRTimer;
-Timer displayTimer;
+Timer displayTimer, tmpTimer;
 
 // Sensors values
 float SensorT, SensorH, SensorHI, SensorCR;
@@ -21,14 +21,10 @@ String StrCF;
 // Time values
 time_t Time, NTPLastUpdate;
 
-void
-process ();
-void
-connectOk ();
-void
-connectFail ();
-void
-showTime ();
+void process ();
+void connectOk ();
+void connectFail ();
+void showTime ();
 
 // NTP Client
 void
@@ -38,153 +34,154 @@ NtpClient ntpClient ("ntps1-0.cs.tu-berlin.de", 300, onNtpReceive);
 void
 init ()
 {
-  spiffs_mount (); // Mount file system, in order to work with files
+    spiffs_mount (); // Mount file system, in order to work with files
 
-  Serial.begin (SERIAL_BAUD_RATE); // 115200 by default
-  Serial.systemDebugOutput (false); // Debug output to serial
-  Serial.println ("Wall Segment Clock");
+    Serial.begin (SERIAL_BAUD_RATE); // 115200 by default
+    Serial.systemDebugOutput (false); // Debug output to serial
+    Serial.println ("Wall Segment Clock");
 
-  ActiveConfig = loadConfig ();
+    ActiveConfig = loadConfig ();
 
-  //wait for sensor startup
-  delay (1000);
-  // DHT sensor start
-  dht.begin ();
+    //wait for sensor startup
+    delay (1000);
+    // DHT sensor start
+    dht.begin ();
 
-  // 7-segment output
-  MAX7219_Init ();
+    // set timezone hourly difference to UTC
+    SystemClock.setTimeZone (ActiveConfig.AddTZ);
 
-  // set timezone hourly difference to UTC
-  SystemClock.setTimeZone (ActiveConfig.AddTZ);
+    WifiStation.config (ActiveConfig.NetworkSSID, ActiveConfig.NetworkPassword);
+    WifiStation.enable (true);
+    WifiAccessPoint.enable (false);
 
-  WifiStation.config (ActiveConfig.NetworkSSID, ActiveConfig.NetworkPassword);
-  WifiStation.enable (true);
-  WifiAccessPoint.enable (false);
+    WifiStation.waitConnection (connectOk, 20, connectFail); // We recommend 20+ seconds for connection timeout at start
 
-  WifiStation.waitConnection (connectOk, 20, connectFail); // We recommend 20+ seconds for connection timeout at start
+    // опрос датчиков -- раз в минуту?
+    procTimer.initializeMs (60000, process).start ();
+    process ();
 
-  // раз в минуту?
-  procTimer.initializeMs (60000, process).start ();
-  process ();
+    // 7-segment output
+    MAX7219_Init ();
+    tmpTimer.initializeMs(10, MAX7219_FillMinus).startOnce();
 
-  // обновление экрана два раза в секунду
-  displayTimer.initializeMs (500, showTime).start ();
+    // обновление экрана два раза в секунду
+    displayTimer.initializeMs (500, showTime).start ();
 }
 
 void
 showTime ()
 {
-  static int8_t oldHour, oldMinute, pos = 1;
-  static time_t oldTime;
-  DateTime dt;
-
-  Time = SystemClock.now ();
-
-  dt.setTime (Time);
-
-  /*
-   * теперь в dt у нас следующее:
-   * 	int8_t Hour;
-   * 	int8_t Minute;
-   * 	int8_t Second;
-   * 	int16_t Milliseconds;
-   * 	int8_t Day;
-   * 	int8_t DayofWeek; -- Sunday is day 0
-   * 	int8_t Month; // Jan is month 0
-   * 	int16_t Year;  // Full Year numer
-   */
-  int8_t si = dt.Second / 5;
-  if (oldTime != Time)
-    {
-      oldTime = Time;
-
-      if (pos > 8)
+    static int8_t oldHour, oldMinute, pos = 1;
+    static time_t oldTime;
+    DateTime dt;
+
+    Time = SystemClock.now ();
+
+    dt.setTime (Time);
+
+    /*
+     * теперь в dt у нас следующее:
+     * 	int8_t Hour;
+     * 	int8_t Minute;
+     * 	int8_t Second;
+     * 	int16_t Milliseconds;
+     * 	int8_t Day;
+     * 	int8_t DayofWeek; -- Sunday is day 0
+     * 	int8_t Month; // Jan is month 0
+     * 	int16_t Year;  // Full Year numer
+     */
+    int8_t si = dt.Second / 5;
+    if (oldTime != Time)
         {
-          pos = 1;
+            oldTime = Time;
+
+            if (pos > 8)
+                {
+                    pos = 1;
+                }
+            MAX7219_writeData (pos, pos);
+            pos++;
+
+            /*
+             switch (si)
+             {
+             case 0:
+             case 2:
+             case 4:
+             case 6:
+             case 8:
+             case 10:
+             MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorT)/10);
+             MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorT)%10);
+             MAX7219_writeData(MAX7219_DIGIT7, SYM_Temp);
+             break;
+             case 1:
+             case 3:
+             case 7:
+             case 9:
+             MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorH)/10);
+             MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorH)%10);
+             MAX7219_writeData(MAX7219_DIGIT7, SYM_H);
+             break;
+             case 5:
+             case 11:
+             MAX7219_writeData(MAX7219_DIGIT5, SYM_BLANK);
+             MAX7219_writeData(MAX7219_DIGIT6, dt.DayofWeek/10);
+             MAX7219_writeData(MAX7219_DIGIT7, dt.DayofWeek%10);
+             break;
+             }
+             */
+            /*
+             if (oldMinute != dt.Minute)
+             {
+             oldMinute = dt.Minute;
+             if (oldHour != dt.Hour)
+             {
+             oldHour = dt.Hour;
+             }
+             }
+
+             if (si != 5 || si != 11)
+             {
+             MAX7219_writeData(MAX7219_DIGIT0, dt.Hour/10);
+             MAX7219_writeData(MAX7219_DIGIT1, dt.Hour%10);
+             MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus);
+             MAX7219_writeData(MAX7219_DIGIT3, dt.Minute/10);
+             MAX7219_writeData(MAX7219_DIGIT4, dt.Minute%10);
+             }
+             else if (si == 5 || si == 11)
+             {
+             MAX7219_writeData(MAX7219_DIGIT0, dt.Day/10);
+             MAX7219_writeData(MAX7219_DIGIT1, dt.Day%10);
+             MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus);
+             MAX7219_writeData(MAX7219_DIGIT3, dt.Month/10);
+             MAX7219_writeData(MAX7219_DIGIT4, dt.Month%10);
+             }
+             */
+            /*
+             if ((si & 1) == 0)
+             {
+             MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorT)/10);
+             MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorT)%10);
+             MAX7219_writeData(MAX7219_DIGIT7, SYM_Temp);
+             }
+             else
+             {
+             MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorH)/10);
+             MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorH)%10);
+             MAX7219_writeData(MAX7219_DIGIT7, SYM_H);
+             }
+             */
         }
-      MAX7219_writeData (pos, pos);
-      pos++;
-
-      /*
-       switch (si)
-       {
-       case 0:
-       case 2:
-       case 4:
-       case 6:
-       case 8:
-       case 10:
-       MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorT)/10);
-       MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorT)%10);
-       MAX7219_writeData(MAX7219_DIGIT7, SYM_Temp);
-       break;
-       case 1:
-       case 3:
-       case 7:
-       case 9:
-       MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorH)/10);
-       MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorH)%10);
-       MAX7219_writeData(MAX7219_DIGIT7, SYM_H);
-       break;
-       case 5:
-       case 11:
-       MAX7219_writeData(MAX7219_DIGIT5, SYM_BLANK);
-       MAX7219_writeData(MAX7219_DIGIT6, dt.DayofWeek/10);
-       MAX7219_writeData(MAX7219_DIGIT7, dt.DayofWeek%10);
-       break;
-       }
-       */
-      /*
-       if (oldMinute != dt.Minute)
-       {
-       oldMinute = dt.Minute;
-       if (oldHour != dt.Hour)
-       {
-       oldHour = dt.Hour;
-       }
-       }
-
-       if (si != 5 || si != 11)
-       {
-       MAX7219_writeData(MAX7219_DIGIT0, dt.Hour/10);
-       MAX7219_writeData(MAX7219_DIGIT1, dt.Hour%10);
-       MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus);
-       MAX7219_writeData(MAX7219_DIGIT3, dt.Minute/10);
-       MAX7219_writeData(MAX7219_DIGIT4, dt.Minute%10);
-       }
-       else if (si == 5 || si == 11)
-       {
-       MAX7219_writeData(MAX7219_DIGIT0, dt.Day/10);
-       MAX7219_writeData(MAX7219_DIGIT1, dt.Day%10);
-       MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus);
-       MAX7219_writeData(MAX7219_DIGIT3, dt.Month/10);
-       MAX7219_writeData(MAX7219_DIGIT4, dt.Month%10);
-       }
-       */
-      /*
-       if ((si & 1) == 0)
-       {
-       MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorT)/10);
-       MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorT)%10);
-       MAX7219_writeData(MAX7219_DIGIT7, SYM_Temp);
-       }
-       else
-       {
-       MAX7219_writeData(MAX7219_DIGIT5, (int)(SensorH)/10);
-       MAX7219_writeData(MAX7219_DIGIT6, (int)(SensorH)%10);
-       MAX7219_writeData(MAX7219_DIGIT7, SYM_H);
-       }
-       */
-    }
-  /*
-   else // time the same, output blank for "hh mm"
-   {
-   if (si != 5 || si != 11)
-   {
-   MAX7219_writeData(MAX7219_DIGIT2, SYM_BLANK	);
-   }
-   }
-   */
+    /*
+     else // time the same, output blank for "hh mm"
+     {
+     if (si != 5 || si != 11)
+     {
+     MAX7219_writeData(MAX7219_DIGIT2, SYM_BLANK	);
+     }
+     }
+     */
 }
 
 /*
@@ -194,74 +191,74 @@ showTime ()
 void
 process ()
 {
-  TempAndHumidity th;
-  ComfortState cf;
-  static int8_t status;
-
-  if (dht.readTempAndHumidity (th))
-    {
-      status = 0;
-      SensorT = th.temp;
-      SensorH = th.humid;
-      SensorHI = dht.getHeatIndex ();
-      SensorCR = dht.getComfortRatio (cf);
-
-      switch (cf)
+    TempAndHumidity th;
+    ComfortState cf;
+    static int8_t status;
+
+    if (dht.readTempAndHumidity (th))
         {
-        case Comfort_OK:
-          StrCF = "OK";
-          break;
-        case Comfort_TooHot:
-          StrCF = "Too Hot";
-          break;
-        case Comfort_TooCold:
-          StrCF = "Too Cold";
-          break;
-        case Comfort_TooDry:
-          StrCF = "Too Dry";
-          break;
-        case Comfort_TooHumid:
-          StrCF = "Too Humid";
-          break;
-        case Comfort_HotAndHumid:
-          StrCF = "Hot And Humid";
-          break;
-        case Comfort_HotAndDry:
-          StrCF = "Hot And Dry";
-          break;
-        case Comfort_ColdAndHumid:
-          StrCF = "Cold And Humid";
-          break;
-        case Comfort_ColdAndDry:
-          StrCF = "Cold And Dry";
-          break;
-        default:
-          StrCF = "Unknown";
-          break;
+            status = 0;
+            SensorT = th.temp;
+            SensorH = th.humid;
+            SensorHI = dht.getHeatIndex ();
+            SensorCR = dht.getComfortRatio (cf);
+
+            switch (cf)
+                {
+                case Comfort_OK:
+                    StrCF = "OK";
+                    break;
+                case Comfort_TooHot:
+                    StrCF = "Too Hot";
+                    break;
+                case Comfort_TooCold:
+                    StrCF = "Too Cold";
+                    break;
+                case Comfort_TooDry:
+                    StrCF = "Too Dry";
+                    break;
+                case Comfort_TooHumid:
+                    StrCF = "Too Humid";
+                    break;
+                case Comfort_HotAndHumid:
+                    StrCF = "Hot And Humid";
+                    break;
+                case Comfort_HotAndDry:
+                    StrCF = "Hot And Dry";
+                    break;
+                case Comfort_ColdAndHumid:
+                    StrCF = "Cold And Humid";
+                    break;
+                case Comfort_ColdAndDry:
+                    StrCF = "Cold And Dry";
+                    break;
+                default:
+                    StrCF = "Unknown";
+                    break;
+                }
         }
-    }
-  else
-    {
-      /*
-       * В случае, если от датчика ничего не получили, запустим повторный опрос через
-       * 10 секунд, но не более 5 раз подряд.
-       */
-      if (status < 6)
+    else
         {
-          status++;
-          procRTimer.initializeMs (10000, process).startOnce ();
+            /*
+             * В случае, если от датчика ничего не получили, запустим повторный опрос через
+             * 10 секунд, но не более 5 раз подряд.
+             */
+            if (status < 6)
+                {
+                    status++;
+                    procRTimer.initializeMs (10000, process).startOnce ();
+                }
         }
-    }
 }
 
 void
 connectOk ()
 {
-  WifiAccessPoint.enable (false);
-  Serial.print ("I'm connecteed. IP: ");
-  Serial.println (WifiStation.getIP ().toString ());
+    WifiAccessPoint.enable (false);
+    Serial.print ("I'm connecteed. IP: ");
+    Serial.println (WifiStation.getIP ().toString ());
 
-  startWebServer ();
+    startWebServer ();
 }
 
 /*
@@ -270,17 +267,17 @@ connectOk ()
 void
 connectFail ()
 {
-  WifiAccessPoint.config ("MeteoConfig", "", AUTH_OPEN);
-  WifiAccessPoint.enable (true);
-  // Stop main screen output
-  procTimer.stop ();
-  displayTimer.stop ();
+    WifiAccessPoint.config ("MeteoConfig", "", AUTH_OPEN);
+    WifiAccessPoint.enable (true);
+    // Stop main screen output
+    procTimer.stop ();
+    displayTimer.stop ();
 
-  Serial.println ("WiFi MeteoConfig");
-  Serial.println (WifiAccessPoint.getIP ());
+    Serial.println ("WiFi MeteoConfig");
+    Serial.println (WifiAccessPoint.getIP ());
 
-  startWebServer ();
-  WifiStation.waitConnection (connectOk); // Wait connection
+    startWebServer ();
+    WifiStation.waitConnection (connectOk); // Wait connection
 }
 
 /*
@@ -289,7 +286,7 @@ connectFail ()
 void
 onNtpReceive (NtpClient& client, time_t timestamp)
 {
-  SystemClock.setTime (timestamp, eTZ_UTC);
-  NTPLastUpdate = SystemClock.now ();
-  Serial.println ("*** Time synchronized OK! ***"); // DEBUG
+    SystemClock.setTime (timestamp, eTZ_UTC);
+    NTPLastUpdate = SystemClock.now ();
+    Serial.println ("*** Time synchronized OK! ***"); // DEBUG
 }

+ 51 - 34
app/max7219.cpp

@@ -21,46 +21,63 @@
 void
 MAX7219_writeData (uint8_t reg, uint8_t data)
 {
-  PinRes(PIN_LOAD); // опустили защёлку
+	PinRes(PIN_LOAD); // опустили защёлку
 
-  // software spi
-  uint8_t i; // счетчик бит
-  uint16_t sdata = ((reg & 0x000F) << 8) | (data & 0x00FF);
-  for (i = 16; i != 0; i--)
-    {
-      PinRes(PIN_CLK); // выдали строб
-      if (sdata >= 0x8000)
-        { // если старший бит == 1
-          PinSet(PIN_DIN); // MOSI = 1
-        }
-      else
-        { // если старший бит == 0
-          PinRes(PIN_DIN); // MOSI = 0
-        }
-      PinSet(PIN_CLK); // защёлкнули строб
+	// software spi
+	uint8_t i; // счетчик бит
+	uint16_t sdata = ((reg & 0x000F) << 8) | (data & 0x00FF);
+	for (i = 16; i != 0; i--)
+		{
+			PinRes(PIN_CLK); // выдали строб
+			if (sdata >= 0x8000)
+				{ // если старший бит == 1
+					PinSet(PIN_DIN); // MOSI = 1
+				}
+			else
+				{ // если старший бит == 0
+					PinRes(PIN_DIN); // MOSI = 0
+				}
+			PinSet(PIN_CLK); // защёлкнули строб
 
-      sdata <<= 1; // сдвиг влево на 1 бит
-    }
+			sdata <<= 1; // сдвиг влево на 1 бит
+		}
 
-  PinSet(PIN_LOAD); // подняли защёлку
+	PinSet(PIN_LOAD); // подняли защёлку
 
-  PinSet(PIN_DIN);
+	PinSet(PIN_DIN);
 }
 
-void
-MAX7219_Init (void)
+void MAX7219_Init (void)
+{
+	// настройка пинов SPI
+	pinMode (PIN_LOAD, OUTPUT);
+	pinMode (PIN_DIN, OUTPUT);
+	pinMode (PIN_CLK, OUTPUT);
+	PinSet(PIN_LOAD);
+	PinSet(PIN_DIN);
+	PinSet(PIN_CLK);
+
+	// Настройка MAX71219
+	MAX7219_writeData (MAX7219_MODE_DECODE, MAX7219_DIG_MASK);
+	MAX7219_writeData (MAX7219_MODE_SCAN_LIMIT, MAX7219_DIGITS - 1); // Scan limit runs from 0.
+	MAX7219_writeData (MAX7219_MODE_INTENSITY, MAX7219_BRIGHT); // яркость
+	MAX7219_writeData (MAX7219_MODE_POWER, MAX7219_ON); // включили питание
+}
+
+void MAX7219_FillMinus(void)
 {
-  // настройка пинов SPI
-  pinMode (PIN_LOAD, OUTPUT);
-  pinMode (PIN_DIN, OUTPUT);
-  pinMode (PIN_CLK, OUTPUT);
-  PinSet(PIN_LOAD);
-  PinSet(PIN_DIN);
-  PinSet(PIN_CLK);
+	uint8_t i, m = MAX7219_DIG_MASK;
 
-  // Настройка MAX71219
-  MAX7219_writeData (MAX7219_MODE_DECODE, 0xFF); //0x7B); // без BCD декодирования 2, 7
-  MAX7219_writeData (MAX7219_MODE_SCAN_LIMIT, MAX7219_DIGITS - 1); // Scan limit runs from 0.
-  MAX7219_writeData (MAX7219_MODE_INTENSITY, MAX7219_BRIGHT); // яркость
-  MAX7219_writeData (MAX7219_MODE_POWER, MAX7219_ON); // включили питание
+	for (i = 8; i > 0; i--)
+		{
+			if (m >= 0x80)
+				{
+					MAX7219_writeData (i, MAX7219_CHAR_MINUS);
+				}
+			else
+				{
+					MAX7219_writeData (i, SYM_Minus);
+				}
+			m <<= 1;
+		}
 }

+ 9 - 7
include/max7219.h

@@ -10,9 +10,12 @@
 
 // symbols
 // Для BCD
-#define MAX7219_CHAR_BLANK	0x0F
-#define MAX7219_CHAR_MINUS	0x0A
-#define MAX7219_CHAR_FULL	0xFF
+#define MAX7219_CHAR_MINUS	    0x0A
+#define MAX7219_CHAR_E          0x0B
+#define MAX7219_CHAR_H          0x0C
+#define MAX7219_CHAR_L          0x0D
+#define MAX7219_CHAR_P          0x0E
+#define MAX7219_CHAR_BLANK      0x0F
 // без кодирования
 #define SYM_Gradus				0x63
 #define SYM_LGradus				0x1D
@@ -56,9 +59,8 @@
 #define SEG_G					0
 #define SEG_DP					7
 
-void
-MAX7219_writeData (uint8_t data_register, uint8_t data);
-void
-MAX7219_Init (void);
+void MAX7219_writeData (uint8_t data_register, uint8_t data);
+void MAX7219_Init (void);
+void MAX7219_FillMinus(void);
 
 #endif /* INCLUDE_MAX7219_H_ */