// UTFT_Demo_320x240_Serial
// Copyright (C)2015 Rinky-Dink Electronics, Henning Karlsen. All right reserved
// web: http://www.RinkyDinkElectronics.com/
//
// This program is a demo of how to use most of the functions
// of the library with a supported display modules.
//
// This demo was made for serial modules with a screen
// resolution of 320x240 pixels.
//
// This program requires the UTFT library.
//
// ********************************************************************
// * IMPORTANT: Read the comments in the setup() function when *
// * using the Watterott MI0283QT9 or the DisplayModule DM-TFT28-105. *
// ********************************************************************
//Pete Here> 5/14/2018 Got this to work with all functions for use with a 20 Meter Transceiver
// Now need to install buttons.
#include <UTFT.h>
#include <URTouch.h>
// Declare which fonts we will be using
extern uint8_t BigFont[];
extern uint8_t SmallFont[];
extern uint8_t SevenSegNumFont[];
//if your LCD driver IC is ILI9341,please uncomment the line
UTFT myGLCD(CTE32_R2, 38, 39, 40, 41);
//if your LCD driver IC is SSD1289,please uncomment the line
//UTFT myGLCD(CTE32, 38, 39, 40, 41);
URTouch myTouch( 6, 5, 4, 3, 2);
#include <SPI.h>
#include "Rotary.h"
#include <toneAC.h>
#define TONE_PIN 6
#define NOTE_B5 988
#if defined(__SAM3X8E__)
#undef __FlashStringHelper::F(string_literal)
#define F(string_literal) string_literal
#endif
#define ENCODER_B A10 // Encoder pin A
#define ENCODER_A A11 // Encoder pin B
#define ENCODER_BTN A3
#include "si5351.h"
#include "Wire.h"
Si5351 si5351;
long int frq;
int_fast32_t rx = 16198500L; // Starting frequency of VFO
int_fast32_t rx2=1; // variable to hold the updated frequency
int_fast32_t increment = 100; // starting VFO update increment in HZ.
int_fast32_t bfo =8998500L; // LSB
String hertz = " 100";
int buttonstate = 0;
int buttonstate2 = 0;
const int tonepin = 9; //Output for tune up purposes 988 Hz tone
const int SW = A1; //selects upper or lower sideband
const int SW1 = A2; // provides the TUNE fucntion
const int LED = 8; //Controls the transmitter in TUNE simple 5 VDC reed relay
byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ; //Placeholders
// int backlight =0;
int i = 0;
const int SM =A0;// Analog Pin A0 for the S Meter function
int adcval = 0; // Analog Pin A0 for the S Meter function
int val = 0;
int buttonState = 0;
int lastButtonState = 0;
Rotary r = Rotary(A10,A11); // sets the pins the rotary encoder uses.
void setup()
{myGLCD.clrScr();
Serial.begin(9600);
myGLCD.clrScr();
myGLCD.InitLCD();
myGLCD.fillScr(255,80, 00);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
pinMode(SW, INPUT); // Selects either USB or LSB`````
digitalWrite(SW,HIGH);
pinMode(SW1, INPUT); //Tune
digitalWrite(SW1,HIGH);
pinMode(LED, OUTPUT);
digitalWrite(LED,LOW);
// pinMode(backlight, OUTPUT);
pinMode(A3,INPUT); // Connect to a button that goes to GND on push
pinMode(A1,INPUT); // IF sense **********************************************
pinMode(A10, INPUT); digitalWrite(A10, HIGH);
pinMode(A11, INPUT); digitalWrite(A11, HIGH);
pinMode(A0,INPUT); digitalWrite(A0,LOW);
digitalWrite(A3,HIGH);
digitalWrite(A2,HIGH);
digitalWrite(A1,HIGH); // init done
// set backlight level
//while (!Serial);
//tft.begin();
#if defined(__MK20DX128__) || defined(__MK20DX256__)
// display.setBitrate(24000000);
#endif
// initialize the Si5351
si5351.init(SI5351_CRYSTAL_LOAD_8PF);
si5351.set_correction(100);
si5351.set_pll(SI5351_PLL_FIXED, SI5351_PLLA);
// si5351.set_freq(rx , SI5351_PLL_FIXED, SI5351_CLK0);
si5351.set_freq(bfo, 0, SI5351_CLK2);
si5351.drive_strength(SI5351_CLK0,SI5351_DRIVE_8MA);
si5351.drive_strength(SI5351_CLK2,SI5351_DRIVE_8MA);
}
void setincrement(){
if (increment == 10){increment = 100; hertz = " 100";}
else if (increment == 100){increment = 1000; hertz=" 1K";}
else if (increment == 1000){increment = 10000; hertz=" 10K"; }
else if (increment == 10000){increment = 100000; hertz=" 100K";}
else if (increment == 100000){increment = 1000000; hertz=" 1M ";}
else{increment = 10; hertz = " 10";};
delay(100); // Adjust this delay to speed up/slow down the button menu scroll speed.
}
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) {
if (result == DIR_CW){rx=rx+(1*increment);} // account that rx = 1 times the frequency so the increment must be 4* or /.25
else {rx = rx-(1*increment);};
if (rx >=18900000L){rx=rx2;}; // UPPER VFO LIMIT = 1X the opearting frequency + offset
if (rx <=1200000L){rx=rx2;}; // LOWER VFO LIMIT = 1 X the opearting frequency + Offset
}
}
// Watterott
// ---------
// The following two lines are needed for the MI0283QT9 display
// module to enable the backlight. If you are using any other
// display module these lines should be commented out.
// -------------------------------------------------------------
// pinMode(9, OUTPUT);
// digitalWrite(9, HIGH);
// -------------------------------------------------------------
// DisplayModule
// -------------
// The following 4 lines are needed for the DM-TFT28-105 display
// module to set the SS/CS pins for the other devices connected
// to the Arduino SPI pins. If you are using any other display
// module these lines should be commented out.
// -------------------------------------------------------------
// pinMode(10,OUTPUT); digitalWrite(10,HIGH); // TFT SS/CE
// pinMode(8, OUTPUT); digitalWrite(8, HIGH); // SD card SS/CE
// pinMode(6, OUTPUT); digitalWrite(6, HIGH); // Flash chip SS/CE
// pinMode(4, OUTPUT); digitalWrite(4, HIGH); // Touch controller SS/CE
// -------------------------------------------------------------
// Just get some random numbers
// Setup the LCD
void loop()
{ showFreq();
checkMode(); //********Moved void checkBand out of the loop
checkSideband();
lastButtonState = buttonState;
myGLCD.setBackColor(255,80,0);
myGLCD.setColor(VGA_BLACK);
myGLCD.setFont(BigFont);
myGLCD.print(hertz, 190,51);
adcval = analogRead(SM); //S meter routine
Serial.println(adcval);
myGLCD.setColor(VGA_BLACK);
myGLCD.fillRect(90,190,290,215);
val= 30*log((adcval-200)/20);
myGLCD.setColor(VGA_LIME);
myGLCD.fillRect(95,198,95 + val,205);
delay(20);
Serial.println(val);
myGLCD.setBackColor(255,80,0);
myGLCD.setColor(VGA_WHITE);
myGLCD.setFont(BigFont);
myGLCD.print("Hybrid Wireless", CENTER, 10);
myGLCD.setBackColor(255,80,0);
myGLCD.setColor(VGA_WHITE);
myGLCD.setFont(BigFont);
myGLCD.print("N6QW Wizard of 91320", CENTER, 220);
myGLCD.setBackColor(255,80,0);
myGLCD.setColor(VGA_BLACK);
myGLCD.setFont(BigFont);
myGLCD.print("SMtr",15,190);
myGLCD.setColor(VGA_BLACK);
myGLCD.setFont(BigFont);
myGLCD.print("S9", 185,173);
myGLCD.setColor(VGA_BLACK);
myGLCD.fillRect(95, 180, 97, 185);
myGLCD.setColor(VGA_BLACK);
myGLCD.fillRect(105, 180, 107, 185);
myGLCD.setColor(VGA_BLACK);
myGLCD.fillRect(118, 180, 120, 185);
myGLCD.setColor(VGA_BLACK);
myGLCD.fillRect(134, 180, 136, 185);
myGLCD.setColor(VGA_BLACK);
myGLCD.fillRect(150, 180, 152, 185);
myGLCD.setColor(VGA_BLACK);
myGLCD.fillRect(170, 180, 172, 185);
showFreq();
{
myGLCD.setFont(BigFont);
myGLCD.setBackColor(255,80,0);
myGLCD.setColor(VGA_BLACK);
myGLCD.print("Hz",280, 51);
if (rx != rx2){
myGLCD.setFont(SevenSegNumFont); // When you change frequency you don't have to screen clear! It paints it black
myGLCD.setBackColor(255,80,0);
// myGLCD.setColor(VGA_BLACK);
// myGLCD.printNumI((rx-bfo),30,91);
showFreq();
si5351.set_freq(rx , SI5351_PLL_FIXED, SI5351_CLK0);
Serial.print(rx);
si5351.set_freq(bfo , SI5351_PLL_FIXED, SI5351_CLK2);
rx2 = rx;
}
buttonstate = digitalRead(A3);
if(buttonstate == LOW) {
setincrement();
myGLCD.setBackColor(255,80,0);
myGLCD.setFont(BigFont);
myGLCD.setColor(VGA_BLACK);
myGLCD.print(hertz, 190,51);
delay(10);
showFreq();
};
delay(25);
}
}
void checkMode(){
buttonState = digitalRead(SW1); // creates a 10 second tuning pulse trani 50% duty cycle and makes TUNE appear on the screen
if(buttonState != lastButtonState){
if(buttonState == LOW){
digitalWrite(LED,HIGH);
myGLCD.setFont(BigFont);
myGLCD.setColor(VGA_WHITE);
myGLCD.print("TUNE", 130, 42);
delay(12);
for(int i = 0; i < 100; i++) {
tone(9, NOTE_B5);
myGLCD.setColor(VGA_LIME); //Flashes the Icon during transmits
myGLCD.fillCircle(282,39,8);
delay(75);
noTone(9);
myGLCD.setColor(VGA_BLACK);
myGLCD.fillCircle(282,39,8);
delay(25);
}
}
else{
digitalWrite(LED,LOW);
myGLCD.setFont(BigFont); // This prints a Black TUNE over the RED TUNE and makes it disappear from the scereen
myGLCD.setBackColor(255,80,0);
myGLCD.setColor(255,80,0);
myGLCD.print("TUNE", 130, 42);
myGLCD.setColor(VGA_BLACK);
myGLCD.fillCircle(282, 39, 8);
noTone(9);
}
delay(40);
}
}
void checkSideband(){
if(digitalRead(SW)){ //********If SW is true do the following.
bfo = 8998500L;
si5351.set_freq( bfo, 0, SI5351_CLK2);{
if (bfo = 8998500L);
myGLCD.setFont(BigFont);
myGLCD.setColor(255,80,0);
myGLCD.print("USB",12,61);}
myGLCD.setColor(VGA_BLACK);
myGLCD.print("LSB", 12, 42);
}
else{ //**********if not, do this.
bfo = 9001500L;
si5351.set_freq( bfo, 0, SI5351_CLK2);
myGLCD.setFont(BigFont);
myGLCD.setColor(255,80,0);
myGLCD.print("LSB",12,42);
myGLCD.setColor(VGA_BLACK);
myGLCD.print("USB", 12, 61);
}
}
void showFreq(){
millions = (((rx/1)-bfo)/1000000);
hundredthousands = ((((rx/1)-bfo )/100000)%10);
tenthousands = ((((rx/1)-bfo )/10000)%10);
thousands = ((((rx/1)-bfo )/1000)%10);
hundreds = ((((rx/1)-bfo )/100)%10);
tens = ((((rx/1)-bfo )/10)%10);
ones = ((((rx/1)-bfo )/1)%10);
myGLCD.setFont(SevenSegNumFont);
myGLCD.setBackColor(255,80,0);
myGLCD.setColor(VGA_WHITE);
myGLCD.printNumI(millions,30,91);
myGLCD.print("", 40,91);
myGLCD.printNumI(hundredthousands, 70,91);
myGLCD.printNumI(tenthousands,100,91);
myGLCD.printNumI(thousands,130,91);
myGLCD.print("",140,91); //says print for the spacing
myGLCD.printNumI(hundreds,170,91);
myGLCD.printNumI(tens, 200,91);
myGLCD.printNumI(ones, 230,91);
}