Ich arbeite daran, GPS-Werte (vom u-blox Neo 6m GPS-Modul) mit einem Arduino Pro Mini auf einer SD-Karte zu protokollieren.
Der Code, mit dem ich arbeite, funktioniert ohne Fehler, wenn wir den Arduino mit einem USB-Kabel an den Laptop anschließen (die Stromquelle stammt vom USB-Anschluss).
Sobald ich mein Programm ausführe, werden alle GPS-Koordinaten zusammen mit anderen Daten auf der SD-Karte gespeichert.
Sobald ich meine Stromversorgung auf zwei CR2032-Batterien in Reihe ändere und die Spannung an den Pro Mini anlege, kommen Daten für etwa zehn Sekunden und dann beginnt die LED (Pin13) superschnell zu blinken (ich codiere nichts anderes an Pin13 als die sck vom SD-Kartenmodul für die Spi-Kommunikation.)
Dann fiel mir ein, dass vielleicht zwei Batterien nicht ausreichen werden, also habe ich drei CR2032-Batterien in Reihe verwendet und dann das Setup überprüft. Jetzt funktioniert alles perfekt für etwa eine Minute und dann fängt die LED (Pin13) an zu blinken und ruiniert das Programm.
Wenn die LED schnell blinkt, werden keine Daten auf der SD-Karte gespeichert.
Ich bin mir nicht sicher, wie ich das Problem lösen soll. Vielleicht ist hier der Strom das Problem, aber ich kann keine anderen Batterien als CR2032 verwenden.
Kann mir jemand helfen?
code ive verwendet
#include <TinyGPS++.h> // Include the TinyGPS++ library
TinyGPSPlus tinyGPS; // Create a TinyGPSPlus object
#include <SD.h>
#include <SPI.h>
#define GPS_BAUD 9600 // GPS module baud rate. GP3906 defaults to 9600.
#include <Wire.h>
// If you're using an Arduino Uno, RedBoard, or any board that uses the
// 0/1 UART for programming/Serial monitor-ing, use SoftwareSerial:
#include <SoftwareSerial.h>
#define ARDUINO_GPS_RX 2 // GPS TX, Arduino RX pin
#define ARDUINO_GPS_TX 3 // GPS RX, Arduino TX pin
SoftwareSerial ssGPS(ARDUINO_GPS_TX, ARDUINO_GPS_RX); // Create a SoftwareSerial
#define SDFILE_PIN_CS 10
// Set gpsPort to either ssGPS if using SoftwareSerial or Serial1 if using an
// Arduino with a dedicated hardware serial port
#define gpsPort ssGPS // Alternatively, use Serial1 on the Leonardo
File sdFile;
// Define the serial monitor port. On the Uno, and Leonardo this is 'Serial'
// on other boards this may be 'SerialUSB'
#define SerialMonitor sdFile
void setup()
{
Serial.begin(9600);
gpsPort.begin(GPS_BAUD);
pinMode(SDFILE_PIN_CS, OUTPUT);
if (!SD.begin()) {
Serial.println(F("Card failed, or not present"));
while(1);
}
Serial.println(F("card initialized."));
}
void loop()
{
sdFile = SD.open("datalog.txt", FILE_WRITE);
if (sdFile) {
// print position, altitude, speed, time/date, and satellites:
printGPSInfo();
// "Smart delay" looks for GPS data while the Arduino's not doing anything else
smartDelay(1000);
sdFile.close();
// Uncomment to print to the serial port
//Serial.println("ENTER SENSOR DATA HERE");
}
else {
// if the file didn't open, print an error
Serial.println(F("error opening file."));
}
}
void printGPSInfo()
{
// Print latitude, longitude, altitude in feet, course, speed, date, time,
// and the number of visible satellites.
printDate();
SerialMonitor.print("\t");
printTime();
SerialMonitor.print("\t");
SerialMonitor.print(tinyGPS.altitude.meters());
SerialMonitor.print("\t");
SerialMonitor.print(tinyGPS.speed.mps());
SerialMonitor.print("\t");
SerialMonitor.print(tinyGPS.satellites.value());
SerialMonitor.print("\t");
SerialMonitor.print(tinyGPS.location.lat(), 6);
SerialMonitor.print("\t");
SerialMonitor.println(tinyGPS.location.lng(), 6);
}
// This custom version of delay() ensures that the tinyGPS object
// is being "fed". From the TinyGPS++ examples.
static void smartDelay(unsigned long ms)
{
unsigned long start = millis();
do
{
// If data has come in from the GPS module
while (gpsPort.available())
tinyGPS.encode(gpsPort.read()); // Send it to the encode function
// tinyGPS.encode(char) continues to "load" the tinGPS object with new
// data coming in from the GPS module. As full NMEA strings begin to come in
// the tinyGPS library will be able to start parsing them for pertinent info
} while (millis() - start < ms);
}
// printDate() formats the date into dd/mm/yy.
void printDate()
{
SerialMonitor.print(tinyGPS.date.day());
SerialMonitor.print("/");
SerialMonitor.print(tinyGPS.date.month());
SerialMonitor.print("/");
SerialMonitor.print(tinyGPS.date.year());
}
// printTime() formats the time into "hh:mm:ss", and prints leading 0's
// where they're called for.
void printTime()
{
SerialMonitor.print(tinyGPS.time.hour());
SerialMonitor.print(":");
if (tinyGPS.time.minute() < 10) SerialMonitor.print('0');
SerialMonitor.print(tinyGPS.time.minute());
SerialMonitor.print(":");
if (tinyGPS.time.second() < 10) SerialMonitor.print('0');
SerialMonitor.print(tinyGPS.time.second());
}
```
Ich hatte ein ähnliches Problem mit CR2032 in einem meiner allerersten Projekte! CR2032 kann einfach nicht genug Strom liefern, seine Spannung wird unbrauchbar, sobald Sie etwas Wichtiges ziehen, um die MCU mit Strom zu versorgen (ich hatte STM32 blaue Pille und es zog einzelne CR2032 nominal 3,2 V fast sofort auf grenzwertige 2,65 V mit voll frischem CR2032 ).
Die Lösung für mich war, es durch ein winziges 250-mAh-Li-Io zu ersetzen, es ist nur geringfügig größer als CR2032 und sicherlich vergleichbar mit zwei CR2032, während es wiederaufladbar ist und problemlos die erforderliche Leistung liefert. Aber ja, die Spannungspegel sind unterschiedlich, Sie wissen es.
Anforderungen sind natürlich Anforderungen, aber Sie können nicht fliegen, wenn Sie Ruder schwenken, es ist eine unmögliche Aufgabe für CR2032 (wir sprechen von praktischem, realistischem Zeug und nicht von 25 Batterien parallel), wie viele hier darauf hingewiesen haben. Sie müssen diesen Punkt nur beweisen und sich wirklich für winzige 150 mAh - 300 mAh entscheiden (was übrigens völlig vergleichbar mit CR2032 ist). Hat bei mir funktioniert!
Eine CR2032-Batterie oder viele in Reihe könnten den Arduino vielleicht mit Strom versorgen.
Das Speichern von Daten auf der SD-Karte kann Stromstöße von bis zu 300 mA erfordern, je nach Marke/Modell/Speedgrade der SD-Karte.
Ein Hersteller von CR2032-Batterien gibt an, dass der maximale Strom, der aus der Batterie entnommen wird, 10 mA beträgt, sodass möglicherweise bis zu 30 Batterien parallel geschaltet werden können, damit sie funktioniert, wenn dies erforderlich ist.
Kurz gesagt, es gibt keine praktische Möglichkeit, dies mit CR2032-Batterien zu tun.
Chris Stratton
JRE
Hilmar
Andreas Morton
Matti Virkkunen
Aldrin
Aldrin
Chris Stratton
Chris Stratton
Aldrin
Chris Stratton