Browse Source

DHT sparkline example

[#20]
James Bowman 6 years ago
parent
commit
4530a3a6ba
1 changed files with 123 additions and 16 deletions
  1. 123 16
      contrib/dht.ino

+ 123 - 16
contrib/dht.ino

@@ -4,13 +4,39 @@
 
 #define DHTPIN  A0
 
+#define UNITS(C)  (((C) * 9) / 5 + 32)    // Convert from Celsius
+
 #define RISE()   do {} while (digitalRead(DHTPIN) == 0)
 #define FALL()   do {} while (digitalRead(DHTPIN) == 1)
 
 void setup()
 {
-  Serial.begin(1000000);
+  GD.begin(~GD_STORAGE);
+  GD.cmd_setrotate(3);
+
+  dht_begin();
+  // demo_data();
+}
+
+int cycle;
+
+void loop()
+{
+  int T, H;
+
+  dht_sense(T, H);
+  update_graphs(T, H);
+
+  for (int i = 0; i < 720; i++) {
+    draw_graphs();
+    delay(1000);
+  }
+}
+
+///////////////////////////////////////////////////////////////////////
 
+void dht_begin()
+{
   pinMode(DHTPIN, OUTPUT);
   digitalWrite(DHTPIN, HIGH);
   delay(1000);
@@ -24,7 +50,7 @@ int getbit()
   return (micros() - t0) > 48;
 }
 
-void loop()
+void dht_sense(int &temp, int &humidity)
 {
   pinMode(DHTPIN, OUTPUT);
   digitalWrite(DHTPIN, LOW);
@@ -36,22 +62,103 @@ void loop()
   FALL();
   getbit();
 
-  int bits[40];
-  for (int i = 0; i < 40; i++)
-    bits[i] = getbit();
-  for (int i = 0; i < 40; i++) {
-    Serial.print(i);
-    Serial.print(' ');
-    Serial.println(bits[i]);
-  }
   int bytes[5] = {0};
   for (int i = 0; i < 40; i++)
-    bytes[i / 8] = (bytes[i / 8] << 1) | bits[i];
-  for (int i = 0; i < 5; i++) {
-    Serial.print(bytes[i]);
-    Serial.print(' ');
+    bytes[i / 8] = (bytes[i / 8] << 1) | getbit();
+  humidity = bytes[0];
+  temp = UNITS(bytes[2]);
+}
+
+///////////////////////////////////////////////////////////////////////
+
+class Graph
+{
+public:
+  int y;
+  const char *name;
+  int lo, hi;
+  uint32_t c0, c1;
+  int n;
+  unsigned data[120];
+  void update(int d) {
+    for (int i = 0; i < 119; i++)
+      data[i] = data[i + 1];
+    data[119] = d;
+    n = min(120, n + 1);
   }
-  Serial.println();
+  void draw() {
+    int w = GD.w - 40;
+    int h = 190;
+    GD.SaveContext();
+
+    GD.ScissorXY(0, y);
+    GD.ScissorSize(w, h);
+    GD.cmd_gradient(0, y, c0,
+                    0, y + h, c1);
+    GD.ColorA(128);
+    GD.ColorRGB(0x000000);
+    GD.cmd_text(5, y + 5, 30, 0, name);
+    GD.RestoreContext();
+
+    GD.LineWidth(PIXELS(0.875));
+    GD.Begin(LINE_STRIP);
+    xy p;
+    for (int i = 120 - n; i < 120; i++) {
+      p.set(map(i, 0, 120, 0, PIXELS(w)),
+            map(data[i], lo, hi, PIXELS(y + h), PIXELS(y)));
+      p.draw();
+    }
+    GD.PointSize(PIXELS(5));
+    GD.Begin(POINTS);
+    p.set(PIXELS(w),
+          map(data[119], lo, hi, PIXELS(y + h), PIXELS(y)));
+    p.draw();
+    GD.cmd_number((w + GD.w) / 2, y + h / 2, 30, OPT_CENTER, data[119]);
+  }
+};
+
+Graph Tg = { 80, "Temperature", UNITS(5), UNITS(45), 0x721817, 0x2b4162},
+      Hg = {280, "Humidity",    0,        100,       0x0b6e4f, 0xfa9f42};
+
+void update_graphs(int T, int H)
+{
+  Tg.update(T);
+  Hg.update(H);
+}
+
+void demo_data()
+{
+  for (int i = 0; i < 120; i++) {
+    Tg.data[i] = GD.random(UNITS(18), UNITS(23)) + GD.rsin(25, i * 300);
+    Hg.data[i] = GD.random(30, 40) - GD.rsin(10, i * 300);
+  }
+  Tg.n = 120;
+  Hg.n = 120;
+}
+
+void draw_graphs()
+{
+  GD.Clear();
+  GD.cmd_gradient(0, 0, 0x101010, GD.w, GD.h, 0x202060);
+
+  Tg.draw();
+  Hg.draw();
+
+  uint32_t s = millis() / 1000; //  + 91817UL;
+  int m = s / 60;
+  int h = m / 60;
+
+  GD.ColorRGB(0xe0e0e2);
+  GD.cmd_text(0, 20, 28, OPT_CENTERY, "Running");
+
+  GD.cmd_number(130, 20, 30, OPT_CENTERY | OPT_RIGHTX, h);
+  GD.cmd_text(  135, 20, 28, OPT_CENTERY, "h");
+
+  GD.cmd_number(188, 20, 30, OPT_CENTERY | OPT_RIGHTX, m % 60);
+  GD.cmd_text(  193, 20, 28, OPT_CENTERY, "m");
+
+  GD.cmd_number(250, 20, 30, OPT_CENTERY | OPT_RIGHTX, s % 60);
+  GD.cmd_text(  255, 20, 28, OPT_CENTERY, "s");
 
-  delay(6000);
+  GD.swap();
 }