Arduino+ Physik Programmierung: hat jemand zwei Programme einmal um Daten wie Umdrehungszahl und Winkelgeschwindigkeit zu sammeln?
4 Antworten
Schau auf YouTube oder github
dies haben für mir funktioniert:
für die datenmesser esp:
#include <Wire.h>
#include <SoftwareSerial.h>
// HC12 Pin-Konfiguration
#define HC12_TX 17
#define HC12_RX 16
SoftwareSerial hc12(HC12_TX, HC12_RX);
// ADXL345 I2C-Adresse
#define ADXL345_ADDR 0x53
void setup() {
Serial.begin(115200); // Serieller Monitor
hc12.begin(9600); // HC12 Baudrate
Wire.begin(); // I2C starten
// ADXL345 initialisieren
Wire.beginTransmission(ADXL345_ADDR);
Wire.write(0x2D); // Power-Control-Register
Wire.write(0x08); // Messmodus aktivieren
Wire.endTransmission();
}
void loop() {
// Winkelgeschwindigkeit vom ADXL345 lesen
int16_t x, y, z;
readADXL345(x, y, z);
// Daten an HC12 senden
String data = String(x) + "," + String(y) + "," + String(z);
hc12.println(data);
Serial.println("Gesendet: " + data);
delay(100); // Sendeintervall
}
void readADXL345(int16_t &x, int16_t &y, int16_t &z) {
Wire.beginTransmission(ADXL345_ADDR);
Wire.write(0x32); // Startadresse der Daten
Wire.endTransmission(false);
Wire.requestFrom(ADXL345_ADDR, 6, true);
if (Wire.available() == 6) {
x = Wire.read() | (Wire.read() << 8);
y = Wire.read() | (Wire.read() << 8);
z = Wire.read() | (Wire.read() << 8);
}
}
für den datenspeicher esp:
#include <SdFat.h>
// HC12 Pin-Konfiguration
#define HC12_TX 17
#define HC12_RX 16
// Puffergröße für eingehende Daten
#define BUFFER_SIZE 100
// SD-Karte Objekt
SdFat SD;
// SD-Karten Konfiguration
#define SD_CONFIG SdSpiConfig(SS, SHARED_SPI, SD_SCK_MHZ(25))
// Datenpuffer
char dataBuffer[BUFFER_SIZE];
void setup() {
Serial.begin(115200); // Serieller Monitor
Serial2.begin(9600, SERIAL_8N1, HC12_RX, HC12_TX); // HardwareSerial für HC12
Serial.println("Initialisiere SD-Karte...");
// SD-Karte initialisieren
if (!SD.begin(SD_CONFIG)) {
Serial.println("SD-Karte konnte nicht initialisiert werden. Überprüfe die Karte und die Verbindungen.");
while (1); // Endlosschleife bei Fehler
}
Serial.println("SD-Karte erfolgreich initialisiert.");
}
void loop() {
// Daten von HC12 empfangen
if (Serial2.available()) {
size_t index = 0;
unsigned long startMillis = millis(); // Timeout für langsame Daten
while (Serial2.available() && index < BUFFER_SIZE - 1) { // Platz für Null-Terminierung lassen
char c = Serial2.read();
// Nur druckbare Zeichen und Zeilenendezeichen akzeptieren
if (isPrintable(c) || c == '\n') {
dataBuffer[index++] = c;
}
// Prüfe auf Nachrichtenende
if (c == '\n') {
break;
}
// Timeout prüfen
if (millis() - startMillis > 1000) { // 1 Sekunde Timeout
Serial.println("Timeout beim Empfang von Daten!");
break;
}
}
dataBuffer[index] = '\0'; // Null-Terminierung des Strings
// Ausgabe auf dem Seriellen Monitor
if (index > 0) {
Serial.print("Empfangen: ");
Serial.println(dataBuffer);
// Daten in CSV-Datei schreiben
if (writeToFile("/data.csv", dataBuffer)) {
Serial.print("Daten gespeichert: ");
Serial.println(dataBuffer);
} else {
Serial.println("Fehler beim Speichern der Daten auf der SD-Karte.");
}
} else {
Serial.println("Keine gültigen Daten empfangen.");
}
}
}
// Funktion zum Schreiben in die Datei
bool writeToFile(const char* path, const char* data) {
File dataFile = SD.open(path, FILE_WRITE);
if (dataFile) {
dataFile.println(data);
dataFile.close();
return true;
} else {
Serial.println("Fehler beim Öffnen der Datei. Stelle sicher, dass die SD-Karte genügend Speicherplatz hat und beschreibbar ist.");
return false;
}
}
Im Netz findest Du diverse Code-Schnipsel für Drehzahlmesser mit einem Arduino.
Nein😔