Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - creare una bussola
Forum - C# / VB.NET - creare una bussola - Pagina 7

Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] Precedente | Prossimo
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 11:05
Giovedì, 21/03/2024
questo è quello che leggo dal serial monitor di arduino
Codice sorgente - presumibilmente Plain Text

  1. P;52
  2. B;300.90
  3. B;301.02
  4. B;301.06
  5. B;300.86
  6. B;301.26
  7. B;300.98
  8. B;300.90
  9. B;301.10
  10. B;301.14
  11. B;301.10



dove P sta ad indicare il valore del potenziometro x il volume, che nel programma lo gestisce timer1, solo che è da modificare perchè adesso da arduino x il potenziometro invio delle stringhe e non il semplice byte, e B che sarebbero le coordinate del magnetometro
questo è il codice di arduino:

Codice sorgente - presumibilmente C++

  1. #include "RTClib.h"
  2. #include <LiquidCrystal_I2C.h>
  3. #include <Wire.h>
  4. #include <Adafruit_Sensor.h>
  5. #include <Adafruit_HMC5883_U.h>
  6.  
  7. // CONFIGURAZIONE
  8. const byte P_LED = 9;
  9. const byte P_SET = 6;
  10. const byte P_RESET = 7;
  11. const byte P_RELE_APRE = 10;    //relè x sbloccare porta
  12. const byte P_RELE_BLOCCA = 11;  //rele x bloccare porta
  13.  
  14. Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);  //identifiacativo magnetometro
  15.  
  16. LiquidCrystal_I2C lcd(0x27, 16, 2);  //display lcd x la visualizzazione dell orario
  17.  
  18. RTC_DS3231 rtc;
  19. DateTime now;
  20.  
  21. char str[3];
  22. int stato1 = 0;
  23. int val = 0;
  24.  
  25. int val0 = 0;
  26.  
  27. // Buffer per la composizione delle stringhe da inviare via seriale
  28. char outBuf[20];
  29.  
  30. void setup() {
  31.   Wire.begin();
  32.   Serial.begin(9600);
  33.  
  34.   lcd.backlight();
  35.   lcd.init();
  36.  
  37.   //pulsanti set e reset
  38.   pinMode(P_SET, INPUT);
  39.   pinMode(P_RESET, INPUT);
  40.   pinMode(P_LED, OUTPUT);
  41.   pinMode(P_RELE_APRE, OUTPUT);
  42.   pinMode(P_RELE_BLOCCA, OUTPUT);
  43.   digitalWrite(P_RELE_APRE, HIGH);
  44.   digitalWrite(P_RELE_BLOCCA, HIGH);
  45.  
  46.   if (!rtc.begin()) {  //inizializzo l rtc
  47.     Serial.println("Couldn't find RTC");
  48.     while (true)
  49.       ;
  50.   }
  51.  
  52.   if (!rtc.lostPower()) {
  53.     //Serial.println("RTC is NOT running, let's set the time!");
  54.     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  55.   }
  56.   if (!mag.begin())  //inizializzo il magnetometro
  57.   {
  58.     /* There was a problem detecting the HMC5883 ... check your connections */
  59.     Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
  60.     while (1)
  61.       ;
  62.   }
  63. }
  64.  
  65. void loop() {
  66.   MostraOra();
  67.   bussola();
  68.   if (Serial.available()) {
  69.     // Gestione comandi da VB
  70.     // Per ora leggo solo un singolo carattere per volta
  71.     char comando = Serial.read();
  72.     switch (comando) {
  73.       case 'A':
  74.         digitalWrite(P_RELE_APRE, LOW);
  75.         delay(100);  // attivo o disattivo i rele in base al comando ricevuto da visual basic
  76.         digitalWrite(P_RELE_APRE, HIGH);
  77.         break;
  78.       case 'O':
  79.         digitalWrite(P_RELE_BLOCCA, LOW);
  80.         delay(100);
  81.         digitalWrite(P_RELE_BLOCCA, HIGH);
  82.         break;
  83.       default:
  84.         // Ignoro qualsiasi altro carattere
  85.         break;
  86.     }
  87.   }
  88.   int val = 0;
  89.   // Somma tre letture consecutive
  90.   for (int i = 0; i < 3; ++i)
  91.     val += analogRead(A0);
  92.   // Calcola la media
  93.   val = val / 3;
  94.   // Riporta il valore tra 0 e 100            //calcolo la media dei valori del potenziometro x il controllo del volume e li invio tramite la seriale,
  95.   val = map(val, 0, 1023, 0, 100);  // visualbasic cosi regolerà il volume del player
  96.   // Se il valore è cambiato
  97.   if (val < val0 - 1 || val > val0 + 1) {
  98.     // Manda il dato ("P" = potenziometro)
  99.     sprintf(outBuf, "P;%d", val);
  100.     Serial.println(outBuf);
  101.     val0 = val;
  102.   }
  103.   delay(100);
  104. }
  105.  
  106. void bussola() {  //evento bussola per indicare i gradi del magnetometro,
  107.   sensors_event_t event;
  108.   mag.getEvent(&event);
  109.   float heading = atan2(event.magnetic.y, event.magnetic.x);
  110.   float declinationAngle = 0.06;
  111.   heading += declinationAngle;
  112.   if (heading < 0) {
  113.     heading += 2 * PI;
  114.   }
  115.   if (heading > 2 * PI) {
  116.     heading -= 2 * PI;
  117.   }
  118.   float headingDegrees = heading * 180 / M_PI;
  119.   // Manda la lettura ("B"=bussola)
  120.   char deg[8];
  121.   // Gradi: ###.## quindi 6 caraatteri totali, inclusi 2 decimali)
  122.   dtostrf(headingDegrees, 6, 2, deg);
  123.   sprintf(outBuf, "B;%s", deg);
  124.   Serial.println(outBuf);
  125.   delay(500);
  126. }
  127.  
  128. void MostraOra() {
  129.   switch (stato1) {
  130.     case 0:
  131.       displayTime();
  132.       break;
  133.     case 1:
  134.       setHour();
  135.       break;
  136.     case 2:
  137.       setMinute();
  138.       break;
  139.     case 3:
  140.       setSecond();
  141.       break;
  142.     case 4:
  143.       setyear();
  144.       break;
  145.     case 5:
  146.       setmonth();
  147.       break;
  148.     case 6:
  149.       setday();
  150.       break;
  151.   }
  152. }
  153.  
  154.  
  155. unsigned long t1, dt1;
  156. bool FIRST = true;
  157.  
  158. void displayTime() {
  159.   if (FIRST) {
  160.     lcd.clear();
  161.     t1 = millis();
  162.     FIRST = false;
  163.   }
  164.  
  165.   dt1 = millis() - t1;
  166.   if (dt1 > 1000) {
  167.     now = rtc.now();
  168.     lcd.setCursor(4, 1);
  169.  
  170.     sprintf(str, "%02d", now.hour());
  171.     lcd.print(str);
  172.     lcd.print(':');
  173.     sprintf(str, "%02d", now.minute());
  174.     lcd.print(str);
  175.     lcd.print(':');
  176.     sprintf(str, "%02d", now.second());
  177.     lcd.print(str);
  178.  
  179.     lcd.setCursor(3, 0);
  180.  
  181.     sprintf(str, "%02d", now.day());
  182.     lcd.print(str);
  183.     lcd.print('/');
  184.     sprintf(str, "%02d", now.month());
  185.     lcd.print(str);
  186.     lcd.print('/');
  187.     sprintf(str, "%02d", now.year());
  188.     lcd.print(str);
  189.  
  190.     t1 = millis();
  191.   }
  192.  
  193.   if (digitalRead(P_SET)) {
  194.     //imposta ora
  195.     stato1 = 1;
  196.     delay(300);
  197.     FIRST = true;
  198.   }
  199. }
  200.  
  201. int seth = 0;
  202.  
  203. void setHour() {
  204.   if (FIRST) {
  205.     lcd.clear();
  206.     now = rtc.now();
  207.     seth = now.hour();
  208.     lcd.setCursor(0, 0);
  209.     lcd.print("Imposta ora");
  210.     FIRST = false;
  211.   }
  212.   lcd.setCursor(0, 1);
  213.   sprintf(str, "%02d", seth);
  214.   lcd.print(str);
  215.  
  216.   if (digitalRead(P_RESET)) {
  217.     seth++;
  218.     if (seth >= 24) seth = 0;
  219.     delay(200);
  220.   }
  221.   if (digitalRead(P_SET)) {
  222.     //salva ora scelta e passa ai minuti
  223.     rtc.adjust(DateTime(now.year(), now.month(), now.day(), seth, now.minute(), now.second()));
  224.     stato1 = 2;
  225.     FIRST = true;
  226.     delay(200);
  227.   }
  228. }
  229.  
  230. int setm;
  231. void setMinute() {
  232.   if (FIRST) {
  233.     lcd.clear();
  234.     now = rtc.now();
  235.     setm = now.minute();
  236.     lcd.setCursor(0, 0);
  237.     lcd.print("Imposta minuti");
  238.     FIRST = false;
  239.   }
  240.   lcd.setCursor(0, 1);
  241.   sprintf(str, "%02d", setm);
  242.   lcd.print(str);
  243.  
  244.   if (digitalRead(P_RESET)) {
  245.     setm++;
  246.     if (setm >= 60) setm = 0;
  247.     delay(200);
  248.   }
  249.   if (digitalRead(P_SET)) {
  250.     //salva min scelta e passa ai sec
  251.     rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), setm, now.second()));
  252.     stato1 = 3;
  253.     delay(200);
  254.     FIRST = true;
  255.   }
  256. }
  257.  
  258. int sets = 0;
  259.  
  260. void setSecond() {
  261.   if (FIRST) {
  262.     lcd.clear();
  263.     now = rtc.now();
  264.     sets = now.second();
  265.     lcd.setCursor(0, 0);
  266.     lcd.print("Imposta sec.");
  267.     FIRST = false;
  268.   }
  269.   lcd.setCursor(0, 1);
  270.   sprintf(str, "%02d", sets);
  271.   lcd.print(str);
  272.  
  273.   if (digitalRead(P_RESET)) {
  274.     sets++;
  275.     if (sets >= 60) sets = 0;
  276.     delay(200);
  277.   }
  278.   if (digitalRead(P_SET)) {
  279.     //salva sec scelta e passa ai minuti
  280.     rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), sets));
  281.     stato1 = 4;
  282.     delay(200);
  283.     FIRST = true;
  284.   }
  285. }
  286.  
  287. int sety = 0;
  288.  
  289. void setyear() {
  290.   if (FIRST) {
  291.     lcd.clear();
  292.     now = rtc.now();
  293.     sety = now.year();
  294.     lcd.setCursor(0, 0);
  295.     lcd.print("Imposta anno");
  296.     FIRST = false;
  297.   }
  298.   lcd.setCursor(0, 1);
  299.   sprintf(str, "%02d", sety);
  300.   lcd.print(str);
  301.  
  302.   if (digitalRead(P_RESET)) {
  303.     sety++;
  304.     if (sety >= 9999) sety = 0;
  305.     delay(200);
  306.   }
  307.   if (digitalRead(P_SET)) {
  308.     //salva sec scelta e passa ai minuti
  309.     rtc.adjust(DateTime(sety, now.month(), now.day(), now.hour(), now.minute(), now.second()));
  310.     stato1 = 5;
  311.     delay(200);
  312.     FIRST = true;
  313.   }
  314. }
  315.  
  316. int setmo = 0;
  317.  
  318. void setmonth() {
  319.   if (FIRST) {
  320.     lcd.clear();
  321.     now = rtc.now();
  322.     setmo = now.month();
  323.     lcd.setCursor(0, 0);
  324.     lcd.print("Imposta mese");
  325.     FIRST = false;
  326.   }
  327.   lcd.setCursor(0, 1);
  328.   sprintf(str, "%02d", setmo);
  329.   lcd.print(str);
  330.  
  331.   if (digitalRead(P_RESET)) {
  332.     setmo++;
  333.     if (setmo >= 12) setmo = 0;
  334.     delay(200);
  335.   }
  336.   if (digitalRead(P_SET)) {
  337.     //salva sec scelta e passa ai minuti
  338.     rtc.adjust(DateTime(now.year(), setmo, now.day(), now.hour(), now.minute(), now.second()));
  339.     stato1 = 6;
  340.     delay(200);
  341.     FIRST = true;
  342.   }
  343. }
  344.  
  345. int setd = 0;
  346.  
  347. void setday() {
  348.   if (FIRST) {
  349.     lcd.clear();
  350.     now = rtc.now();
  351.     setd = now.day();
  352.     lcd.setCursor(0, 0);
  353.     lcd.print("Imposta giorno");
  354.     FIRST = false;
  355.   }
  356.   lcd.setCursor(0, 1);
  357.   sprintf(str, "%02d", setd);
  358.   lcd.print(str);
  359.  
  360.   if (digitalRead(P_RESET)) {
  361.     setd++;
  362.     if (setd >= 32) setd = 0;
  363.     delay(200);
  364.   }
  365.   if (digitalRead(P_SET)) {
  366.     //salva sec scelta e passa ai minuti
  367.     rtc.adjust(DateTime(now.year(), now.month(), setd, now.hour(), now.minute(), now.second()));
  368.     stato1 = 0;
  369.     delay(200);
  370.     FIRST = true;
  371.   }
  372. }


PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 11:49
Giovedì, 21/03/2024
ho provato a disabilitare timer2, per vedere se il tutto funzionasse, in parte si, soltanto che nel mio programma il livello del volume impazzisce, e si alza e abbassa senza nessun controllo. molto probabilmente perchè non riceve più i singoli byte ma una stringa?

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 17:21
Giovedì, 21/03/2024
Certo, il codice del volume deve filtrare i dati ricevuti.

Riguardando il tuo codice, semplificherei ulteriormente, perché mi sembra vantaggioso inviare i dati nella seriale in un colpo solo, gli identificativi non servono più e i valori li identifichi in base alla posizione (già accennato), ho scritto un esempio in C che ti dovrebbe chiarire il concetto, inoltre puoi provare il codice su: https://www.onlinegdb.com/online_c_compiler

Codice sorgente - presumibilmente C#

  1. #include <stdio.h>
  2.  
  3. void bussola(char *outBussola)
  4. {
  5.     float headingDegrees = 320.5; // gradi di esempio tu li prenderai dal magnetometro
  6.     sprintf(outBussola, "%.2f", headingDegrees); // converte in stringa con 2 cifre decimali
  7. }
  8.  
  9. void loop() {
  10.     char outBussola[8]; // conterrà la stringa creata in bussola()
  11.     bussola(outBussola); // richiama la routine che legge i gradi
  12.    
  13.     char outBuf[20]; // spazio per la stringa d'uscita
  14.     int val = 10; // volume a 10, tu lo prenderai dal potenziometro
  15.    
  16.     sprintf(outBuf, "%s;%d", outBussola, val); // concatena i due valori separati da puntovirgola
  17.    
  18.     printf("%s\n", outBuf); // check stringa da inviare
  19.     //Serial.println(outBuf); // tu invece invii alla seriale
  20. }
  21.  
  22. int main()
  23. {
  24.     loop(); // richiama la routine una volta, tu tutte le volte che vuoi
  25.     return 0;
  26. }



in questo modo invii:

320.50;10

in VB tutto si semplifica e un timer è sufficiente:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
  2.     Dim str As String
  3.     str = RiceviDati()
  4.      
  5.     Dim valoriDivisi() As String ' matrice senza dimensione
  6.     valoriDivisi = str.Split(";") ' il puntoevirgola separa le stringe: in valoriDivisi(0) ci vanno i gradi bussola e in valoriDivisi(1) ci va il volume
  7.     If valoriDivisi(0) = "E" Then
  8.            lblgradi.Text = "errore"
  9.            ' in valoriDivisi(1) ' il tipo d'errore da mostrare dove vuoi
  10.     else
  11.            ' Il primo dato è riferito ai gradi della bussola
  12.             valoriDivisi(0) = valoriDivisi(0).Replace(".", ",") ' se ci fosse il punto decimale viene sostituito con la virgola decimale
  13.             avanzamento = CInt(valoriDivisi(0))
  14.             Label1.Text = avanzamento.ToString("000°")
  15.             PictureBox1.Invalidate() ' scatena il paint
  16.  
  17.            ' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
  18.  
  19.             media_pleyer.lb_volume.Text = valoriDivisi(1) + "%"
  20.             media_pleyer.Volume_control1.value = valoriDivisi(1)
  21.             lb_volume.Text = valoriDivisi(1) + "%"
  22.             Volume_control1.value = valoriDivisi(1)
  23.             media_pleyer.Timer3.Start()
  24.             media_pleyer.AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  25.             AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  26.             video.Wmp1.settings.voume = video.Volume_control1.value
  27.     End If      
  28. End Sub



anche la function va modificata:

Codice sorgente - presumibilmente VB.NET

  1. Function RiceviDati() As String
  2.     Dim Ricevuti As String
  3.     Try
  4.         Ricevuti = SerialPort1.ReadExisting
  5.         If Ricevuti = Nothing Then
  6.             Return "E;null" ' ritorna con la E
  7.         else
  8.             Return Ricevuti
  9.         End If
  10.     Catch ex As Exception      
  11.         Return "E;" & ex.Message ' ritorna con la E
  12.     End Try
  13. End Function



Naturalmente non ho provato nulla, se c'è qualche svista perdonami.

Ultima modifica effettuata da Carlo il 21/03/2024 alle 22:52


in programmazione tutto è permesso
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 1:51
Sabato, 23/03/2024
buonasera a tutti, purtroppo dal tuo esmpio non ho capito quasi niente, o per lo meno, dovrei stare a modificare anche il codice di arduino, quando adesso funziona bene su quello che ci siamo detti prima, ho scritto un codice facendo la prova nel realizzare un monitor seriale per vedere se visualbasic ricevesse ciò che arduino invia, e dal programma tutto funziona, adesso, tornando al discorso di prima di splkittare le varie stringhe che arrivano, è fattibile, e posizionarle nelle rispettive funzioni, quali voume e lbldirezione? questo è il codice del monitor seriale, fatto alla ben meglio senza stare a modificare nomi o altro. Da qui si può pensare di fare i, tutto spiegato prima, scusa ancora ma star a modificare ancora il codice di arduino è un impresa.
Codice sorgente - presumibilmente VB.NET

  1. Imports System.IO.Ports
  2. Public Class Form1
  3.  
  4.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  5.         ComboBox1.Items.AddRange(IO.Ports.SerialPort.GetPortNames)
  6.     End Sub
  7.  
  8.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click  //pulsante x ricaricare
  9.         ComboBox1.Items.Clear()
  10.         ComboBox1.Items.AddRange(IO.Ports.SerialPort.GetPortNames)
  11.     End Sub
  12.  
  13.     Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click   //apri la connessione
  14.         If ComboBox1.Text <> "" Then  
  15.             Try
  16.                 SerialPort1.Encoding = System.Text.Encoding.Default
  17.                 SerialPort1.PortName = ComboBox1.Text
  18.                 SerialPort1.Open()
  19.                 Timer1.Start()
  20.             Catch ex As Exception
  21.                 MsgBox("errore:" & ex.Message, MsgBoxStyle.Critical)
  22.  
  23.             End Try
  24.         End If
  25.     End Sub
  26.  
  27.     Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click  //chiudi la connessione
  28.         SerialPort1.Close()
  29.         Timer1.Stop()
  30.         TextBox1.Text = ""
  31.  
  32.     End Sub
  33.     Function RiceviDati() As String
  34.         Dim ricevuti As String
  35.         Try
  36.             ricevuti = SerialPort1.ReadExisting
  37.             If ricevuti <> Nothing Then
  38.                 Return ricevuti
  39.  
  40.             End If
  41.  
  42.         Catch ex As Exception
  43.             Return "errore: " & ex.Message
  44.         End Try
  45.     End Function
  46.  
  47.     Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
  48.         Dim str As String
  49.         str = RiceviDati()
  50.         TextBox1.Text += str
  51.  
  52.     End Sub
  53.  
  54.     Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
  55.         TextBox1.Select(TextBox1.TextLength, 0)
  56.         TextBox1.ScrollToCaret()
  57.     End Sub
  58. End Class


vi chiedo se da qui è mpossibile splittare i vari valori che arrivano dalla seriale che in questo momento sono
B:"coordinate" 000.00
P:"valore potenziometro"  da 0 a 100
grazie mille

Ultima modifica effettuata da nightwolf il 23/03/2024 alle 1:54
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 8:46
Sabato, 23/03/2024
Si, tutto codice già postato, hai cambiato solo il puntoevirgola con i duepunti, riepiloghiamo:
riposto la function ma con i duepunti
Codice sorgente - presumibilmente VB.NET

  1. Function RiceviDati() As String
  2.         Dim ricevuti As String
  3.         Try
  4.             ricevuti = SerialPort1.ReadExisting
  5.  
  6.             If ricevuti = Nothing Then
  7.                 return "N:null" ' duepunti al posto del puntovirgola
  8.             else
  9.                 Return ricevuti
  10.             End If
  11.  
  12.         Catch ex As Exception
  13.             Return "E:" & ex.Message ' duepunti al posto del puntovirgola
  14.         End Try
  15. End Function



il timer
Codice sorgente - presumibilmente VB.NET

  1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
  2.     Dim str As String
  3.     str = RiceviDati()
  4.     TextBox1.Text += str ' tuo monitor
  5.  
  6.     Dim valoriDivisi() As String ' matrice senza dimensione
  7.     valoriDivisi = str.Split(":") ' duepunti separa le stringhe: in valoriDivisi(0) ci va il codice identificativo (B = gradi bussola, P = potenziometro, N = null, E = errore) e in valoriDivisi(1) ci va il valore relativo
  8.  
  9.     If valoriDivisi(0) = "B" Then
  10.       ' Il dato è riferito ai gradi della bussola
  11.         valoriDivisi(1) = valoriDivisi(1).Replace(".", ",") ' se ci fosse il punto decimale viene sostituito con la virgola decimale
  12.       ' ******* il codice per far funzionare la bussola, togli i rem quando inseriscie nel definitivo *******
  13.       '  avanzamento = CInt(valoriDivisi(1))
  14.       '  lblgradi.Text = avanzamento.ToString("000°")
  15.       '  Pcboxbussola.Invalidate() ' scatena il paint
  16.     End If
  17.  
  18.     If valoriDivisi(0) = "P" Then
  19.        ' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
  20.        ' ******* il codice per far funzionare il volume, togli i rem quando inseriscie nel definitivo *******
  21.        ' media_pleyer.lb_volume.Text = valoriDivisi(1) + "%"
  22.        ' media_pleyer.Volume_control1.value = valoriDivisi(1)
  23.        ' lb_volume.Text = valoriDivisi(1) + "%"
  24.        ' Volume_control1.value = valoriDivisi(1)
  25.        ' media_pleyer.Timer3.Start()
  26.        ' media_pleyer.AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  27.        ' AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  28.        ' video.Wmp1.settings.voume = video.Volume_control1.value
  29.     End If
  30.  
  31.     ' possibili usi degli errori ritornati se ometti li ignori
  32.     If valoriDivisi(0) = "N" Then
  33.         ' Il dato è riferito a nessun valore ricevuto
  34.          ' lblgradi.Text = valoriDivisi(1) ' l'info su lblgradi, oppure dove vuoi
  35.     End If
  36.  
  37.     If valoriDivisi(0) = "E" Then
  38.         ' Il dato è riferito a errore sulla seriale
  39.         ' lblgradi.Text = valoriDivisi(1) ' il tipo d'errore su lblgradi, oppure dove vuoi
  40.     End If
  41.  
  42. End Sub



un timer solo....

Ho copiato incollato e corretto, se ci sono sviste scusa.

Mi chiedo, cosa ti ha impedito di farlo da solo? Cosa non avevi capito? Per favore dimmelo. :yup:

Ultima modifica effettuata da Carlo il 23/03/2024 alle 8:56


in programmazione tutto è permesso
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 9:57
Sabato, 23/03/2024
Controlla sopra ho risposto alla tua domanda, ora se hai tempo se puoi e se vuoi prova questo codice in arduino e controlla se invia i dati: gradi;volume 000.00;100

Codice sorgente - presumibilmente C++

  1. #include "RTClib.h"
  2. #include <LiquidCrystal_I2C.h>
  3. #include <Wire.h>
  4. #include <Adafruit_Sensor.h>
  5. #include <Adafruit_HMC5883_U.h>
  6.      
  7. // CONFIGURAZIONE
  8. const byte P_LED = 9;
  9. const byte P_SET = 6;
  10. const byte P_RESET = 7;
  11. const byte P_RELE_APRE = 10;    //relè x sbloccare porta
  12. const byte P_RELE_BLOCCA = 11;  //rele x bloccare porta
  13.      
  14. Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);  //identifiacativo magnetometro
  15.      
  16. LiquidCrystal_I2C lcd(0x27, 16, 2);  //display lcd x la visualizzazione dell orario
  17.      
  18. RTC_DS3231 rtc;
  19. DateTime now;
  20.      
  21. char str[3];
  22. int stato1 = 0;
  23. int val = 0;
  24.      
  25. int val0 = 0;
  26.      
  27. // Buffer per la composizione delle stringhe da inviare via seriale
  28. char outBuf[20];
  29.      
  30. void setup() {
  31.       Wire.begin();
  32.       Serial.begin(9600);
  33.      
  34.       lcd.backlight();
  35.       lcd.init();
  36.      
  37.       //pulsanti set e reset
  38.       pinMode(P_SET, INPUT);
  39.       pinMode(P_RESET, INPUT);
  40.       pinMode(P_LED, OUTPUT);
  41.       pinMode(P_RELE_APRE, OUTPUT);
  42.       pinMode(P_RELE_BLOCCA, OUTPUT);
  43.       digitalWrite(P_RELE_APRE, HIGH);
  44.       digitalWrite(P_RELE_BLOCCA, HIGH);
  45.      
  46.       if (!rtc.begin()) {  //inizializzo l rtc
  47.         Serial.println("Couldn't find RTC");
  48.         while (true)
  49.           ;
  50.       }
  51.      
  52.       if (!rtc.lostPower()) {
  53.         //Serial.println("RTC is NOT running, let's set the time!");
  54.         rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  55.       }
  56.       if (!mag.begin())  //inizializzo il magnetometro
  57.       {
  58.         /* There was a problem detecting the HMC5883 ... check your connections */
  59.         Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
  60.         while (1)
  61.           ;
  62.       }
  63. }
  64.      
  65. void loop() {
  66.       MostraOra();
  67.       char outBussola[8]; // conterrà la stringa creata in bussola()
  68.       bussola(outBussola); // richiama la routine che legge i gradi
  69.       if (Serial.available()) {
  70.         // Gestione comandi da VB
  71.         // Per ora leggo solo un singolo carattere per volta
  72.         char comando = Serial.read();
  73.         switch (comando) {
  74.           case 'A':
  75.             digitalWrite(P_RELE_APRE, LOW);
  76.             delay(100);  // attivo o disattivo i rele in base al comando ricevuto da visual basic
  77.             digitalWrite(P_RELE_APRE, HIGH);
  78.             break;
  79.           case 'O':
  80.             digitalWrite(P_RELE_BLOCCA, LOW);
  81.             delay(100);
  82.             digitalWrite(P_RELE_BLOCCA, HIGH);
  83.             break;
  84.           default:
  85.             // Ignoro qualsiasi altro carattere
  86.             break;
  87.         }
  88.       }
  89.       int val = 0;
  90.       // Somma tre letture consecutive
  91.       for (int i = 0; i < 3; ++i)
  92.           val += analogRead(A0);
  93.  
  94.       // Calcola la media
  95.       val = val / 3;
  96.       // Riporta il valore tra 0 e 100            
  97.       val = map(val, 0, 1023, 0, 100);  // visualbasic cosi regolerà il volume del player
  98.        
  99.       sprintf(outBuf, "%s;%d", outBussola, val); // concatena i due valori separati da puntovirgola
  100.       Serial.println(outBuf); // invii alla seriale
  101.      
  102.       delay(300); // aggiustare valore per migliori prestazioni tra 50 e 500
  103. }
  104.      
  105. void bussola(char *outBussola) {  //evento bussola per indicare i gradi del magnetometro,
  106.       sensors_event_t event;
  107.       mag.getEvent(&event);
  108.       float heading = atan2(event.magnetic.y, event.magnetic.x);
  109.       float declinationAngle = 0.06;
  110.       heading += declinationAngle;
  111.       if (heading < 0) {
  112.         heading += 2 * PI;
  113.       }
  114.       if (heading > 2 * PI) {
  115.         heading -= 2 * PI;
  116.       }
  117.       float headingDegrees = heading * 180 / M_PI;
  118.       sprintf(outBussola, "%.2f", headingDegrees); // converte in stringa con 2 cifre decimali
  119.       // Serial.println(outBuf); // l'invio avverrà su loop()
  120.       // delay(500); // non serve se non si scrive sulla seriale
  121. }
  122.      
  123. void MostraOra() {
  124.       switch (stato1) {
  125.         case 0:
  126.           displayTime();
  127.           break;
  128.         case 1:
  129.           setHour();
  130.           break;
  131.         case 2:
  132.           setMinute();
  133.           break;
  134.         case 3:
  135.           setSecond();
  136.           break;
  137.         case 4:
  138.           setyear();
  139.           break;
  140.         case 5:
  141.           setmonth();
  142.           break;
  143.         case 6:
  144.           setday();
  145.           break;
  146.       }
  147. }
  148.      
  149.      
  150.     unsigned long t1, dt1;
  151.     bool FIRST = true;
  152.      
  153. void displayTime() {
  154.       if (FIRST) {
  155.         lcd.clear();
  156.         t1 = millis();
  157.         FIRST = false;
  158.       }
  159.      
  160.       dt1 = millis() - t1;
  161.       if (dt1 > 1000) {
  162.         now = rtc.now();
  163.         lcd.setCursor(4, 1);
  164.      
  165.         sprintf(str, "%02d", now.hour());
  166.         lcd.print(str);
  167.         lcd.print(':');
  168.         sprintf(str, "%02d", now.minute());
  169.         lcd.print(str);
  170.         lcd.print(':');
  171.         sprintf(str, "%02d", now.second());
  172.         lcd.print(str);
  173.      
  174.         lcd.setCursor(3, 0);
  175.      
  176.         sprintf(str, "%02d", now.day());
  177.         lcd.print(str);
  178.         lcd.print('/');
  179.         sprintf(str, "%02d", now.month());
  180.         lcd.print(str);
  181.         lcd.print('/');
  182.         sprintf(str, "%02d", now.year());
  183.         lcd.print(str);
  184.      
  185.         t1 = millis();
  186.       }
  187.      
  188.       if (digitalRead(P_SET)) {
  189.         //imposta ora
  190.         stato1 = 1;
  191.         delay(300);
  192.         FIRST = true;
  193.       }
  194. }
  195.      
  196.     int seth = 0;
  197.      
  198. void setHour() {
  199.       if (FIRST) {
  200.         lcd.clear();
  201.         now = rtc.now();
  202.         seth = now.hour();
  203.         lcd.setCursor(0, 0);
  204.         lcd.print("Imposta ora");
  205.         FIRST = false;
  206.       }
  207.       lcd.setCursor(0, 1);
  208.       sprintf(str, "%02d", seth);
  209.       lcd.print(str);
  210.      
  211.       if (digitalRead(P_RESET)) {
  212.         seth++;
  213.         if (seth >= 24) seth = 0;
  214.         delay(200);
  215.       }
  216.       if (digitalRead(P_SET)) {
  217.         //salva ora scelta e passa ai minuti
  218.         rtc.adjust(DateTime(now.year(), now.month(), now.day(), seth, now.minute(), now.second()));
  219.         stato1 = 2;
  220.         FIRST = true;
  221.         delay(200);
  222.       }
  223. }
  224.      
  225.     int setm;
  226. void setMinute() {
  227.       if (FIRST) {
  228.         lcd.clear();
  229.         now = rtc.now();
  230.         setm = now.minute();
  231.         lcd.setCursor(0, 0);
  232.         lcd.print("Imposta minuti");
  233.         FIRST = false;
  234.       }
  235.       lcd.setCursor(0, 1);
  236.       sprintf(str, "%02d", setm);
  237.       lcd.print(str);
  238.      
  239.       if (digitalRead(P_RESET)) {
  240.         setm++;
  241.         if (setm >= 60) setm = 0;
  242.         delay(200);
  243.       }
  244.       if (digitalRead(P_SET)) {
  245.         //salva min scelta e passa ai sec
  246.         rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), setm, now.second()));
  247.         stato1 = 3;
  248.         delay(200);
  249.         FIRST = true;
  250.       }
  251. }
  252.      
  253.     int sets = 0;
  254.      
  255. void setSecond() {
  256.       if (FIRST) {
  257.         lcd.clear();
  258.         now = rtc.now();
  259.         sets = now.second();
  260.         lcd.setCursor(0, 0);
  261.         lcd.print("Imposta sec.");
  262.         FIRST = false;
  263.       }
  264.       lcd.setCursor(0, 1);
  265.       sprintf(str, "%02d", sets);
  266.       lcd.print(str);
  267.      
  268.       if (digitalRead(P_RESET)) {
  269.         sets++;
  270.         if (sets >= 60) sets = 0;
  271.         delay(200);
  272.       }
  273.       if (digitalRead(P_SET)) {
  274.         //salva sec scelta e passa ai minuti
  275.         rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), sets));
  276.         stato1 = 4;
  277.         delay(200);
  278.         FIRST = true;
  279.       }
  280. }
  281.      
  282.     int sety = 0;
  283.      
  284. void setyear() {
  285.       if (FIRST) {
  286.         lcd.clear();
  287.         now = rtc.now();
  288.         sety = now.year();
  289.         lcd.setCursor(0, 0);
  290.         lcd.print("Imposta anno");
  291.         FIRST = false;
  292.       }
  293.       lcd.setCursor(0, 1);
  294.       sprintf(str, "%02d", sety);
  295.       lcd.print(str);
  296.      
  297.       if (digitalRead(P_RESET)) {
  298.         sety++;
  299.         if (sety >= 9999) sety = 0;
  300.         delay(200);
  301.       }
  302.       if (digitalRead(P_SET)) {
  303.         //salva sec scelta e passa ai minuti
  304.         rtc.adjust(DateTime(sety, now.month(), now.day(), now.hour(), now.minute(), now.second()));
  305.         stato1 = 5;
  306.         delay(200);
  307.         FIRST = true;
  308.       }
  309. }
  310.      
  311.     int setmo = 0;
  312.      
  313. void setmonth() {
  314.       if (FIRST) {
  315.         lcd.clear();
  316.         now = rtc.now();
  317.         setmo = now.month();
  318.         lcd.setCursor(0, 0);
  319.         lcd.print("Imposta mese");
  320.         FIRST = false;
  321.       }
  322.       lcd.setCursor(0, 1);
  323.       sprintf(str, "%02d", setmo);
  324.       lcd.print(str);
  325.      
  326.       if (digitalRead(P_RESET)) {
  327.         setmo++;
  328.         if (setmo >= 12) setmo = 0;
  329.         delay(200);
  330.       }
  331.       if (digitalRead(P_SET)) {
  332.         //salva sec scelta e passa ai minuti
  333.         rtc.adjust(DateTime(now.year(), setmo, now.day(), now.hour(), now.minute(), now.second()));
  334.         stato1 = 6;
  335.         delay(200);
  336.         FIRST = true;
  337.       }
  338. }
  339.      
  340.     int setd = 0;
  341.      
  342. void setday() {
  343.       if (FIRST) {
  344.         lcd.clear();
  345.         now = rtc.now();
  346.         setd = now.day();
  347.         lcd.setCursor(0, 0);
  348.         lcd.print("Imposta giorno");
  349.         FIRST = false;
  350.       }
  351.       lcd.setCursor(0, 1);
  352.       sprintf(str, "%02d", setd);
  353.       lcd.print(str);
  354.      
  355.       if (digitalRead(P_RESET)) {
  356.         setd++;
  357.         if (setd >= 32) setd = 0;
  358.         delay(200);
  359.       }
  360.       if (digitalRead(P_SET)) {
  361.         //salva sec scelta e passa ai minuti
  362.         rtc.adjust(DateTime(now.year(), now.month(), setd, now.hour(), now.minute(), now.second()));
  363.         stato1 = 0;
  364.         delay(200);
  365.         FIRST = true;
  366.       }
  367. }



Il codice è il tuo non sono entrato nel merito e non ho cambiato nulla, solo l'invio sulla seriale in un colpo solo.

Con un invio solo puoi ottimizzare il delay e far girare la bussola in modo più fluido riga 102.

Ultima modifica effettuata da Carlo il 23/03/2024 alle 11:14


in programmazione tutto è permesso
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 14:17
Sabato, 23/03/2024
ciao e grazie, il codice in vb.net adesso non si blocca più però non succede niente, non si muve la bussola ne tanto meno il volume, non mi nessun errore, mentre il codice in aurduino dalla seriale esce soltanto ? e i valori del potenziometro, nient altro.
ho fatto come mi hai spiegato ma non succede niente ho fatto anche un video dimostrativo e se riesco lo posto. cmq questo è il codice che mi hai spiegato.
Codice sorgente - presumibilmente VB.NET

  1. Function RiceviDati() As String
  2.         Dim ricevuti As String
  3.         Try
  4.             ricevuti = SerialPort1.ReadExisting
  5.  
  6.             If ricevuti = Nothing Then
  7.                 Return "N:null" ' duepunti al posto del puntovirgola
  8.             Else
  9.                 Return ricevuti
  10.             End If
  11.  
  12.         Catch ex As Exception
  13.             Return "E:" & ex.Message ' duepunti al posto del puntovirgola
  14.         End Try
  15.     End Function
  16.  
  17.     Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
  18.         Dim str As String
  19.         str = RiceviDati()
  20.         TextBox1.Text += str ' tuo monitor
  21.  
  22.         Dim valoriDivisi() As String ' matrice senza dimensione
  23.         valoriDivisi = str.Split(":") ' due punti separa le stringhe: in valoriDivisi(0) ci va il codice identificativo (B = gradi bussola, P = potenziometro, N = null, E = errore) e in valoriDivisi(1) ci va il valore relativo
  24.  
  25.         If valoriDivisi(0) = "B" Then
  26.             ' Il dato è riferito ai gradi della bussola
  27.             valoriDivisi(1) = valoriDivisi(1).Replace(".", ",") ' se ci fosse il punto decimale viene sostituito con la virgola decimale
  28.             ' ******* il codice per far funzionare la bussola, togli i rem quando inseriscie nel definitivo *******
  29.             avanzamento = CInt(valoriDivisi(1))
  30.             lblgradi.Text = avanzamento.ToString("000°")
  31.             Pcboxbussola.Invalidate() ' scatena il paint
  32.         End If
  33.  
  34.         If valoriDivisi(0) = "P" Then
  35.             ' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
  36.             ' ******* il codice per far funzionare il volume, togli i rem quando inseriscie nel definitivo *******
  37.             media_pleyer.lb_volume.Text = valoriDivisi(1) + "%"
  38.             media_pleyer.Volume_control1.value = valoriDivisi(1)
  39.             lb_volume.Text = valoriDivisi(1) + "%"
  40.             Volume_control1.value = valoriDivisi(1)
  41.             media_pleyer.Timer3.Start()
  42.             media_pleyer.AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  43.             AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
  44.             video.Wmp1.settings.voume = video.Volume_control1.value
  45.         End If
  46.  
  47.         ' possibili usi degli errori ritornati se ometti li ignori
  48.         If valoriDivisi(0) = "N" Then
  49.             ' Il dato è riferito a nessun valore ricevuto
  50.             lblgradi.Text = valoriDivisi(1) ' l'info su lblgradi, oppure dove vuoi
  51.         End If
  52.  
  53.         If valoriDivisi(0) = "E" Then
  54.             ' Il dato è riferito a errore sulla seriale
  55.             lblgradi.Text = valoriDivisi(1) ' il tipo d'errore su lblgradi, oppure dove vuoi
  56.         End If
  57.  
  58.     End Sub
  59.  
  60.     Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
  61.         TextBox1.Select(TextBox1.TextLength, 0)
  62.         TextBox1.ScrollToCaret()
  63.     End Sub


ho disabilitato timer1 per avere un solo timer.

PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 14:20
Sabato, 23/03/2024
ps. non riesco a capire dove ci sono i ":", dalla seriale esce B;329.20 e P;44
ma se cambio i : con il ;, mi da errore.

PM Quote
Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] Precedente | Prossimo