dht.ino 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include <EEPROM.h>
  2. #include <SPI.h>
  3. #include <GD2.h>
  4. #define DHTPIN A0
  5. #define UNITS(C) (((C) * 9) / 5 + 32) // Convert from Celsius
  6. #define RISE() do {} while (digitalRead(DHTPIN) == 0)
  7. #define FALL() do {} while (digitalRead(DHTPIN) == 1)
  8. void setup()
  9. {
  10. GD.begin(~GD_STORAGE);
  11. GD.cmd_setrotate(3);
  12. dht_begin();
  13. // demo_data();
  14. }
  15. int cycle;
  16. void loop()
  17. {
  18. int T, H;
  19. dht_sense(T, H);
  20. update_graphs(T, H);
  21. for (int i = 0; i < 720; i++) {
  22. draw_graphs();
  23. delay(1000);
  24. }
  25. }
  26. ///////////////////////////////////////////////////////////////////////
  27. void dht_begin()
  28. {
  29. pinMode(DHTPIN, OUTPUT);
  30. digitalWrite(DHTPIN, HIGH);
  31. delay(1000);
  32. }
  33. int getbit()
  34. {
  35. RISE();
  36. uint32_t t0 = micros();
  37. FALL();
  38. return (micros() - t0) > 48;
  39. }
  40. void dht_sense(int &temp, int &humidity)
  41. {
  42. pinMode(DHTPIN, OUTPUT);
  43. digitalWrite(DHTPIN, LOW);
  44. delay(18);
  45. digitalWrite(DHTPIN, HIGH);
  46. delayMicroseconds(40);
  47. pinMode(DHTPIN, INPUT_PULLUP);
  48. FALL();
  49. getbit();
  50. int bytes[5] = {0};
  51. for (int i = 0; i < 40; i++)
  52. bytes[i / 8] = (bytes[i / 8] << 1) | getbit();
  53. humidity = bytes[0];
  54. temp = UNITS(bytes[2]);
  55. }
  56. ///////////////////////////////////////////////////////////////////////
  57. class Graph
  58. {
  59. public:
  60. int y;
  61. const char *name;
  62. int lo, hi;
  63. uint32_t c0, c1;
  64. int n;
  65. unsigned data[120];
  66. void update(int d) {
  67. for (int i = 0; i < 119; i++)
  68. data[i] = data[i + 1];
  69. data[119] = d;
  70. n = min(120, n + 1);
  71. }
  72. void draw() {
  73. int w = GD.w - 40;
  74. int h = 190;
  75. GD.SaveContext();
  76. GD.ScissorXY(0, y);
  77. GD.ScissorSize(w, h);
  78. GD.cmd_gradient(0, y, c0,
  79. 0, y + h, c1);
  80. GD.ColorA(128);
  81. GD.ColorRGB(0x000000);
  82. GD.cmd_text(5, y + 5, 30, 0, name);
  83. GD.RestoreContext();
  84. GD.LineWidth(PIXELS(0.875));
  85. GD.Begin(LINE_STRIP);
  86. xy p;
  87. for (int i = 120 - n; i < 120; i++) {
  88. p.set(map(i, 0, 120, 0, PIXELS(w)),
  89. map(data[i], lo, hi, PIXELS(y + h), PIXELS(y)));
  90. p.draw();
  91. }
  92. GD.PointSize(PIXELS(5));
  93. GD.Begin(POINTS);
  94. p.set(PIXELS(w),
  95. map(data[119], lo, hi, PIXELS(y + h), PIXELS(y)));
  96. p.draw();
  97. GD.cmd_number((w + GD.w) / 2, y + h / 2, 30, OPT_CENTER, data[119]);
  98. }
  99. };
  100. Graph Tg = { 80, "Temperature", UNITS(5), UNITS(45), 0x721817, 0x2b4162},
  101. Hg = {280, "Humidity", 0, 100, 0x0b6e4f, 0xfa9f42};
  102. void update_graphs(int T, int H)
  103. {
  104. Tg.update(T);
  105. Hg.update(H);
  106. }
  107. void demo_data()
  108. {
  109. for (int i = 0; i < 120; i++) {
  110. Tg.data[i] = GD.random(UNITS(18), UNITS(23)) + GD.rsin(25, i * 300);
  111. Hg.data[i] = GD.random(30, 40) - GD.rsin(10, i * 300);
  112. }
  113. Tg.n = 120;
  114. Hg.n = 120;
  115. }
  116. void draw_graphs()
  117. {
  118. GD.Clear();
  119. GD.cmd_gradient(0, 0, 0x101010, GD.w, GD.h, 0x202060);
  120. Tg.draw();
  121. Hg.draw();
  122. uint32_t s = millis() / 1000; // + 91817UL;
  123. int m = s / 60;
  124. int h = m / 60;
  125. GD.ColorRGB(0xe0e0e2);
  126. GD.cmd_text(0, 20, 28, OPT_CENTERY, "Running");
  127. GD.cmd_number(130, 20, 30, OPT_CENTERY | OPT_RIGHTX, h);
  128. GD.cmd_text( 135, 20, 28, OPT_CENTERY, "h");
  129. GD.cmd_number(188, 20, 30, OPT_CENTERY | OPT_RIGHTX, m % 60);
  130. GD.cmd_text( 193, 20, 28, OPT_CENTERY, "m");
  131. GD.cmd_number(250, 20, 30, OPT_CENTERY | OPT_RIGHTX, s % 60);
  132. GD.cmd_text( 255, 20, 28, OPT_CENTERY, "s");
  133. GD.swap();
  134. }