// 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);
}
Nov 20, 2024. Those who know will understand!
Neutralization.
The word neutralization has many interesting meanings. For Mafia Dons, like the Tony Soprano types, the word has the definition of simply el...