Hallo Leute,
ich bin neu hier im Forum. Beschäftige mich schon einige Zeit mit Arduino würde mich trotzdessen noch der Anfänger-Fraktion zuordnen.
Ich hatte mir einen günstigen Ultasonic range sensor bestellt (die mit je einem Trigger- und einem Echo Pin).
Ich habe damit dann ein wenig rumexperimentiert und diesen u.a mit einem LCD und einem Buzzer kombiniert.
Nun wollte ich diese beiden Stationen trennen. Auf einem Standalone-Arduino soll nun nur der Sensor-Code und auf dem anderen der LCD und Buzzer laufen. Verbunden wurden diese beiden Teile mit 433MHz RF-Links.
Der Sensor war im normalen Aufbau sehr genau. Mit dem RF-Links weicht dieser bei manchen Messungen teilweise um 4 cm ab.
Nur weiß ich leider nicht warum. Ich habe irgendwie die umwandlung mit long, int etc im Auge, kenne mich da aber nicht ganz so perfekt aus.
Hier mal der Rx und Tx Teil:
/*
Tx-Part
connect the Transmitter data pin to Arduino pin 12
*/
#include <VirtualWire.h>
#define trigPin 10
#define echoPin 11
const int numberOfDigitalPins = 1; // Anzahl einzulesender Pins
long data[numberOfDigitalPins]; // Der Datenpuffer
const int dataBytes = numberOfDigitalPins * sizeof(long); // Anzahl der Bytes im Datenpuffer
void setup(){
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Initialize the IO and ISR
vw_setup(2000); // Bits per sec
}
void loop() {
long time;
long x;
//Messung
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
time = pulseIn(echoPin, HIGH);
//Umrechnung in cm
x = (time/2) / 29.1;
long values = 0;
for(int i=0; i <= numberOfDigitalPins; i++)
{
// Wert in Array
data[i] = x; // Wert im Datenpuffer speichern
}
send((byte*)data, dataBytes);
delay(1000); // Einmal pro Sekunde senden
}
void send (byte *data, int nbrOfBytes)
{
vw_send(data, nbrOfBytes);
vw_wait_tx(); // Warten, bis gesamte Nachricht gesendet wurde
}
und hier der Rx -Part
/*
Rx
Connect the Receiver data pin to Arduino pin 11
*/
#include <VirtualWire.h>
const int numberOfDigitalPins = 1; // Anzahl zu empfangender Integerwerte
long data[numberOfDigitalPins]; // Der Datenpuffer
const int dataBytes = numberOfDigitalPins * sizeof(long); // Anzahl der Bytes im Datenpuffer
byte msgLength = dataBytes;
void setup() {
Serial.begin (9600);
Serial.println("Device is ready");
// Initialize the IO and ISR
vw_set_ptt_inverted(true);
vw_setup(2000); // Bits per sec
vw_rx_start(); // Start the receiver
}
void loop() {
if (vw_get_message((byte*)data, &msgLength)) // Non-blocking
{
Serial.println("Empfangen: ");
if(msgLength == dataBytes)
{
for (int i = 0; i < numberOfDigitalPins; i++)
{
Serial.print("Distanz: ");
Serial.print(data[i]);
Serial.println(" cm");
}
}
else
{
Serial.print("Falsche Nachrichtenlänge: ");
Serial.println(msgLength);
}
Serial.println();
}
}
Ich habe jetzt mal der Einfachheithalber das LCD und den Buzzer rausgelassen.
Ich weiß, dass bei einem Datenwert ein Array nicht nötig wäre und das die Variablenbennung im RF Part etwas verwirrend ist. Ich habe mich jedoch an dieser Stelle an einem anderen Beispiel orientiert und dies so gelassen.
Zum Vergleich:
Das ist das Beispiel mit dem simplen Aufbau (nur Sensor): Dieser funktioniert einwandfrei.
#define trigPin 10
#define echoPin 11
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
long time;
long x;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
time = pulseIn(echoPin, HIGH);
//x=(time*340)/2/100;
x = (time/2) / 29.1;
Serial.print(x);
Serial.println(" cm");
delay(800);
}
Ich hoffe ihr könnt mit weiterhelfen.
Viele Grüße
Julius