buongiorno a tutti, dopo un po di tempo ho ripreso il mio progetto con arduino, ringrazio ancora tutti x l aiuto dato con il potenziometro x gestire il volume audio, adesso mi sto cimentando con il modulo GPS Mini NEO-6M x avere le informazioni del numero di satelliti collegati e la velocità dell automobile, ho comprato questo modulo https://www.amazon.it/dp/B09J916W5V?psc=1&ref=ppx_yo2ov_dt_b_product_details e scitto il codice, il gps l ho recuperato da uno stereo che non funziona più, so di per certo che è nuovo perche mai usato. adesso dal monitor seriale non esce nessun dato, potete dirmi se il tutto dipende perchè sono dentro casa? o un problema di codice?
grazie mille
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#define RX_PIN 3 // Arduino Pin connected to the TX of the GPS module
#define TX_PIN 4 // Arduino Pin connected to the RX of the GPS module
TinyGPSPlus gps;
SoftwareSerial gpsSerial(RX_PIN, TX_PIN);
void setup() {
Serial.begin(9600);
gpsSerial.begin(9600);
Serial.println(F("GPS module"));
delay(5000);
}
void loop() {
if (gpsSerial.available() > 0) {
if (gps.encode(gpsSerial.read())) {
Serial.print(F("- speed: "));
if (gps.speed.isValid()) {
Serial.print(gps.speed.kmph());
Serial.println(F(" km/h"));
} else {
Serial.println(F("INVALID"));
}
Serial.print(F("-SAT: "));
if (gps.satellites.isValid()) {
Serial.print(gps.satellites.value());
}else{
Serial.println(F("INVALID"));
}
}
}
if (millis() > 5000 && gps.charsProcessed() < 10)
Serial.println(F("No GPS data received: check wiring"));
}
Buonasera a tutti, volevo chiedervi se il segnale gps è attendibile, perché ho messo in macchina, con un collegamento volante un arduino uno e la scheda gps e un display oled ssd1603, dove viene visualizzato il numero di satelliti, la velocità, e la direzione, il tutto funziona bene, soltanto che quando arrivo a casa una volta mi indica est, una volta mi indica NE, NW. E non è che la casa si muove, è sempre ferma li. Hahahahaha
Per avere la direzione dal GPS, devi calcolarla tra due punti successivi: se è aumentata la latitudine Nord ma non è cambiata la latitudine, per esempio, ti sei spostato verso Nord. Però ci sono anche librerie che lo fanno... Anni fa, infatti, feci così:
#include <NMEAGPS.h> // Using Neo-GPS lib
void Direzione()
{
if (fix.valid.heading)
{
int angle = fix.hdg.whole;
if (angle>=338 || angle<23) Dir=1;
else if (angle>=23 && angle<68) Dir=2;
else if (angle>=68 && angle<113) Dir=3;
else if (angle>=113 && angle<158) Dir=4;
else if (angle>=158 && angle<203) Dir=5;
else if (angle>=203 && angle<248) Dir=6;
else if (angle>=248 && angle<293) Dir=7;
else if (angle>=293 && angle<338) Dir=8;
if(Dir!=Diro)
{
Diro=Dir;
DirCamb=1;
if(Bussola==1 && Dir!=1 && Dir!=5) DirB=10-Dir;
else DirB=Dir;
switch (DirB)
{
case 1: lcd.createChar(3, Nord); break;
case 2: lcd.createChar(3, NordEst); break;
case 3: lcd.createChar(3, Est); break;
case 4: lcd.createChar(3, SudEst); break;
case 5: lcd.createChar(3, Sud); break;
case 6: lcd.createChar(3, SudOvest); break;
case 7: lcd.createChar(3, Ovest); break;
case 8: lcd.createChar(3, NordOvest); break;
}
lcd.setCursor(xLCD,0); lcd.write(byte(3)); // xLCD: posizione orizzontale impostata prima di chiamare Direzione()
}
}
else
{
lcd.setCursor( xLCD, 0 );
lcd.print(' ');
Diro=0; // Imposto Diro=0, così qualunque direzione venga poi rilevata sia
// diversa e quindi venga visualizzata.
}
}
In realtà, tutti i >= negli else if potrebbero essere eliminati.
Avevo preso anche in considerazione un magnetometro, e l ho anche acquistato, ma vedendo alcuni esempi in rete che calcolano gli angli con seno e coseno, pi greco, dove abito, ho lasciato perdere e mi son cimentato col gps. Se il megnetometro è più attendibile proverò a scrivere qualcosa. Ho comprato questo
ho trovato questo codice in rete che farebbe a caso mio, ma quando lo compilo mi da i seguenti codici di errore, da cosa sono derivati, la libreria è quella che da arduino. questo è il cidice
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);
void setup(void)
{
Serial.begin(9600);
}
void loop()
{
sensors_event_t event;
mag.getEvent(&event);
float heading = atan2(event.magnetic.y, event.magnetic.x);
float declinationAngle = 0.22;
heading += declinationAngle;
if (heading < 0) {
heading += 2 * PI;
}
if (heading > 2 * PI) {
heading -= 2 * PI;
}
float headingDegrees = heading * 180 / M_PI;
if (headingDegrees == 0 || headingDegrees == 360 ) {
Serial.println("N");
}
if (headingDegrees > 0 && headingDegrees < 90 ) {
Serial.print("N");
// Degree from north towards east direction
Serial.print(headingDegrees);
Serial.write(176);
Serial.println("E");
}
if (headingDegrees == 90) {
Serial.println("E");
}
if (headingDegrees > 90 && headingDegrees < 180 ) {
// Degree from south towards east direction
headingDegrees = 180 - headingDegrees;
Serial.print("S");
Serial.print(headingDegrees);
Serial.write(176);
Serial.println("E");
}
if (headingDegrees == 180) {
Serial.println("S");
}
if (headingDegrees > 180 && headingDegrees < 270 ) {
// Degree from south towards west direction
headingDegrees = headingDegrees - 180;
Serial.print("S");
Serial.print(headingDegrees);
Serial.write(176);
Serial.println("W");
}
if (headingDegrees == 270) {
Serial.println("W");
}
if (headingDegrees > 270 && headingDegrees < 360 ) {
// Degree from North towards west direction
headingDegrees = 360 - headingDegrees;
Serial.print("N");
Serial.print(headingDegrees);
Serial.write(176);
Serial.println("W");
}
delay(500);
}
devo solo modificare la visualizzazione del codice che dovrebbe scrivere sulla seriale, da inviare a visual basic, inquanto nel mio programma di visual basic ho creato una bussola che al cambiare del testo di una label la bussola si muove nella direzione correetta, esempio
se nella label c'è scritto west la bussola si muove verso west, e cosi via.
il codice di errore che mi da sono
In file included from c:\Users\francesco\OneDrive\Documents\Arduino\libraries\Adafruit_HMC5883_Unified-master\Adafruit_HMC5883_U.cpp:38:0:
C:\Users\francesco\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\libraries\Wire\src/Wire.h: In member function 'void Adafruit_HMC5883_Unified::read()':
C:\Users\francesco\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\libraries\Wire\src/Wire.h:69:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int, int)
uint8_t requestFrom(int, int, int);
^~~~~~~~~~~
C:\Users\francesco\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\libraries\Wire\src/Wire.h:66:13: note: candidate 2: uint8_t TwoWire::requestFrom(uint8_t, uint8_t, uint8_t)
uint8_t requestFrom(uint8_t, uint8_t, uint8_t);
^~~~~~~~~~~
questo codice è molto più semplice, ma mi da il medesimo errore nella compilazione, può essere un difetto della libreria
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_HMC5883_U.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C // See datasheet for Address
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
/* Assign a unique ID to this sensor at the same time */
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);
void setup(void)
{
Serial.begin(9600);
Serial.println("HMC5883 Magnetometer Test");
/* Initialise the sensor */
if (!mag.begin())
{
/* There was a problem detecting the HMC5883 ... check your connections */
Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
while (1);
}
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS))
{
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.display();
delay(500);
}
void loop(void)
{
/* Get a new sensor event */
sensors_event_t event;
mag.getEvent(&event);
// Calculate heading when the magnetometer is level, then correct for signs of axis.
float heading = atan2(event.magnetic.y, event.magnetic.x);
float declinationAngle = 0.06;
heading += declinationAngle;
// Correct for when signs are reversed.
if (heading < 0)
heading += 2 * PI;
// Check for wrap due to addition of declination.
if (heading > 2 * PI)
heading -= 2 * PI;
// Convert radians to degrees for readability.
float headingDegrees = heading * 180 / M_PI;
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
// Display angle in degrees
display.setTextSize(2);
display.setCursor(10, 10);
display.print(headingDegrees, 0);
display.print((char)247);
// Display direction in bold letters
display.setTextSize(3);
display.setCursor(10, 40);
if (headingDegrees >= 337.5 || headingDegrees < 22.5)
display.print("N");
else if (headingDegrees >= 22.5 && headingDegrees < 67.5)
display.print("NE");
else if (headingDegrees >= 67.5 && headingDegrees < 112.5)
display.print("E");
else if (headingDegrees >= 112.5 && headingDegrees < 157.5)
display.print("SE");
else if (headingDegrees >= 157.5 && headingDegrees < 202.5)
display.print("S");
else if (headingDegrees >= 202.5 && headingDegrees < 247.5)
display.print("SW");
else if (headingDegrees >= 247.5 && headingDegrees < 292.5)
display.print("W");
else if (headingDegrees >= 292.5 && headingDegrees < 337.5)
display.print("NW");
// Draw compass
int centerX = SCREEN_WIDTH - 35;
int centerY = SCREEN_HEIGHT / 2;
int radius = min(centerX, centerY) - 3; // Increase the radius value for a larger circle
display.drawCircle(centerX, centerY, radius, SSD1306_WHITE);
display.fillCircle(centerX, centerY, 2, SSD1306_WHITE); // Added small dot at the center
display.drawLine(centerX, centerY, centerX + radius * cos(heading - PI / 2), centerY + radius * sin(heading - PI / 2), SSD1306_WHITE);
display.display();
delay(500);
}
devo solo modificare la scritta display.print in serial.write x ciò che mi serve. e togliere tutto cio che riguarda il display, e calcolare il mio angolo di declinazione. il mio angolo di declinazione i miei punti sono
Magnetic Declination: +3° 33'
Declination is POSITIVE (EAST)
Inclination: 61° 36'
questa è la formula giusta:
(3+33/60)*PI/180 in radians=0.06195918844
grazie mille e scusate x le troppe domande
adesso tutto funziona, voglio solo chiedervi se la formula è giusta, così faccio le mie prove con vb.net e se ho ancora bisogno chiederò il vostro aiuto
grazie mille