Snippets

Peter Scargill Uninterruptible for Pi and other boards - using Atmega 328 processor

Updated by Peter Scargill

File uninterruptible.c Modified

  • Ignore whitespace
  • Hide word diff
           {
             gotoXY(0, 3);
             if (mySecs & 2) {
-              LcdP("On=%04ldd %02ld:%02ld:%02ld", upSecs / 86400, (upSecs / 3600) % 24, (upSecs % 3600) / 60, upSecs % 60);
+              LcdP("On= %04ldd %02ld:%02ld:%02ld", upSecs / 86400, (upSecs / 3600) % 24, (upSecs % 3600) / 60, upSecs % 60);
               oled.clearToEOL();
             }
             else          {
Updated by Peter Scargill

File uninterruptible.c Modified

  • Ignore whitespace
  • Hide word diff
     vol = (((float)average) * 5.0 / 824.0) * (float)eeSave.batteryOffset / 400.0; //10k/2k2
     if ((mySecs%60)==0) logPause++;
     mySecs++;
-    if (++logPause>eeSave.pause) // log 128 values 0-30 = 0-5v  -  2 secs updating for testing
+    if (logPause>eeSave.pause) // log 128 values 0-30 = 0-5v  -  2 secs updating for testing
     {
       logPause=0; 
       for (int a=0;a<127;a++) logit[a]=logit[a+1];
Updated by Peter Scargill

File uninterruptible.c Modified

  • Ignore whitespace
  • Hide word diff
 uint8_t dKeypressed = 0;
 
 uint8_t logit[128];
-uint16_t logpause=0;
+uint16_t logPause=0;
 
 void gotoXY(int x, int y)
 {
   if (mymillis <= millis())
   {
     mymillis += 1000; // every second we do this
-    mySecs++;
     average = ((average * 7) + analogRead(VOLTAGE)) / 8; //i.e. average over 8 seconds 0-1023 = 0-5v - might make testing longer in the end
     vol = (((float)average) * 5.0 / 824.0) * (float)eeSave.batteryOffset / 400.0; //10k/2k2
-
-    if (++logpause>eeSave.pause) // log 128 values 0-30 = 0-5v  -  2 secs updating for testing
+    if ((mySecs%60)==0) logPause++;
+    mySecs++;
+    if (++logPause>eeSave.pause) // log 128 values 0-30 = 0-5v  -  2 secs updating for testing
     {
-      logpause=0; 
+      logPause=0; 
       for (int a=0;a<127;a++) logit[a]=logit[a+1];
       logit[126]=((int)(vol*6.0));
     }
Updated by Peter Scargill

File uninterruptible.c Modified

  • Ignore whitespace
  • Hide word diff
 {
   EEPROM.get(0, eeSave);
   analogReference(INTERNAL);
-  if (eeSave.check != 0x52d3)
+  if (eeSave.check != 0x52d1)
   {
-    eeSave.check = 0x52d3;
+    eeSave.check = 0x52d1;
 
     eeSave.highV = SWITCHON;
     eeSave.lowV = SWITCHOFF;
       case 11:  if (updated == 0)
         {
           gotoXY(0, 3);
-          LcdP("Log period=%d mins"); oled.clearToEOL();
+          LcdP("Log period=%d mins",eeSave.pause); oled.clearToEOL();
           updated = 1;
         }
         break;  
     average = ((average * 7) + analogRead(VOLTAGE)) / 8; //i.e. average over 8 seconds 0-1023 = 0-5v - might make testing longer in the end
     vol = (((float)average) * 5.0 / 824.0) * (float)eeSave.batteryOffset / 400.0; //10k/2k2
 
-    if (++logpause>2) // log 128 values 0-30 = 0-5v  -  2 secs updating for testing
+    if (++logpause>eeSave.pause) // log 128 values 0-30 = 0-5v  -  2 secs updating for testing
     {
       logpause=0; 
       for (int a=0;a<127;a++) logit[a]=logit[a+1];
Updated by Peter Scargill

File uninterruptible.c Modified

  • Ignore whitespace
  • Hide word diff
 // - Added serial JSON (optional) monitor
 // - Watchdog timeout from 1 minute through 255 minutes - change of state pin WATCHDOG
 //  In normal operation shows total on time and total off time
+// = new logging graphics - long-press SET button to see 0-5v battery over time
 //
 // Use 328-based board similar regulator (pref low loss) and no USB chip. If possible
 // run OLED off 3v3.
 // Blog has more - as does this video https://www.youtube.com/watch?v=44Lvdf7o4GQ
 // Now set up for the 32-pixel displays - got everything down to 4 lines
 
-#define VER "v1.11"
+#define VER "v1.12"
 struct
 {
   uint16_t check;
   uint16_t tone;
   uint8_t smon;
   uint8_t watchdog;
+  uint16_t pause;
+  
 } eeSave;
 
 // Device address for the SSD1306 display
 #define SWITCHON 3.7    // defaults for hysteresis voltage
 #define SWITCHOFF 3.1
 
-#define LONGPRESS_UP 60   // 10ths of second before long presson UP triggers shutdown
-#define LONGPRESS_DOWN 60 // 10ths of second before battery fail test
-
+#define LONGPRESS_UP 20   // 10ths of second before long presson UP triggers shutdown
+#define LONGPRESS_DOWN 20 // 10ths of second before battery fail test
+#define LONGPRESS_SET 20 // 10ths of second before graphics display
+#define SHOWGRAPH 10     // 10 seconds showing graphical info
 #define SHUTDOWN_PERIOD 20
 
 #define SET 4
 
 #define VOLTAGE A7
 
+uint8_t showGraph=0;
+
 uint32_t secs = 0;
 uint32_t upSecs = 0;
 uint32_t downSecs = 0;
 
-uint16_t longpressedUp = 0 ;
-uint16_t longpressedDown = 0;
-
 uint8_t triggerShutdown = 0;
 
 uint32_t mySecs = 0;
 uint8_t watchdogTimer = 0;
 uint8_t watchdogState = 0;
 uint8_t secondsCounter = 0;
+uint8_t refresh=0;
 
 void LcdP(char *fmt, ...)
 {
-  char buf[128]; // resulting string limited to 128 chars
+  char buf[22]; // resulting string limited to 128 chars
   va_list args;
   va_start(args, fmt);
   vsnprintf(buf, 128, fmt, args);
 uint8_t uKeypressed = 0;
 uint8_t dKeypressed = 0;
 
-void p(char *fmt, ...)
-{
-  char buf[128]; // resulting string limited to 128 chars
-  va_list args;
-  va_start(args, fmt);
-  vsnprintf(buf, 128, fmt, args);
-  va_end(args);
-  Serial.print(buf);
-}
+uint8_t logit[128];
+uint16_t logpause=0;
 
 void gotoXY(int x, int y)
 {
 {
   EEPROM.get(0, eeSave);
   analogReference(INTERNAL);
-  if (eeSave.check != 0x52d5)
+  if (eeSave.check != 0x52d3)
   {
-    eeSave.check = 0x52d5;
+    eeSave.check = 0x52d3;
 
     eeSave.highV = SWITCHON;
     eeSave.lowV = SWITCHOFF;
     eeSave.tone = 0;
     eeSave.smon = 0;
     eeSave.watchdog = 0;
+    eeSave.pause=1;
     EEPROM.put(0, eeSave);
   }
 
         watchdogState = digitalRead(WATCHDOG);
       }
     }
-    if (digitalRead(SET) == 0)
+     if (digitalRead(SET) == 1)
     {
-      if (sKeypressed == 0)
-      {
-        sKeypressed = 1;
-        instate++;
-        updated = 0;
-        updateTimeout = 100;
+      if (sKeypressed)
+      {  if (sKeypressed<LONGPRESS_SET) 
+          {
+            if (showGraph) { showGraph=0; oled.clear(); instate=255              ; sKeypressed=0;  refresh=1; }
+            instate++;
+            updated = 0;
+            updateTimeout = 100;
+          }
+       sKeypressed=0;
       }
     }
     else
-      sKeypressed = 0;
+      {
+        sKeypressed++; 
+        if (sKeypressed==LONGPRESS_SET) showGraph = SHOWGRAPH;
+        if (sKeypressed>>LONGPRESS_SET) sKeypressed--;
+      }
+
 
-    if (digitalRead(UP) == 0) // special case long press is reset...
+    if (digitalRead(UP) == 1) // special case long press is reset...
     {
-      if (uKeypressed == 0)
+      if (uKeypressed)
       {
-        uKeypressed = 1;
-        switch (instate)
-        {
-          case 1 : if (eeSave.highV < 4.3) eeSave.highV += 0.1; break;
-          case 2 : if (eeSave.lowV < 4.2) eeSave.lowV += 0.1; break;
-          case 3 : eeSave.startTimeout++; break;
-          case 4 : eeSave.goodTimeout++; break;
-          case 5 : eeSave.warningTimeout++; break;
-          case 6 : eeSave.offTimeout++; break;
-          case 7 : eeSave.batteryOffset++; break;
-          case 8 : if (eeSave.tone < 5000) eeSave.tone += 500; else eeSave.tone = 0; break;
-          case 9 : eeSave.smon = 1; break;
-          case 10 : eeSave.watchdog++;
-            watchdogTimer = eeSave.watchdog; watchdogTrigger = 0; break;
+       if (uKeypressed<LONGPRESS_UP) 
+       {
+          switch (instate)
+          {
+            case 1 : if (eeSave.highV < 4.3) eeSave.highV += 0.1; break;
+            case 2 : if (eeSave.lowV < 4.2) eeSave.lowV += 0.1; break;
+            case 3 : eeSave.startTimeout++; break;
+            case 4 : eeSave.goodTimeout++; break;
+            case 5 : eeSave.warningTimeout++; break;
+            case 6 : eeSave.offTimeout++; break;
+            case 7 : eeSave.batteryOffset++; break;
+            case 8 : if (eeSave.tone < 5000) eeSave.tone += 500; else eeSave.tone = 0; break;
+            case 9 : eeSave.smon = 1; break;
+            case 10 : eeSave.watchdog++;
+              watchdogTimer = eeSave.watchdog; watchdogTrigger = 0; break;
+            case 11: eeSave.pause++; break;
+          }
+          updated = 0;
+          updateTimeout = 100;
         }
-        updated = 0;
-        updateTimeout = 100;
-      }
-      else
-      {
-        if (++longpressedUp == LONGPRESS_UP) triggerShutdown = 1;
+        uKeypressed=0;
       }
     }
     else
     {
-      uKeypressed = 0;
-      longpressedUp = 0;
+      uKeypressed++;
+      if (uKeypressed==LONGPRESS_UP) triggerShutdown = 1;
+      if (uKeypressed>LONGPRESS_UP) uKeypressed--;                                                                         
     }
 
-    if (digitalRead(DOWN) == 0)
+    if (digitalRead(DOWN) == 1)
     {
-      if (dKeypressed == 0)
+      if (dKeypressed)
       {
-        dKeypressed = 1;
-        switch (instate)
+        if (dKeypressed<LONGPRESS_DOWN)
         {
-          case 1 : if (eeSave.highV > 2.3) eeSave.highV -= 0.1; break;
-          case 2 : if (eeSave.lowV > 2.2) eeSave.lowV -= 0.1; break;
-          case 3 : eeSave.startTimeout--; break;
-          case 4 : eeSave.goodTimeout--; break;
-          case 5 : eeSave.warningTimeout--; break;
-          case 6 : eeSave.offTimeout--; break;
-          case 7 : eeSave.batteryOffset--; break;
-          case 8 : if (eeSave.tone >= 500) eeSave.tone -= 500; break;
-          case 9 : eeSave.smon = 0; break;
-          case 10 : if (eeSave.watchdog) eeSave.watchdog--;
-            watchdogTimer = eeSave.watchdog; watchdogTrigger = 0; break;
+          switch (instate)
+          {
+            case 1 : if (eeSave.highV > 2.3) eeSave.highV -= 0.1; break;
+            case 2 : if (eeSave.lowV > 2.2) eeSave.lowV -= 0.1; break;
+            case 3 : eeSave.startTimeout--; break;
+            case 4 : eeSave.goodTimeout--; break;
+            case 5 : eeSave.warningTimeout--; break;
+            case 6 : eeSave.offTimeout--; break;
+            case 7 : eeSave.batteryOffset--; break;
+            case 8 : if (eeSave.tone >= 500) eeSave.tone -= 500; break;
+            case 9 : eeSave.smon = 0; break;
+            case 10 : if (eeSave.watchdog) eeSave.watchdog--;
+              watchdogTimer = eeSave.watchdog; watchdogTrigger = 0; break;
+            case 11 : if (eeSave.pause>1) eeSave.pause--; break;
+          }
+          updated = 0;
+          updateTimeout = 100;
         }
-        updated = 0;
-        updateTimeout = 100;
-      }
-      else
-      {
-        if (++longpressedDown == LONGPRESS_DOWN) average = 0; // temporarily drop the voltage and hence trigger warning
+       dKeypressed = 0;
       }
     }
     else
     {
-      dKeypressed = 0;
-      longpressedDown = 0;
+      dKeypressed++;
+      if (dKeypressed==LONGPRESS_DOWN) average=0;
+      if (dKeypressed>LONGPRESS_DOWN) dKeypressed--;
     }
 
     if (eeSave.highV <= eeSave.lowV) eeSave.highV = eeSave.lowV + 0.1;
       case 11:  if (updated == 0)
         {
           gotoXY(0, 3);
+          LcdP("Log period=%d mins"); oled.clearToEOL();
+          updated = 1;
+        }
+        break;  
+      case 12:  if (updated == 0)
+        {
+          gotoXY(0, 3);
           LcdP("Version=%s", VER); oled.clearToEOL();
           updated = 1;
         }
-        break;
-      case 12:  updated = 0; instate = 0; break;
+        break;     
+      case 13:  updated = 0; instate = 0; break;
     }
 
     if (updateTimeout)
     average = ((average * 7) + analogRead(VOLTAGE)) / 8; //i.e. average over 8 seconds 0-1023 = 0-5v - might make testing longer in the end
     vol = (((float)average) * 5.0 / 824.0) * (float)eeSave.batteryOffset / 400.0; //10k/2k2
 
+    if (++logpause>2) // log 128 values 0-30 = 0-5v  -  2 secs updating for testing
+    {
+      logpause=0; 
+      for (int a=0;a<127;a++) logit[a]=logit[a+1];
+      logit[126]=((int)(vol*6.0));
+    }
+
     if (triggerShutdown) {
       triggerShutdown = 0;
       state = SHUTDOWN_STATE;
 
     if (eeSave.smon) Serial.println(bString);
 
+    if (showGraph)
+    {
+      if (showGraph==SHOWGRAPH) 
+        {
+          uint8_t val;
+          oled.clear();
+          oled.setCursor(0,0);
+          for (int a=0;a<128;a++)
+            {
+              uint32_t point=(0x80000000>>logit[a])|0x80000001;
+              if ((a==0)||(a==127)) point=0xffffffff;
+              oled.setCursor(a,0); oled.ssd1306WriteRamBuf((uint8_t)((point)&255));
+              oled.setCursor(a,1); oled.ssd1306WriteRamBuf((uint8_t)((point>>8)&255));;
+              oled.setCursor(a,2); oled.ssd1306WriteRamBuf((uint8_t)((point>>16)&255));
+              oled.setCursor(a,3); oled.ssd1306WriteRamBuf((uint8_t)((point>>24)&255));              
+            } 
+          oled.setCursor(0,0);    
+        }
+      showGraph--; if (showGraph==0) refresh=1;
+    }
+    else
+    {
     switch (state)
     {
       case POWERUP_STATE : // powered up everything off
         secondsCounter = 0;
-        if (stateCounter == eeSave.startTimeout) {
+        if ((stateCounter == eeSave.startTimeout) || (refresh)) {
+          refresh=0; 
           gotoXY(0, 0);
           LcdP("Starting up..");
-          oled.clearToEOL();
+          oled.clearToEOL(); 
         }
-        --stateCounter;
+        if (stateCounter) --stateCounter;
         gotoXY(0, 1); LcdP("Bat="); showBattery();
         gotoXY(0, 2); LcdP("Wait=%03d secs", stateCounter); oled.clearToEOL();
         digitalWrite(WARNING, WARNINGON); // no warning
         break;
 
       case GOOD_STATE :  // battery is above upper threshold
-        if (stateCounter == eeSave.goodTimeout) {
+        if ((stateCounter == eeSave.goodTimeout) || (refresh)) {
+          refresh=0;
           gotoXY(0, 0);
           LcdP("** Pi Power %s **", VER);
           oled.clearToEOL();
           watchdogTimer = eeSave.watchdog;
         }
-        --stateCounter;
+        if (stateCounter) --stateCounter;
         if (++secondsCounter == 60)
         {
           secondsCounter = 0;
 
       case TIMEOUT_STATE : // battery has dropped below upper threshold - ALWAYS timeout to OFF_STATE
         secondsCounter = 0;
-        if (stateCounter == eeSave.warningTimeout) oled.clear();
+        if ((stateCounter == eeSave.warningTimeout) || (refresh)) { refresh=0; oled.clear(); }
         gotoXY(0, 0); LcdP("Timoutout. Bat="); showBattery();
         gotoXY(0, 1); LcdP("Wait=%03d secs", stateCounter); oled.clearToEOL();
         digitalWrite(WARNING, WARNINGON); // warning
         digitalWrite(POWER, POWERON);
         if (eeSave.tone) tone(TONE, eeSave.tone, 100);
-        --stateCounter;
+        if (stateCounter) --stateCounter;
         if (stateCounter == 0 ) {
           stateCounter = eeSave.offTimeout;
           state = OFF_STATE;
 
       case OFF_STATE : // everything off
         secondsCounter = 0;
-        if (stateCounter == eeSave.offTimeout) oled.clear();
-        --stateCounter;
+        if ((stateCounter == eeSave.offTimeout) || (refresh)) { refresh=0; oled.clear(); }
+        if (stateCounter) --stateCounter;
         if (vol <= eeSave.highV)  {
           gotoXY(0, 0);
           LcdP("Stdby. Bat=");
         } else
         {
           stateCounter = eeSave.offTimeout - 1; // avoid clearscreen
-          gotoXY(0, 3); oled.clearToEOL();
+        //  gotoXY(0, 3); oled.clearToEOL();
         }
         ++downSecs;
         break;
 
       case SHUTDOWN_STATE: // everything off and stays off... hold the SET button.... set state to SHUTDOWN_STATE and stateCounter to SHUTDOWN_PERIOD
         secondsCounter = 0;
-        if (stateCounter == SHUTDOWN_PERIOD)
+        if ((stateCounter == SHUTDOWN_PERIOD) || (refresh))
         {
+          refresh=0;
           oled.clear();
           gotoXY(0, 2); LcdP("Shutdown commencing.."); oled.clearToEOL();
           digitalWrite(WARNING, WARNINGON); // warning
           stateCounter = eeSave.startTimeout;
         }
     }
+   }
   }
-}
+}
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.