Skip to main content

Nov 20, 2024. Those who know will understand!

 // 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);
            
         
    }

           
           
     
     
     
   
      
    


          

Popular posts from this blog

March 31, 2024. Happy Easter to those who celebrate this day.

What a great day to Binge on Chocolate and experience the pain of that filling that has been leaking.  I would be in that category with the leaking filling(s) had I not just spent an amount equivalent to one of the fancy new uptown appliance box transceivers on two filling repairs. Well at least I can binge on the Chocolate bunnies without fear of pain. Regrettably everything appears to have jumped in price including the price of parts. Well not so much the parts as the shipping costs.  That notably is seen in the eBay treasures. I spotted a nice heathkit DX-20 for about $50 and the shipping was $65. Likely it is a twofer with part being a way to in effect charge a higher price by inflating the shipping and in part by increased shipping costs. Shipping with insurance across the US was about $150 for this jewel and that was three years ago. 6AM on the Left Coast ~ 20M Easter Sunday! My only hope is the cost of Chocolate Bunnies remains steady although a pound of See's Candies f...

January 26, 2024. A simple CW Transceiver/Transmitter

Cruise through the lower part of the ham bands bands and what do you hear? Well, FT-8 and CW. Often you will not hear any SSB stations yet go to the lower part of the bands, and it is a cacophony (I love that word) of bad sounding signals and some high-speed keying. Fast is not so much of the issue as is bad, run together and jerky keying. But none the less our hobby started there.    So, you could crank down your ICOM 7300 and watch the waterfall on CW or you could homebrew a radio. Actually, to do CW right you need more thought up front than you do with a SSB transceiver. Often, I will state that a CW Transceiver is much more difficult to build than a simple SSB rig. I published two articles in QRP Quarterly on CW transceivers and all I got was a yawn so maybe history will repeat itself.  Yawn!   30M CW Transceiver with RIT!   Of interest is that the LO is a Varactor tuned LC oscillator using a NE602. Look closely at the RIT circuit which is only activated on ...

August 30, 2024. A PNP 20M SSB Transceiver

Shown below is the Block Diagram for the 20M PNP SSB Transceiver steered in the  Transmit Mode . The components shown in the dotted block are relay steered so that the block module is single pass and amplifies in a single direction. The Block diagram show steered in Transmit.  Essentially the steering process works so that the IF Module input follows the Balanced Modulator on Transmit and then the input side follows the Receive Mixer on Receive. All done with some relays and a bit of RG174U coax. For those who count things in detail, this block diagram is not unlike what was used for the PSSST Transceiver which can be found on my website . Yes, a warmed over P3ST only using PNP devices. TYGNYBNT. 73's Pete N6QW