151 lines
4.2 KiB
C++
151 lines
4.2 KiB
C++
//example adapted from somewhere but cannot remember!
|
|
//If the author recognize it drop me a note!
|
|
|
|
#include <SPI.h>
|
|
#include <Adafruit_GFX.h>
|
|
#include <TFT_ILI9163C.h>
|
|
|
|
// Color definitions
|
|
#define BLACK 0x0000
|
|
#define BLUE 0x001F
|
|
#define RED 0xF800
|
|
#define GREEN 0x07E0
|
|
#define CYAN 0x07FF
|
|
#define MAGENTA 0xF81F
|
|
#define YELLOW 0xFFE0
|
|
#define WHITE 0xFFFF
|
|
|
|
#define NBINS 8
|
|
const uint8_t bar_Width = 7;
|
|
uint32_t avrg_TmrF = 0;
|
|
uint16_t t_b[NBINS];
|
|
|
|
/*
|
|
Teensy3.x and Arduino's
|
|
You are using 4 wire SPI here, so:
|
|
MOSI: 11//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
|
|
MISO: 12//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
|
|
SCK: 13//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
|
|
the rest of pin below:
|
|
*/
|
|
#define __CS 10
|
|
#define __DC 9
|
|
/*
|
|
Teensy 3.x can use: 2,6,9,10,15,20,21,22,23
|
|
Arduino's 8 bit: any
|
|
DUE: check arduino site
|
|
If you do not use reset, tie it to +3V3
|
|
*/
|
|
|
|
|
|
TFT_ILI9163C tft = TFT_ILI9163C(__CS, __DC);
|
|
|
|
|
|
void setup(void) {
|
|
Serial.begin(38400);
|
|
tft.begin();
|
|
tft.setRotation(1);
|
|
tft.fillScreen(BLACK);
|
|
tft.setTextWrap(true);
|
|
tft.setTextColor(WHITE,BLACK);
|
|
tft.setCursor(0,0);
|
|
Draw_Table();
|
|
}
|
|
|
|
|
|
void loop(){
|
|
for (int i=0;i<NBINS;i++){
|
|
t_b[i] = random(0,4096);
|
|
}
|
|
Print_Data();
|
|
delay(100);
|
|
}
|
|
|
|
void Draw_Table(void)
|
|
{
|
|
tft.drawFastVLine( 22, 0, 128, WHITE); // Draw a Scale
|
|
tft.drawFastHLine( 20, 0, 4, WHITE);
|
|
for ( int i = 10; i < 128; i += 10 ) {
|
|
tft.drawFastHLine( 20, i, 4, WHITE);
|
|
tft.setCursor( 0, i - 3);
|
|
//if ( i < 60 )
|
|
if ( i < 120 )
|
|
tft.print( i * 1.2,0);
|
|
else
|
|
tft.print(" dB");
|
|
}
|
|
tft.setCursor( 96, 1); // Digital display on right side
|
|
tft.print("T H D");
|
|
|
|
tft.setCursor( 96, 23);
|
|
tft.print("F R Q");
|
|
|
|
tft.setCursor( 96, 45);
|
|
tft.print("R M S");
|
|
}
|
|
|
|
|
|
void Print_Data(void)
|
|
{
|
|
float frequency = 0.0;
|
|
float total_thd = 0.0;
|
|
float voltag_ac = 0.0;
|
|
|
|
avrg_TmrF >>= 4;
|
|
if (avrg_TmrF != 0) frequency = (8.0 * 16000000.0) / avrg_TmrF;
|
|
avrg_TmrF = 0;
|
|
//--------------------- FREQ ---------------
|
|
tft.setCursor(96,33);
|
|
if (frequency < 99) {
|
|
tft.print(frequency,2);
|
|
}
|
|
else{
|
|
tft.print("...");
|
|
}
|
|
|
|
/*THD: Total Harmonic Distortion. The harmonic distortion characterises the ratio of the sum of the
|
|
harmonics to the fundamental signal. Normally there are the first 6 harmonics used for the
|
|
characterisation.
|
|
THD = 20 * log (SQRT (SUM (SQR ([Harmonics]))) / [Fundamental])*/
|
|
// ---------------- Vertical VU's ------------------------------------------
|
|
uint32_t total1 = 0; // ALL
|
|
uint32_t total2 = 0; // All, Except Fundamental (1).
|
|
uint16_t fnd = 0; // Fundamental
|
|
|
|
for (int i = 1; i < NBINS; i++) {
|
|
int st1 = (i * 10) + 15; // k = 70 / (NBINS -1)
|
|
tft.drawRect((st1-1),0,bar_Width,128,WHITE); // Volume
|
|
uint32_t vremn1 = t_b[i] >> 4; // V(i) / updt_Rate
|
|
uint32_t vremn2 = vremn1 * vremn1; // V(i) ^ 2.
|
|
total1 += vremn2; // Total1 = V1^2 + V2^2 + V3^2 + V4^2 + V5^2
|
|
if (i != 1)
|
|
total2 += vremn2; // Total2 = V2^2 + V3^2 + V4^2 + V5^2
|
|
else
|
|
fnd = vremn1; // Fundamental = V1
|
|
vremn2 = 20 * log10(vremn1+1); // !!! +1 MUST,
|
|
int st2 = map(vremn2,0,73,(128-2),0); // 73 dB
|
|
tft.fillRect(st1,1,(bar_Width-2),st2,BLACK); // Empty
|
|
tft.fillRect(st1,(st2 + 2),(bar_Width-2),(128-2-st2),GREEN); // Fill Up
|
|
t_b[i] = 0;
|
|
}
|
|
|
|
voltag_ac = sqrt(total1) / 20.27; // Hardware Calibration Coefficient /0.39752907
|
|
//-------------RMS--------------------
|
|
tft.setCursor(96,55);
|
|
if (voltag_ac < 999) {
|
|
tft.print(voltag_ac,1);
|
|
}
|
|
else{
|
|
tft.print( "...");
|
|
}
|
|
|
|
total_thd = 100.0 * sqrt(total2) / fnd;
|
|
//-------------THD ------------------------
|
|
tft.setCursor(96,11);
|
|
if (total_thd < 9) {
|
|
tft.print(total_thd,3);
|
|
}
|
|
else{
|
|
tft.print( "...");
|
|
}
|
|
} |