Salve a tutti, spero che il titolo sia esaustivo...
Sono Radioamatore e posseggo un controller per un rotore Yaesu G-450c il quale mi ha abbandonato.
In questo controller sono presenti ingranaggini e cinghiette di dubbia qualità e così ho deciso di asportare tutta la parte e sostituirla con un bel display Nextion da 7'.
Solitamente con Arduino riesco a cavarmela anche se in maniera molto prolissa, infatti sono arrivato a buon punto.
Ora sono bloccato in una pagina dove vorrei digitare le due cifre della zona verso cui puntare l'antenna (DXCC), dare invio e fare in modo (previa creazione di una lista di gradi che corrispondano alle varie zone) che il rotore raggiunga i gradi senza toccare i "pulsanti" AVANTI e INDIETRO sulla prima pagina.
Che comando devo scrivere sullo sketch? Ringrazio chiunque abbia voglia di aiutarmi.
Lanfranco
Il video della mia creazione per ora provvisoria nella grafica (anche se la sto già usando con successo):
Il mio sketch:
byte PotentiometerPin = A0; // Set the pin for the potentiometer.
int PotentiometerValue; // This variable stores the value of the potentiometer.
int GaugeValue; // This variable stores the value that we are going to send to the gauge on the display.
int ProgressBarValue; // This variable stores the value that we are going to send to the progress bar on the display.
int ProgressBar2Value;
int Numerogradi;// visualizza sul display il numero dei gradi di rotazione
int ZoneNumber; //Valore digitato sul tastierino numerico
int CurrentPage = 0; // Create a variable to store which page is currently loaded
#include <Nextion.h>
NexButton b0 = NexButton(0, 15, "b0"); // Button added
NexButton b1 = NexButton(0, 16, "b1"); // Button added
//Tastierino numerico
NexButton b20 = NexButton(2, 2, "b20"); // Button added
NexButton b21 = NexButton(2, 3, "b21"); // Button added
NexButton b22 = NexButton(2, 4, "b22"); // Button added
NexButton b23 = NexButton(2, 5, "b23"); // Button added
NexButton b24 = NexButton(2, 6, "b24"); // Button added
NexButton b25 = NexButton(2, 7, "b25"); // Button added
NexButton b26 = NexButton(2, 8, "b26"); // Button added
NexButton b27 = NexButton(2, 9, "b27"); // Button added
NexButton b28 = NexButton(2, 10, "b28"); // Button added
NexButton b29 = NexButton(2, 11, "b29"); // Button added
NexButton b30 = NexButton(2, 12, "b30"); // Button added
NexButton b31 = NexButton(2, 13, "b31"); // Button added
NexButton b212 = NexButton(2, 15, "b212"); // Button added
NexText t0 = NexText(2,14, "t0"); // Valore digitato su tastierino
NexPage page0 = NexPage(0, 0, "page0"); // Page added as a touch event
NexPage page1 = NexPage(1, 0, "page1"); // Page added as a touch event
NexPage page2 = NexPage(2, 0, "page2"); // Page added as a touch event
NexPage page3 = NexPage(3, 0, "page3"); // Page added as a touch event
NexTouch *nex_listen_list[] =
{
&b0, // Button added
&b1, // Button added
&b20, // ----------------------
&b21, // Button added |
&b22, // Button added |
&b23, // |
&b24, // Button added |
&b25, // Button added |
&b26, // | //Tastierino numerico
&b27, // Button added |
&b28, // Button added |
&b29, // |
&b30, // |
&b31, // |
&b212, //-------------------- Tasto RETURN
&page0, // Page added as a touch event
&page1, // Page added as a touch event
&page2, // Page added as a touch event
NULL // String terminated
}; // End of touch event list
// Pulsanti Avanti e indietro Rotore:
void b0PushCallback(void *ptr)
{
digitalWrite(2, HIGH); // Rotore gira in senso Orario CW
} // End of press event
void b0PopCallback(void *ptr)
{
digitalWrite(2, LOW); // Rotore stop
}
void b1PushCallback(void *ptr) // Press event for button b1
{
digitalWrite(3, HIGH); // Rotor turn left
}
void b1PopCallback(void *ptr) // Release event for button b1
{
digitalWrite(3, LOW); // Rotor stop
} // End of release event
// Page change event:
void page0PushCallback(void *ptr)
{
CurrentPage = 0;
}
//
void page1PushCallback(void *ptr)
{
CurrentPage = 1;
}
void page2PushCallback(void *ptr) // If page 1 is loaded on the display, the following is going to execute:
{
CurrentPage = 2;
}
void page3PushCallback(void *ptr) // If page 1 is loaded on the display, the following is going to execute:
{
CurrentPage = 3;
} // End of press event
void setup() // Start of setup
{
pinMode(PotentiometerPin, INPUT);
Serial.begin(9600);
b0.attachPush(b0PushCallback);
b0.attachPop(b0PopCallback);
b1.attachPush(b1PushCallback);
b1.attachPop(b1PopCallback);
page0.attachPush(page0PushCallback); // Pagina controllo rotazione
page1.attachPush(page1PushCallback); // Pagina cartina zone DXCC
page2.attachPush(page2PushCallback); // Pagina tastierino numerico
page3.attachPush(page3PushCallback); // Pagina Elevazione
pinMode(13, OUTPUT); // Led overlap
pinMode(2, OUTPUT); //Rotazione in senso orario CW
pinMode(3, OUTPUT); //Rotazione in senso antiorario CCW
} // End of setup
void loop() // Start of loop
{
delay(100);
PotentiometerValue = analogRead(PotentiometerPin); // leggi il potenziometro da 0 a 1023
if(CurrentPage == 0){
Numerogradi = map(PotentiometerValue, 9, 1023, 0, 450);
if(Numerogradi > 359) // If gauge value is above 359...
{
Numerogradi = Numerogradi - 360; // Sottrai 360° e riparti da 0° in overlap
}
Serial.print("n0.val=");
Serial.print(Numerogradi);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
GaugeValue = map(PotentiometerValue, 9, 1023, 90, 540);
if(GaugeValue > 359) // se il valore di rotazione supera i 360°
{
GaugeValue = GaugeValue - 360; // ricomincia da 0° (overlap)
}
Serial.print("z0.val=");
Serial.print(GaugeValue);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
Serial.print("va0.val=");
Serial.print(GaugeValue);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
ProgressBarValue = map(PotentiometerValue, 9, 818, 0, 100);
Serial.print("j0.val=");
Serial.print(ProgressBarValue);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
if(ProgressBarValue < 1)
{
digitalWrite (3, LOW); // Blocco software alla rotazione in senso antiorario
}
ProgressBar2Value = map(PotentiometerValue, 819, 1023, 0, 100);
Serial.print("j1.val=");
Serial.print(ProgressBar2Value);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
if(ProgressBar2Value > 2)
{
digitalWrite(13,HIGH); // Se la barra di OVERLAP si accende, accendi il led
}
else
{
digitalWrite(13,LOW);}
if(ProgressBar2Value > 99)
{
digitalWrite(2,LOW); // Blocco software alla rotazione in senso orario
}
nexLoop(nex_listen_list); // Check for any touch event
}}