В комментариях под оной выложен скетч который мне очень-очень нужен, но он, в отличии от оригинального не хочет компилироваться. Компилятор ругается на две строчки.
На 50ю и 81ю строки.
Ниже приведу текст скетча, а
вот тут можно скачать архив с файлом для Arduino IDE.
#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//пользовательские настройки
//------------------------------------------------------------------------------------------------------------
#define IF 500 // введите вашу IF (промежуточную) частоту, ex: 455 = 455kHz, 10700 = 10.7MHz, 0 = прямое преобразование частоты приемника или радиочастоты генератора, "+" будет добавляться, а "-" будет вычитаться сдвиг промежуточной частоты.
#define IFU 500 // Частота опорного генератора в кГц выход CLK2
#define IFL 497 // Частота опорного генератора при смене полосы в кГц
#define BAND_INIT 2 // введите ваш начальный диапазон (Band) (1-21) в начале работы проекта, ex: 1 = Freq Generator, 2 = 800kHz (MW – средние волны), 7 = 7.2MHz (40m), 11 = 14.1MHz (20m).
#define S_GAIN 303 // настройка чувствительности входа измерителя мощности (Signal Meter A/D input): 101 = 500mv; 202 = 1v; 303 = 1.5v; 404 = 2v; 505 = 2.5v; 1010 = 5v (max).
#define tunestep 4 // контакт, к которому подключена кнопка для настройки шага настройки. Был А0
#define lsbusb A0 // переключение полосы USB/LSB изменение частоты опорного генератора
#define band A1 // контакт, к которому подключена кнопка для выбора частотного диапазона.
#define rx_tx A2 //контакт, к которому подключена кнопка для выбора режима RX / TX, RX = switch open (переключатель открыт), TX = switch closed to GND (переключатель замкнут на землю). В режиме TX частота IF (промежуточная) не учитывается.
#define adc A3 // контакт, используемый как вход измерителя мощности (Signal Meter A/D input).
#define XT_CAL_F 81000
//------------------------------------------------------------------------------------------------------------
Rotary r = Rotary(2, 3);
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
Si5351 si5351(0x60); //Si5351 I2C Address 0x60 (адрес I2C для Si5351)
unsigned long freq, freqold, fstep, lsf; // lsf верхняя нижняя полоса
long interfreq = IF, interfreqold = 0;
long cal = XT_CAL_F;
unsigned int smval;
byte encoder = 1;
byte stp, n = 1;
byte count, x, xo;
bool sts = 0;
bool ifod = 0; // переменная для управления частоты опорного генератора
unsigned int period = 100;
unsigned long time_now = 0;
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 >= 225000000) freq = 225000000;
if (dir == -1) freq = freq - fstep;
if (fstep == 1000000 && freq <= 1000000) freq = 1000000;
else if (freq 42) n = 1;
//Эта строчка №50if (dir == -1) n = n - 1;
if (n < 1) n = 42;
}
}
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(band, INPUT_PULLUP);
pinMode(rx_tx, INPUT_PULLUP);
pinMode(lsbusb, INPUT_PULLUP); // включение кнопки для смены полосы LSBUSB
//statup_text(); //If you hang on startup, comment
si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0);
si5351.set_correction(cal, SI5351_PLL_INPUT_XO);
si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA);
si5351.drive_strength(SI5351_CLK2, SI5351_DRIVE_8MA); // Ток выхода
si5351.output_enable(SI5351_CLK0, 1); //1 - Enable / 0 - Disable CLK
si5351.output_enable(SI5351_CLK1, 0);
si5351.output_enable(SI5351_CLK2, 1); // Включение порта CLK2
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 < millis()) {
// И ЭТА СТРОКА, №81
displayfreq();
layout();
}
sgnalread();
}
void tunegen() {
si5351.set_freq((freq + (interfreq * 1000ULL)) * 100ULL, 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 5) count = 1; // 5 количество кейсов(case)
bandpresets();
delay(50);
}
//Переключение диапазонов
void bandpresets() {
switch (count) {
case 1: freq = 100000; tunegen(); break;
case 2: freq = 2920000; break;
case 3: freq = 6660000; break;
case 4: freq = 10460000; break;
case 5: freq = 14292000; break;
//case 6: freq = 6180000; break;
//case 7: freq = 7200000; break;
}
si5351.pll_reset(SI5351_PLLA);
stp = 4; setstep();
}
//Графика на дисплее
void layout() {
display.setTextColor(WHITE);
display.drawLine(0, 20, 127, 20, WHITE);
display.setTextSize(1);
display.setCursor(5, 23); //50,23
display.print("STEP");
display.setCursor(32, 23); //54,33
if (stp == 2) display.print(" 1Hz"); if (stp == 3) display.print(" 10Hz"); if (stp == 4) display.print(" 1kHz");
if (stp == 5) display.print(" 5kHz"); if (stp == 6) display.print("10kHz"); if (stp == 1) display.print(" 1MHz");
display.setTextSize(1);
display.setCursor(92, 48);
display.print("IF:");
display.setCursor(92, 57);
display.print(interfreq);
display.print("k");
display.setTextSize(1);
display.setCursor(110, 23);
if (freq = 1000000) display.print("MHz");
display.setCursor(110, 33);
if (interfreq == 0) display.print("VFO");
if (interfreq != 0) display.print("L O");
display.setCursor(91, 28);
if (!sts) display.print("RX"); if (!sts) interfreq = IF; //изменение частоты при передаче на выходе CLK0
if (sts) display.print("TX"); if (sts) interfreq = 0;
display.setCursor(4, 45);
if (!ifod) display.print("USB"); if (!ifod) lsf = IFU; //Обозначение полосы USB на дисплее и переключение частоты опорного генератора в зависимости от состояния кнопки
if (ifod) display.print("LSB"); if (ifod) lsf = IFL; //Обозначение полосы LSB на дисплее и переключение частоты опорного генератора в зависимости от состояния кнопки
bandlist(); drawbargraph();
display.display();
}
void bandlist() {
si5351.set_freq((lsf) * 100000ULL, SI5351_CLK2); // Установка частоты порта CLK2
}
void sgnalread() {
smval = analogRead(adc); x = map(smval, 0, S_GAIN, 1, 14); if (x > 14) x = 14;
}
void drawbargraph() {
byte y = map(n, 1, 42, 1, 14);
display.setTextSize(1);
//Bargraph (индикатор мощности)
display.setCursor(0, 57); display.print("SM");
switch (x) {
case 14: display.fillRect(80, 58, 2, 6, WHITE);
case 13: display.fillRect(75, 58, 2, 6, WHITE);
case 12: display.fillRect(70, 58, 2, 6, WHITE);
case 11: display.fillRect(65, 58, 2, 6, WHITE);
case 10: display.fillRect(60, 58, 2, 6, WHITE);
case 9: display.fillRect(55, 58, 2, 6, WHITE);
case 8: display.fillRect(50, 58, 2, 6, WHITE);
case 7: display.fillRect(45, 58, 2, 6, WHITE);
case 6: display.fillRect(40, 58, 2, 6, WHITE);
case 5: display.fillRect(35, 58, 2, 6, WHITE);
case 4: display.fillRect(30, 58, 2, 6, WHITE);
case 3: display.fillRect(25, 58, 2, 6, WHITE);
case 2: display.fillRect(20, 58, 2, 6, WHITE);
case 1: display.fillRect(15, 58, 2, 6, WHITE);
}
}
void statup_text() {
display.setTextSize(1); display.setCursor(13, 18);
display.print("Si5351 VFO/RF GEN");
display.setCursor(6, 40);
display.print("JCR RADIO - Ver 2.0");
display.display(); delay(2000);
}
Комментарии 20
Я имею ввиду оригинальную прошивку из статьи