Hallo Allemaal Rhenen 7-5-2023
Eindelijk weer gestoeid met de FT817 S-meter-history met een arduino nano.
En heb alles werkend nu !
Voeding 5v via powerbank 18650 van de Action via USB.(Blauw op foto)
Zie ook de sketch.
Via een orginele cat62 kabel (DB9) voor de FT817 de S-meter uitlezen.
Alles wordt weergeven op een nokia 5110 PCD8544 Display.
Piezo buzzer (Moet op pen 11 van de Arduino nano)
Buzzer geeft in toonladder waardes S-meter in geluid.
Arduino en Nokia display op steekbordje.
Alles zit verder gemonteerd op een stukje hardboard.
De buttons gewoon gesoldeerd op print met serie r 330 ohm naar massa. (A2,A3 en A4 Arduino)
De max232 op een gaatjes board met db9 male en ledjes pwr RX, TX, DTR en RTS
en draadjes naar de arduino D2 en D3 (denk aan 3.3v arduino en 5v max232 aanpassing (D2 en D3 Arduino)
AD8307 circuit Veldsterkte meter
Op foto zie je een potmeter tijdelijk om te simuleren de ad8307
opm: de ad8307 blikkie zit momenteel in Foxcopter 1 (Roterende antenne met ruiten wisser motor en polair display op PC)
Denk er nog over om een simpele liniaire HF detector met opampje oid te maken en die op A0 aan te sluiten.
(Veldsterkte meter monitor)
Menu met 3 buttons
-------------------
Blauw Menu met keuze FT817, AD8307 of Demo
Rood History of Analoge meter
Groen Buzzer aan of uit
Als je de arduino boot of reset dan schakelt hij de FT817 aan.
Verder zo weinig mogelijk functies er op gemaakt.
Het is vast ook handig ook voor vossenjagen.
Groeten Allemaal
Code: Selecteer alles
/*
* ===============================
*((C))PA3BNX FT817 Smeter + History + Buzzer + AD8307 + Demo
* with Nokia LCD5110 Display
* 06-07-2018
* 10-07-2018
* 22-07-2018
* MayBe build in also a tone sensivity piezo buzzer 23-07-2018
* 30-07-2018
* 02-08-2018
* 17-08-2018
* AD8307 Fieldstrength to analog Pin
* Use white keys note for strength buzzer
* ToDo beeps adjacent to indicate strength ?
* 15-11-2021 New Voter and Loop etc
* 12-12-2021
* 15-02-2022
* 31-05-2022 ''OnOff FT817
* 10-06-2022
* 26-04-2023 FT817-cat lib getFT817bytes()
* 27-04-2023
* 02-05-2023
* 03-05-2023
* 07-05-2023 Cat62 <>FT817 works now with max232 chip
*/
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SoftwareSerial.h>
const byte cPinAD8307=A0;//Pin AD8307 analog
const byte cPinVote1=A1;//Blue Btn Choise FT817 AD8307 and Demo
const byte cPinVote2=A2;//Red Btn Choise Meter or History
const byte cPinVote3=A3;//Green Btn Choise Buzzer on off
//FT817 cmd's used
#define CAT_NULL_DATA 0x00 //00
#define CAT_ON 0x0F //15
#define CAT_OFF 0x8F //143
#define CAT_RX_DATA_CMD 0xE7 //231
const byte cPinBuzzer=11;//pin interfere with 3 or 11 on a nano ? Connect buzzer here
const String SmeterConvFT817[]={"S","S1","S2","S3","S4","S5","S6","S7","S8","S9","S9+10","S9+20","S9+30","S9+40","S9+50","S9+60"};//Display Value
const unsigned int ToneFreq[]={50,440,494,523,587,659,698,784,880,988,1047,1175,1319,1397,1568,1760}; //Buzzer
const unsigned int RigBaud=4800;
//Cat Control FT817
//I use a Max232 and a Cat62 cable
SoftwareSerial mySerial(3, 2,false); // 2,3 RX, TX
// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
//Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); //Org
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 7, 6, 5, 4); //new 14-11-2021
//int config = SERIAL_8N2;
//My FT817 uses 4800 8N2
//Bytes
byte TxRxArr[5]; //FT817 TxRxBytes
const byte cEmpty=255; //Vote Empty
//Int
const int t = 1500; //Main delay only for VoterChanged()
void DisplayMessage(byte FtAdDemo,bool bHistory, bool bBuzz)
{
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
//Input Mode
switch (FtAdDemo)
{
case 0:
display.println(F("FT817 cat"));
display.println(RigBaud);
break;
case 1:
display.println(F("AD8307"));
break;
case 2:
display.println(F("Demo"));
break;
default:
display.println(F("FT817 cat"));
display.println(RigBaud);
break;
}
//History
if (bHistory==true)
{
display.println(F("History"));
}
else
{
display.println(F("Meter"));
}
//Buzzer
if (bBuzz==true)
{
display.println(F("Buzzer on"));
}
else
{
display.println(F("Buzzer off"));
}
display.display();
}
void Buzzer(int rssi,bool bOnOf)
{
//tone(pin, frequency, duration)
//PWM only pin 3 and 11 on uno/nano
if (bOnOf==false || rssi==cEmpty)
{
noTone(cPinBuzzer);
}
else
{
tone(cPinBuzzer,ToneFreq[rssi]);//Now white key tones
}
}
void cmdToFT817(byte cmd)
{
memset(TxRxArr,0,5); //Clear and set
TxRxArr[4]=cmd;
mySerial.write(TxRxArr,5);
}
void getFT817Bytes(byte count) //26-04-2023
{
unsigned long startTime = millis();
while (mySerial.available() < 1 && millis() < startTime + 2000) { ; }
memset(TxRxArr,0,5);
for (byte i=0; i<count; i++)
{
TxRxArr[i] = mySerial.read();
delay(5);
// needs a delay in here, otherwise the byte sequence read is incorrect
}
}
void SmeterHistoryFT817(byte rssi,bool OnlyUpdate)
{
//ToDo try to draw Analogue RSSI meter
const int UboundArr=168;
static byte SmeterHistory[UboundArr];
static int count=0;
int i;
if (rssi==cEmpty){
count = 0 ;
for (i=0 ; i < UboundArr-i ; i++)
{
SmeterHistory[i]=0;
}
display.clearDisplay();
display.display();
return;
}
if (count<UboundArr)
{
SmeterHistory[count]=rssi;
count ++;
}
else
{
for (int i=1;i<UboundArr;i++)
{
SmeterHistory[i-1]=SmeterHistory[i];
}
SmeterHistory[UboundArr-1]=rssi;
}
if (OnlyUpdate==true){return;}
display.clearDisplay();//Clear Buffer
for ( i=0;i<count ;i++)
{
if (i > UboundArr/2)
{
//Lower
display.drawLine(i-UboundArr/2 ,display.height()-1,i-UboundArr/2,display.height()-1 - SmeterHistory[i], BLACK);
}
else
{
//Upper
display.drawLine(i,display.height()/2,i,display.height()/2 -SmeterHistory[i],BLACK);
}
}
display.display();//Show Now
}
void ClassicMeter(int rssi)
{
//20-07-2018 Not Ready Yet 20-07-2018 Ok
//Draw Ref lines bar
//Draw Hand
//Display value in numbers
//rssi varies between 0 and 15 or cEmpty ?
//dm must be between 0 and 100 ?
int i;
int y;
int x;
int dm;
int s;
int ss;
//FT817 just Smeter just 0 to 15
//So modify rssi
if (rssi != cEmpty)
{
dm = map(rssi,0,15,0,100);
}
else
{
dm=0;
}
display.clearDisplay();
//Scale
y=5;
for(i=0;i<display.width() +1;i += 10)
{
display.drawLine(i,0,i,y+8,BLACK);
}
display.drawLine(0,0,i-10,0,BLACK);
for (i=5;i<display.width()+1;i +=10)
{
display.drawLine(i,0,i,y,BLACK);
}
//Hand
s=16;//Ofset from top screen
x=-5;
ss= int((float(display.width()/float(100))) * float(dm));
display.drawCircle(display.width()/2,display.height()+x,3,BLACK);
display.drawLine(display.width()/2,display.height()+x,ss,s,BLACK);
//Numbers
display.setTextSize(1);
if (dm > 50)
{
display.setCursor(10,30);
}
else
{
display.setCursor(45,30);
}
if (dm > 100)
{
display.print("OL(");
}
else
{
//display.println(d);
if (rssi !=cEmpty)
{
display.println(SmeterConvFT817[rssi]);
}
else
{
display.println(SmeterConvFT817[0]);
}
}
//Show now
display.display();
}
byte ExtractFT817Smeter()
{
//Read RX Status
//x,x,x.x,f7 (247)
//76543210
//3210=S-meter data
//7=Squelch
return TxRxArr[0] & 0b00001111;
}//Last ExtractFT817Smeter
byte ExtractAD8307Smeter()
{
//11-09-2018
int x;
x=analogRead(cPinAD8307);
return byte(map(x,0,1023,0,15));
}
byte ExtractDemo()
{
return random(0,15);
}
void BlinkLed13()
{
//Blink LED 13
static bool bBlink;
bBlink =! bBlink;
digitalWrite(LED_BUILTIN,bBlink);
}
byte VoterChanged(bool delayed)
{
byte x=cEmpty;
long Start;
int a;
int b;
int c;
if (delayed==true)
{
delay(t);
}
Start=millis()+t;
while(Start > millis())
{
//Toggle push buttons
a=digitalRead(cPinVote1);
b=digitalRead(cPinVote2);
c=digitalRead(cPinVote3);
if (a==0 || b==0 || c==0)
{
x=0;
if (a==0 ) {x = 1;}
if (b==0 ) {x = x + 2;}
if (c==0 ) {x = x + 4;}
}
if (x != cEmpty)
{
break;
}
}
return x;
}
int RotateBlueBtn()
{
//Must return 0,1,or 2 Ft817 AD8307 or Demo
static byte x;
x=x+1;
if (x > 2)
{
x=0;
}
return x;
}
void setup() {
// put your setup code here, to run once:
//Serial.begin(4800); //Not to fast hi Not Needed
mySerial.begin(RigBaud); //Cat62 FT817 port
//By default, the last intialized port is listening
//when you want to listen on a port, explicitly select it
//mySerial.listen();
pinMode(cPinVote1,INPUT_PULLUP); //Blue
pinMode(cPinVote2,INPUT_PULLUP); //Red
pinMode(cPinVote3,INPUT_PULLUP); //Green
pinMode(cPinBuzzer,OUTPUT);
pinMode(LED_BUILTIN,OUTPUT);
// you can change the contrast around to adapt the display
// for the best viewing!
display.begin();
display.setContrast(50);
display.clearDisplay();
display.setCursor(0,0);
display.setTextSize(1);
display.println(F("((C))PA3BNX"));
display.setCursor(0,10);
display.setTextSize(2);
display.println(F("FT817"));
display.println(F("S-Meter"));
display.display();
delay(1000);
//Switch FT817 On
cmdToFT817(CAT_NULL_DATA); //Must be done first
delay(100);
cmdToFT817(CAT_ON);
}
void loop() {
// put your main code here, to run repeatedly:
//Bool
static bool bBuzz; //Buzzer on off
static bool bHistoryMeter; //Display history or meter
//Byte
static byte FtAdDemo=0; //0,1,2 0=FT817, 1=AD8307 and 2=Demo
byte Smeter; //0 to 15
byte Vote; //Witch key was last pressed Can be cEmpty 0, 1,2,4
byte x;
//Get keys pressed and take action
//Voter
Vote=VoterChanged(false); //NotDelayed
again:
//Messages Menu
switch (Vote)
{
case cEmpty:
x=cEmpty;
//Nothing
break;
case 0:
x=cEmpty;
break;
case 1:
//FT817, AD8307, Demo
FtAdDemo=RotateBlueBtn();
DisplayMessage(FtAdDemo,bHistoryMeter,bBuzz);
x=VoterChanged(true);
break;
case 2:
//History
bHistoryMeter =! bHistoryMeter; //Toggel
DisplayMessage(FtAdDemo,bHistoryMeter,bBuzz);
x=VoterChanged(true); //Delayed
if (x!=cEmpty) {goto again;}
break;
case 4:
//Buzzer
bBuzz =! bBuzz; //Toggel
if (bBuzz==false)
{
Buzzer(0,bBuzz);//Sound Off
}
DisplayMessage(FtAdDemo,bHistoryMeter, bBuzz);
x=VoterChanged(true); //Delayed
break;
}
//--------------------------
if (x != cEmpty )//RotateBlueBtn Pressed or other red/green btn action while DisplayMessage is showed?
{
Vote=x;
x=cEmpty;
goto again;
}
// Do the things Try get Smeter datafrom FT817, AD8307 or Demo
switch(FtAdDemo)
{
case 0:
cmdToFT817(CAT_RX_DATA_CMD); //Send cmd to FT817
getFT817Bytes(5); //Wait for answer ft817
Smeter=ExtractFT817Smeter(); //return cEmpty if nothing
break;
case 1:
Smeter=ExtractAD8307Smeter();
break;
case 2:
Smeter=ExtractDemo();
break ;
}
//Display
if (bHistoryMeter==true)
{
SmeterHistoryFT817(Smeter,false);
}
else
{
ClassicMeter(Smeter);
}
//Buzzer
if (bBuzz==true) {Buzzer(Smeter,bBuzz);}
//HartBeat onboard Led
BlinkLed13();
}//Last bracket Loop