A simple meter using Adafruit 2.8 TFT with touch v2

Dependencies:   SPI_STMPE610 UniGraphic mbed vt100

/media/uploads/Rhyme/tester_s.jpg

A dumb simple voltage tester using ADC.
With FRDM-KL25Z, you can measure about 0V to 3.28V.
Nothing to drop your jaw nor holding your breath
but I wanted one, so I wrote one ;-)

とても単純はADCを使用した電圧テスターです。
FRDM-KL25Z を使用した場合、0V ~ 3.28V くらいが測定範囲です。
特に目新しいことも、驚くこともありませんが、
自分が欲しいので書いてみました (^ - ^)

On 18-May-2018 
I changed the number display from 0.00 to 0.000
so that I can measure the change of a small loadcell.

2018年5月18日 
ロードセル (重量センサ)の出力値の変化を見たかったので
有効数字を小数点以下2桁から3桁に変更しました。

Files at this revision

API Documentation at this revision

Comitter:
Rhyme
Date:
Fri Jul 21 02:01:05 2017 +0000
Parent:
2:204e60dbd73d
Child:
4:0607a2a46238
Commit message:
Some source code clean-ups done; The first document added

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
meter.cpp Show annotated file Show diff for this revision Revisions of this file
meter.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Fri Jul 21 01:24:53 2017 +0000
+++ b/main.cpp	Fri Jul 21 02:01:05 2017 +0000
@@ -1,20 +1,19 @@
+/**
+ * main.cpp
+ */
 #include "mbed.h"
 #include "ILI9341.h"
-#include "Arial12x12.h"
-#include "Arial24x23.h"
 #include "Arial28x28.h"
-#include "Arial43x48_numb.h"
-#include "SPI_STMPE610.h"
 #include "vt100.h"
 #include "meter.h"
 #include "main.h"
 
+#define ADC_MAX_VALUE 3.28
+
 vt100        *tty = 0 ;
 ILI9341      *tft = 0 ;
-SPI_STMPE610 *tsc = 0 ;
 meter        *tacho = 0 ;
 
-DigitalOut myled(LED1, 1);
 DigitalOut *backlight = 0 ;
 AnalogIn   *vin = 0 ;
 
@@ -39,34 +38,39 @@
     tty = new vt100() ;
     tty->cls() ;
     tft = new ILI9341(SPI_8, 10000000, 
-    PIN_MOSI, PIN_MISO,  PIN_SCLK, 
-    PIN_CS_TFT, PIN_RESET_TFT, PIN_DC_TFT, "Adafruit2.8") ;
+      PIN_MOSI, PIN_MISO,  PIN_SCLK, 
+      PIN_CS_TFT, PIN_RESET_TFT, PIN_DC_TFT, "Adafruit2.8") ;
     initTFT() ;
     tft->set_font((unsigned char*) Arial28x28);
     tft->foreground(White) ;
-//    tsc = new SPI_STMPE610(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TSC) ;
     tacho = new meter(5, 5, 230, 230, 0.0, 3.3) ;
     vin = new AnalogIn(PIN_ADC_CH0) ;
+    *backlight = 1 ;
+}
+
+double getRoundedValue(void)
+{
+    double value = 0.0 ;
+    int intvalue = 0 ;
+    value = ADC_MAX_VALUE * vin->read() ;
+    intvalue = (int)(100.0 * value + 0.5) ;
+    value = (double)intvalue / 100.0 ;
+    return( value ) ;
 }
 
 int main() {
     float value = 0.0 ;
     float prev_value = 0.0 ;
-    int intvalue = 0 ;
+ 
     init_hardware() ;
-    *backlight = 1 ;
-
-    tacho->drawFrame() ;
-    tacho->drawScale() ;
+    tacho->draw(value) ;
+    
     while(1) {
-        value = 3.28 * vin->read() ;
-        intvalue = (int)(100.0 * value + 0.5) ;
-        value = (double)intvalue / 100.0 ;
+        value = getRoundedValue() ;
         if (value != prev_value) {
-            tacho->drawHand(value) ;
-            tacho->drawValue(value) ;
+            tacho->update(value) ;
             prev_value = value ;
         }
-        wait(0.2) ;
+        wait(0.1) ;
     }
 }
--- a/meter.cpp	Fri Jul 21 01:24:53 2017 +0000
+++ b/meter.cpp	Fri Jul 21 02:01:05 2017 +0000
@@ -2,25 +2,18 @@
 #include <math.h>
 #include <string.h>
 #include "ILI9341.h"
-#include "Arial12x12.h"
-#include "Arial24x23.h"
 #include "Arial28x28.h"
-#include "Arial43x48_numb.h"
-#include "SPI_STMPE610.h"
 #include "meter.h"
-#include "vt100.h"
 #include "main.h"
 
 #ifndef M_PI
 #define M_PI 3.141593
 #endif
 
-extern vt100        *tty ;
 extern ILI9341      *tft ;
-extern SPI_STMPE610 *tsc ;
 extern meter        *tacho ;
-double SIN[451] ;
-double COS[451] ;
+double SIN[451] ; /* sin table for 45 to 90 degrees in 0.1 deg step */
+double COS[451] ; /* cos table for 45 to 90 degrees in 0.1 deg step */
 
 static void fillTriTable(void)
 {
@@ -39,7 +32,6 @@
     _y = y ;
     _w = width ;
     _h = height ;
-    _value = min ;
     _min = min ;
     _max = max ;
     _center_x = _x + _w / 2 ;
@@ -97,11 +89,11 @@
     if (theta < 0.0) { theta = 0.0 ; }
     if (theta > 90.0) { theta = 90.0 ; }
     if (theta > 45.0) {
-        i = (10.0 * (90.0 - theta + 45.0) + 0.5) - 450  ; 
-        x1 = _center_x -(radius * COS[i] + 0.5) ;
-        x2 = _center_x -((radius + append) * COS[i] + 0.5) ;
+        i = (10.0 * (90.0 - theta) + 0.5) ; 
+        x1 = _center_x - (radius * COS[i] + 0.5) ;
+        x2 = _center_x - ((radius + append) * COS[i] + 0.5) ;
     } else {
-        i = (10.0 * (theta + 45.0) + 0.5) - 450 ;
+        i = (10.0 * theta + 0.5) ;
         x1 = _center_x + (radius * COS[i] + 0.5) ;
         x2 = _center_x + ((radius + append) * COS[i] + 0.5) ;
     }
@@ -109,8 +101,8 @@
     y1 = _center_y - (radius * SIN[i] + 0.5) ;
     y2 = _center_y - ((radius + append) * SIN[i] + 0.5) ;
     tft->BusEnable(true) ;
-    tft->line(prev_x1, prev_y1, prev_x2, prev_y2, White) ;
-    tft->line(x1, y1, x2, y2, Black) ;
+    tft->line(prev_x1, prev_y1, prev_x2, prev_y2, White) ; /* erase prev */
+    tft->line(x1, y1, x2, y2, Black) ;                     /* draw current */
     tft->BusEnable(false) ;
     prev_x1 = x1 ;
     prev_x2 = x2 ;
@@ -118,14 +110,13 @@
     prev_y2 = y2 ;
 }
 
-void meter::draw(void) 
-{
-}
-
 void meter::draw(float value) 
 {
     tft->BusEnable(true) ;
-    drawHand(_value) ;
+    drawFrame() ;
+    drawScale() ;
+    drawHand(value) ;
+    drawValue(value) ;
     tft->BusEnable(false) ;
 }
 
@@ -145,4 +136,8 @@
 
 void meter::update(float value) 
 {
+    tft->BusEnable(true) ;
+    drawHand(value) ;
+    drawValue(value) ;
+    tft->BusEnable(false) ;
 }
\ No newline at end of file
--- a/meter.h	Fri Jul 21 01:24:53 2017 +0000
+++ b/meter.h	Fri Jul 21 02:01:05 2017 +0000
@@ -1,16 +1,59 @@
 #ifndef _METER_H_
 #define _METER_H_
+/**
+ * meter class 
+ * A simple analog style meter
+ **/
 
 class meter {
 public:
+/**
+ * meter constructor
+ * @param x right-top position of meter
+ * @param y right-top position of meter
+ * @param width width of meter
+ * @param height height of meter
+ * @param min minimum value of meter
+ * @param max maximum value of meter
+ */
 meter(int x, int y, int width, int height, float min, float max) ;
+
+/**
+ * meter destructor
+ */
 ~meter(void) ;
+
+/**
+ * drawFrame draw meter frame/canvas
+ */
 void drawFrame(void) ;
+
+/**
+ * drawScale draw measuring mark 
+ */
 void drawScale(void) ;
+
+/**
+ * drawHand draw meter hand at value position
+ * @param value value to plot the hand
+ */
 void drawHand(float value) ;
+
+/**
+ * drawValue draw textual value in the lower part of the meter
+ * @param value value to display (voltage assumed)
+ */
 void drawValue(float value) ;
-void draw(void) ;
+
+/**
+ * draw draw full set of the meter
+ * @param value value to display and put hand
+ */
 void draw(float value) ;
+
+/**
+ * update draw only hand and value text
+ */
 void update(float value) ;
 
 private:
@@ -20,7 +63,6 @@
 int _h ;
 int _center_x ;
 int _center_y ;
-float _value ;
 float _min ;
 float _max ;