I'm trying to modify an existing sketch to suit my needs i have added a few bits i need for my project but I'm now stuck . I want to add a separate control potentiometer/encoder to use as a rx only clarifier control .I've tried various ways by using bits out of existing sketches I've found but no luck in making it work .Its been 30 plus years since I've played with code so I'm a little rusty any help or pointers would be greatly appreciated been trying to work this out for a couple of weeks now .
Maybe you could post it here, in code tags.
Wont let me add it because I'm a new user but the original code is here 10kHz to 120MHz VFO / RF Generator with Si5351 and Arduino - Arduino Project Hub
Just click on the '</>' symbol on the toolbar in the editor, and paste your code between the tags, where it says "type or paste code here"
/********************************************************************************************************
10kHz to 120MHz VFO / RF Generator with Si5351 and Arduino Nano, with Intermediate Frequency (IF)
offset (+ or -). See the schematics for wiring details. By J. CesarSound - ver 1.0 - Dec/2020.
MODDED BY 2e0myn september 2021
*********************************************************************************************************/
//Libraries
#include <Wire.h> //IDE Standard
#include <Rotary.h> //Ben Buxton https://github.com/brianlow/Rotary
#include <si5351.h> //Etherkit https://github.com/etherkit/Si5351Arduino
#include <Adafruit_GFX.h> //Adafruit GFX https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_SSD1306.h> //Adafruit SSD1306 https://github.com/adafruit/Adafruit_SSD1306
//User preferences
//------------------------------------------------------------------------------------------------------------
#define IF 0 //Enter your IF frequency, ex: 455 = 455kHz, 10700 = 10.7MHz, 0 = to direct convert receiver or RF generator, + will add and - will subtract IF offfset.
#define FREQ_INIT 27555000 //Enter your initial frequency at startup, ex: 7000000 = 7MHz, 10000000 = 10MHz, 840000 = 840kHz.
#define XT_CAL_F 17700 //Si5351 calibration factor, adjust to get exatcly 10MHz. Increasing this value will decreases the frequency and vice versa.
#define tunestep A0 //Change the pin used by encoder push button if you want.
#define am 5 //Change the pin used by mode switch if you want.
#define usb 6 //Change the pin used by mode switch if you want.
#define lsb 7 //Change the pin used by mode switch if you want.
#define TX_RX 9 //The pin used by RX / TX selector switch, RX = switch open, TX = switch closed to GND. When in TX
#define clar A6 //the pin connected to the wiper of the clarifier pot
//------------------------------------------------------------------------------------------------------------
Rotary r = Rotary(2, 3);
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
Si5351 si5351;
unsigned long freq = FREQ_INIT;
unsigned long freqold, fstep;
long interfreq = IF;
long cal = XT_CAL_F;
unsigned long long pll_freq = 90000000000ULL;
byte encoder = 1;
byte stp;
unsigned int period = 100; //millis display active
unsigned long time_now = 0; //millis display active
ISR(PCINT2_vect) {
char result = r.process();
if (result == DIR_CW) set_frequency(1);
else if (result == DIR_CCW) set_frequency(-1);
}
void set_frequency(short dir) {
if (encoder == 1) { //Up/Down frequency
if (dir == 1) freq = freq + fstep;
if (freq >= 120000000) freq = 120000000;
if (dir == -1) freq = freq - fstep;
if (fstep == 1000000 && freq <= 1000000) freq = 1000000;
else if (freq < 10000) freq = 10000;
}
}
void setup() {
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.display();
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(tunestep, INPUT_PULLUP);
pinMode(am, INPUT_PULLUP);
pinMode(usb, INPUT_PULLUP);
pinMode(lsb, INPUT_PULLUP);
pinMode(TX_RX, INPUT_PULLUP);
statup_text();
si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, cal);
si5351.output_enable(SI5351_CLK0, 1); //1 - Enable / 0 - Disable CLK
si5351.output_enable(SI5351_CLK1, 0);
si5351.output_enable(SI5351_CLK2, 0);
si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA); //Output current 2MA, 4MA, 6MA or 8MA
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
stp = 5;
setstep();
layout();
displayfreq();
}
void loop() {
if (freqold != freq) {
time_now = millis();
tunegen();
freqold = freq;
}
if (digitalRead(tunestep) == LOW) {
time_now = (millis() + 300);
setstep();
delay(300);
}
if (digitalRead(am) == LOW) {
time_now = (millis() + 300);
delay(300);
}
if (digitalRead(usb ) == LOW) {
time_now = (millis() + 300);
delay(300);
}
if (digitalRead(lsb) == LOW) {
time_now = (millis() + 300);
delay(300);
}
if (digitalRead(TX_RX) == LOW) {
time_now = (millis() + 300);
delay(300);
}
if ((time_now + period) > millis()) {
displayfreq();
layout();
}
}
void tunegen() {
si5351.set_freq_manual((freq + (interfreq * 1000ULL)) * 100ULL, pll_freq, SI5351_CLK0);
}
void displayfreq() {
unsigned int m = freq / 1000000;
unsigned int k = (freq % 1000000) / 1000;
unsigned int h = (freq % 1000) / 1;
display.clearDisplay();
display.setTextSize(2);
char buffer[15] = "";
if (m < 1) {
display.setCursor(41, 1); sprintf(buffer, "%003d.%003d", k, h);
}
else if (m < 100) {
display.setCursor(5, 1); sprintf(buffer, "%2d.%003d.%003d", m, k, h);
}
else if (m >= 100) {
unsigned int h = (freq % 1000) / 10;
display.setCursor(5, 1); sprintf(buffer, "%2d.%003d.%02d", m, k, h);
}
display.print(buffer);
}
void setstep() {
switch (stp) {
case 1: stp = 2; fstep = 10; break;
case 2: stp = 3; fstep = 100; break;
case 3: stp = 4; fstep = 1000; break;
case 4: stp = 5; fstep = 5000; break;
case 5: stp = 6; fstep = 10000; break;
case 6: stp = 1; fstep = 1000000; break;
}
}
void layout() {
display.setTextColor(WHITE);
display.drawLine(0, 20, 100, 20, WHITE);
display.drawLine(0, 20, 100, 20, WHITE);
display.drawLine(105, 30, 127, 30, WHITE);
display.drawLine(100, 20, 105, 30, WHITE);
display.setTextSize(2);
display.setCursor(90, 48);
if (digitalRead(am) == LOW)display.print("AM");
if (digitalRead(usb) == LOW)display.print("USB");
if (digitalRead(lsb) == LOW)display.print("LSB");
display.setCursor(2, 25);
display.print("TS:");
if (stp == 2) display.print("10Hz"); if (stp == 3) display.print("100Hz"); if (stp == 4) display.print("1k");
if (stp == 5) display.print("5k"); if (stp == 6) display.print("10k"); if (stp == 1) display.print("1M");
display.setTextSize(1);
display.setCursor(110, 33);
if (digitalRead(TX_RX) == LOW)display.print("TX");
if (digitalRead(TX_RX) == HIGH)display.print("RX");
display.setCursor(110, 20);
if (freq < 1000000) display.print("kHz");
if (freq >= 1000000) display.print("MHz");
display.display();
}
void statup_text() {
display.setTextSize(2);
display.setCursor(4, 5);
display.print("STALKER 15");
display.setCursor(4, 25);
display.print("Version 3");
display.display();
delay(3000);
display.clearDisplay();
}
Thanks [recoil2325]! I am very grateful for the attention and I apologize for the delay in replying. I wish you a Happy 2022!
Now I'm trying to generate the second clock output (clk2 pinout RF Si5351a) and generate 4(four) preset frequencies, like this: on an analog input (A7) of the Arduino nano board I put a voltage divider... when it is approximately 1Volts in A7 frequency is clk2=14MHz, and when it is approximately 2 Volts in A7 frequency is clk2=28MHz, when voltage is at 3V then clk2=32MHz and at 4V is clk2=48MHZ. In other words, it is the frequency preset in clk2 selected through voltages from 1 to 4 Volts applied to A7 input. If you can help me with this code and post I will be immensely grateful. Thank you very much in advance.
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.