433MHz read UINT nicht deklariert

Hallo,

möchte mich ein bischen mit 433Mhz befassen, funkmodule habe ich bereits da. Habe im Internet eine Seite mit ner guten Beschreibung und beispielcode gefunden, hier der Link:

http://www.google.de/imgres?imgurl=http://www.glacialwanderer.com/_blog/blog2009/08_August/hr_rf_3432.jpg&imgrefurl=http://www.glacialwanderer.com/hobbyrobotics/?p%3D291&h=1024&w=1024&sz=429&tbnid=Nc4Q8H-IVjwNiM:&tbnh=90&tbnw=90&zoom=1&usg=__iTmtBWHdPrfLZT4LCrsFPLF7nqo=&docid=ELSjx9hQ9vOc0M&sa=X&ei=ABLhUeicJsasPOW8gPgC&ved=0CDYQ9QEwAQ&dur=411

// Maurice Ribble 
// 8-30-2009
// http://www.glacialwanderer.com/hobbyrobotics
// Used Arduino 0017
// This is a simple test app for some cheap RF transmitter and receiver hardware.
// RF Transmitter: http://www.sparkfun.com/commerce/product_info.php?products_id=8945
// RF Receiver: http://www.sparkfun.com/commerce/product_info.php?products_id=8948

// This says whether you are building the transmistor or reciever.
// Only one of these should be defined.
//#define TRANSMITTER
#define RECEIVER

// Arduino digital pins
#define BUTTON_PIN  2
#define LED_PIN     13

// Button hardware is setup so the button goes LOW when pressed
#define BUTTON_PRESSED LOW
#define BUTTON_NOT_PRESSED HIGH

void setup()
{
  pinMode(BUTTON_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);

  Serial.begin(1200);  // Hardware supports up to 2400, but 1200 gives longer range
}

#ifdef TRANSMITTER
void loop()
{
  static int prev_button = BUTTON_NOT_PRESSED;  // Previous button press value
  int        cur_button;                        // Current button press value

  cur_button = digitalRead(BUTTON_PIN);

  if ((prev_button == BUTTON_NOT_PRESSED) && (cur_button == BUTTON_PRESSED))
  {
    writeUInt(271); // Put any number you want to send here (71 is just a test)
  }

  delay(50); // Debounce button
  prev_button = cur_button;
}
#endif //TRANSMITTER

#ifdef RECEIVER
void loop()
{
  boolean light_led = false;

  if (readUInt(true) == 271) // Check to see if we got the 71 test number
  {
    light_led = true;
  }
  
  if (light_led)
  {
    digitalWrite(LED_PIN, HIGH);
    delay(1000);
    digitalWrite(LED_PIN, LOW);
  }
}
#endif //RECEIVER

Wenn ich den Code auf mein Arduino Mega übertragen möchte kommt folgende Meldung: sketch_jul13a:54: error: 'readUInt' was not declared in this scope

Warum? mit writeUInt gibts schließlich auch keine Probleme. Könnt ihr mir bitte weiterhelfen.

Gruß

Bastian

basti2s: Wenn ich den Code auf mein Arduino Mega übertragen möchte kommt folgende Meldung: sketch_jul13a:54: error: 'readUInt' was not declared in this scope ... Warum?

Weil die Funktion readUInt in Deinem Code überhaupt nicht deklariert ist.

Das war ja einfach (und es steht sogar in der Fehlermeldung).

Wenn Du eine bestimmte Funktion in Deinem Code aufrufen möchtest, dann müßte diese Funktion - in Deinem Code deklariert werden oder - zu den Standard Arduino-Funktionen gehören oder - zur AVR libc gehören oder - oder per #include mit einer externen Library eingebunden werden

basti2s: mit writeUInt gibts schließlich auch keine Probleme.

Dein Code verwendet "bedingte Compilierung" und per Auskommentierung ist "//#define TRANSMITTER" auskommentiert, also nicht deklariert, und daher wird auch der Code überhaupt nicht kompiliert, der nur unter der Bedingung compiliert werden soll, dass TRANSMITTER im Code definiert ist. Informiere Dich über "bedingte Compilierung" bei C/C++!

Danke für deine schnelle Antwort. Kannst du mir vielleicht einen tipp geben, welche Libary ich zu dem Code hinzufügen muss, dass er mit readUInt und writeUInt was anfangen kann? Habe schon im Netz gesucht, aber leider nichts passendes gefunden.

Der Sketch ist für die Arduino-IDE in Version 0017 geschrieben, seitdem hat sich einiges getan. Vom Hardwareaufbau ist das Dargestellte auch nicht optimal, da die verwendeten Arduino Duemilanove die RX- und TX-Pins für ihre eigene serielle Kommunikation benötigen. Im Arduino-Kochbuch werden diese Module auch vorgestellt, hier wird die Bibliothek VirtualWire empfohlen. Damit habe ich allerdings noch nicht gearbeitet, dient also nur der Suche in die richtige Richtung. ;)

basti2s: Kannst du mir vielleicht einen tipp geben, welche Libary ich zu dem Code hinzufügen muss, dass er mit readUInt und writeUInt was anfangen kann?

Das ist doch völlig witzlos. Ich kann Dir den Tipp geben: Lass es bleiben!

Die ganz billigen ASK/OOK 433 MHz Module über Serial read/write anzusteuern bringt Dir nichts anderes ein als Frust, Datenströme voller Datenmüll und extrem niedrige Reichweiten (na ja, so vielleicht 5m Reichweite, wenn man sonst Null hat ist 5m schon viel).

Wenn Du irgendwas vernünftiges mit diesen Modulen anfangen möchtest, dann schließe die bloß nicht an die seriellen Sende-/Empfangs Pins an und versuche nicht, diese über die Serial-Library anzusteuern!

Was Du für diese ASK/OOK Module für eine vernünftige Ansteuerung benötigst, gesicherte Datenübertragung ohne Datenmüll bei maximaler Reichweite, ist die "VirtualWire" Library! Ich hoffe mal, Du hast überhaupt solche Funkmodule, da gibt es nämlich haufenweise verschiedene, die teils ganz unterschiedlich angesteuert werden müssen.

Installiere dir also - falls Du 433 ASK/OOK Funkmodule hast - die VirtualWire-Library und probiere die dort enthaltenen Beispiele aus! Wenn Du damit Probleme hast, melde Dich nochmal. http://www.airspayce.com/mikem/arduino/VirtualWire/

Danke für deine Hilfe, habs jetzt mit der VirtualWire Libary probiert, und es funktioniert. Allerdings kann ich die Übertragung mit meiner Funkfernbedienung für die Steckdosenleiste stören. Ist wahrscheinlich ne dumme Frage, aber gibt es eine Möglichkeit, dass die Übertragung nicht durch andere Sender gestört werden kann?

basti2s: Ist wahrscheinlich ne dumme Frage, aber gibt es eine Möglichkeit, dass die Übertragung nicht durch andere Sender gestört werden kann?

Dumme Fragen sehen ganz anders aus. ;) Der Empfänger weiß ja nicht, was richtige und was falsche Daten sind. Man könnte beispielsweise den Datensatz senden und eine Prüfsumme hinterher. Passt das auf Empfängerseite nicht zusammen, liegt also ein Fehler vor, der Datensatz ist somit ungültig. Jetzt könnte man den Datensatz auch mehrmals senden, eventuell auch jetzt mit jeweils der Prüfsumme. Dann ist die Chance größer, dass zwei der Datensätze identisch und somit richtig sind. Oder man baut die Funkverbindung bidirektional auf, dass der eigentliche Empfänger dem Sender ein "OK" schickt, wenn Datensatz und Prüfsumme passen. Du siehst, es gibt so einige Herangehensweisen...

basti2s: Danke für deine Hilfe, habs jetzt mit der VirtualWire Libary probiert, und es funktioniert. Allerdings kann ich die Übertragung mit meiner Funkfernbedienung für die Steckdosenleiste stören. Ist wahrscheinlich ne dumme Frage, aber gibt es eine Möglichkeit, dass die Übertragung nicht durch andere Sender gestört werden kann?

Auf so einer kostenlos und lizenzfrei für Short Range Devices nutzbaren Frequenz hast Du keinerlei Ansprüche darauf, ungestört zu sein. Die Frequenz ist nämlich nicht nur für Dich kostenlos und lizenzfrei für die Nutzung freigegeben, sondern auch für die anderen 739 Millionen Einwohner der EU. Daß nun nicht Millionen von Störsendern Deinen Empfang auf der Frequenz stören, liegt daran, dass die Reichweite so gering ist.

Jeder Sender auf derselben Frequenz innerhalb der Reichweite kann den Empfang stören. Das ist unvermeidbar. Die kannst die Empfangssicherheit für Schaltbefehle oder gesendete Messwerte nur beispielsweise dadurch erhöhen, dass Du denselben Wert mehrfach sendest, also über VirtualWire einmal senden, dann eine kleine (und womöglich zufällig lange Pause machen), dann den Wert nochmal senden und das mehrmals nacheinander. In der Hoffnung darauf, dass von mehreren Aussendungen des Senders wenigstens eine beim Empfänger ankommt. Deine Funksteckdosen-Fernbedienung macht das auch nicht anders und sendet einen Schaltbefehl mehrfach hintereinander. Entweder hat der Empfänger ihn dann empfangen. Oder auch nicht.

alles klar, ich glaub ich muss euch mehr Hintergrundinformationen geben.

Ich möchte mir Funksteckdosen bauen, die später in der Veranstaltungstechnik genutzt werden sollen, und über DMX angesteuert werden. Deshalb sollte schon sichergestellt sein, dass die Funkübertragung reibungslos funktioniert. Währe schlecht, wenn bei einer Vorführung die Steckdosen nicht mehr schalten, weil der Nachbar sein Garagentor zu macht o.ä. Sollte ich evtl. auf einer anderen Frequenz senden?

Des weiteren würde es mich interresieren, wie ihr das ganze programmtechnisch lösen würdet, wenn ich mehrere Steckdosen gleichzeitig ein/aus schalten möchte.