Go Down

Topic: I2C- Übertragung zu einfach gedacht? (Read 4391 times) previous topic - next topic

Chris72622

Mar 24, 2017, 01:19 pm Last Edit: Mar 24, 2017, 02:10 pm by Chris72622
Hallo,

ich habe hier einen Uno und einen ATtiny85, an dem ein billig 433MHz-Chinasender hängt.

Der Sender soll ein vom Uno gesendeten unsigned Int via 433MHz ausgeben.

Der ATtiny85 sendet bei jeder eingehenden Übertragungsaufforderung via 433MHz, was an seiner leuchtenden Status-LED (ledPin) zu erkennen ist. Der Sender ist nicht defekt und I2C Pullups sind verbaut.

Leider werden die beiden zu übertragenden Werte 4116 und 4117 nicht via 433MHz übertragen, sondern irgendwelche anderen Werte. Weiss nun leider nicht wo der Fehler begraben liegt.

Gruß Chris

Code: [Select]
// I2C-SENDER (MASTER)

#include <Wire.h>

unsigned int zu = 4116;
unsigned int auf = 4117;

void setup()
{
  Serial.begin(9600);
  Wire.begin(); // join i2c bus (address optional for master)
  delay(2000);
}

void loop()
{
  Serial.println("zu");
  Wire.beginTransmission(0x26);  // Startet die I2C-Übertragung an 0x26 (ATtiny85)
  Wire.write(zu);                // Schaltet alle Funksteckdosen aus
  Wire.endTransmission();        // Stoppt die I2C-Übertragung
  delay(2000);
  Serial.println("auf");
  Wire.beginTransmission(0x26);  // Startet die I2C-Übertragung an 0x26 (ATtiny85)
  Wire.write(auf);               // Schaltet alle Funksteckdosen aus
  Wire.endTransmission();        // Stoppt die I2C-Übertragung
  delay(2000);
}


Code: [Select]
/*  I2C-EMPFÄNGER (SLAVE)
 *   
 *   Am ATtiny hängt der 433MHz Sender. Der passende 433MHz-Empfänger ist eine Funksteckdose.
 *   
 *   Anschluss des Attiny85 an den Uno:

                    1 |  \/  | 8  5V
                    2 |      | 7  SCL, Arduino A5, 4,7kOhm Pullup
   433MHz TX-Modul  3 |      | 6
               GND  4 |      | 5  SDA, Arduino A4, 4,7kOhm Pullup
 *   
 */

#include "TinyWireS.h"                  // wrapper class for I2C slave routines
#include <RCSwitch.h>

#define I2C_SLAVE_ADDR  0x26            // i2c slave address (38)

// 433MHz Modul

RCSwitch myTx = RCSwitch();

const byte txPin = 4;                   // Ausgang Sender-Daten an ATtiny Pin 3  (kein Tippfehler!)
const byte ledPin = 3;                  // Pin 2 (kein Tippfehler!)

void setup()
{
  TinyWireS.begin(I2C_SLAVE_ADDR);      // init I2C Slave mode
  pinMode (txPin, OUTPUT);              // 433MHz Modul
  pinMode (ledPin, OUTPUT);             // LED
  myTx.enableTransmit(txPin);           // Übertragung ermöglichen
  myTx.setPulseLength(375);             // Pulsweite
  myTx.setRepeatTransmit(10);           // Anzahl der Sendewiederholungen innerhalb der Library
}

void loop()
{
  if (TinyWireS.available())
  {
    digitalWrite(ledPin, HIGH);                                                       // LED einschalten
    myTx.send(TinyWireS.receive(), 24);
    digitalWrite(ledPin, LOW);                                                        // LED ausschalten
  }
}
Bilnk wtiohut daley.

combie

#1
Mar 24, 2017, 01:27 pm Last Edit: Mar 24, 2017, 01:29 pm by combie
Quote
Leider werden die beiden zu übertragenden Werte 4116 und 4117 nicht übertragen, sondern irgendetwas Anderes.
Quote
Wire.write(value)
...
value: a value to send as a single byte
Aus: Doku

Fangfrage:
Ist "unsigned int zu = 4116;" ein " single byte" ?
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Chris72622

Nein.

Heisst das im Klartext, dass ich die einzelnen Ziffern des zu sendenden unsigned longs (4, 1, 1 und die 6) zunächst einmal einzeln via TinyWireS.receive() "entgegennehmen" und z.B. in ein Array schreiben muss, bevor ich dieses Array dann wiederum z.B. mit einer for-Schleife auslesen und den Wert dann so via 433MHz senden kann?

Gruß Chris
Bilnk wtiohut daley.

ElCaron

#3
Mar 24, 2017, 01:48 pm Last Edit: Mar 24, 2017, 01:50 pm by ElCaron
Nein, Du solltest Deine Zahl ganz sicher nicht in Ziffern zerlegen. Das macht für ein binäres System überhaupt keinen Sinn. Eine Möglichkeit wäre, deinen int in ein high und ein low byte zu aufzuteilen und am Ende die beiden zusammenzufügen. Siehe dazu bitshift-Operatoren.
Ob es eine einfachere Möglichkeit gibt, habe ich mangels Blick auf die Lib nicht kontrolliert.

Davon abgesehen würde ich den Code erstmal irgendwohin senden, wo ich das Ergebnis lesen kann. Muss ja kein Tiny sein, sondern kann auch ein anderer Arduino sein.

Chris72622

Meinst Du so?

Code: [Select]
Wire.write(zu & 0xff);         // Schaltet die Funksteckdose aus
  Wire.write(zu >> 8);


Gruß Chris
Bilnk wtiohut daley.

combie

Deinem Posting entnehme ich, dass du dem Link nicht gefolgt bist, bzw. das dort geschriebene nicht verstanden hast.

Ich versuche es dir mal zu übersetzen:

Wire::write() gibt es mit 3 verschiedenen Signaturen.

Eine Variante habe ich dir schon in der Luft zerrissen.
Eine zweite (string)  scheint mir für eine integer Zahl nicht angemessen.

Eine dritte, und letzte, bleibt übrig.
Was gibt es gegen diese einzuwenden?
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Chris72622

#6
Mar 24, 2017, 01:59 pm Last Edit: Mar 24, 2017, 02:01 pm by Chris72622
Hi combie, ich habs mir jetzt nochmals genau angeschaut und habe das Problem, dass ich im Bezug auf den dort zu lesenden Text mit dem Begriff "data" nichts anfangen kann.

Gruß Chris

Edit: Wire.write(zu, 4); führt leider zu einer Fehlermeldung.
Bilnk wtiohut daley.

HotSystems

Durch deine Sketch ist ganz schwer durchzusteigen.

Was ist Sender und Empfänger ?

Im Sender sehe ich keinen Funk-Sender, warum heißt es Sender ?

Im Empfänger sehe ich einen Funk-Sender, warum heißt es Empfänger ?

Da solltest du mal aufräumen, damit alle die dir helfen wollen auch sofort klarkommen.

Wenn du von I2C sprichst, nenne es bitte Master und Slave.
Wenn du von Funk sprichst, dann ist es Sender und Empfänger.

Bitte ändere es in deinem Sketch, damit keine Irrtümer entstehen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Chris72622

Hab entsprechende Anpassungen im Eröffnungsposting vorgenommen.

Sorry, für die Konfusion.

Gruß Chris
Bilnk wtiohut daley.

combie

#9
Mar 24, 2017, 02:12 pm Last Edit: Mar 24, 2017, 02:20 pm by combie
Quote
, dass ich im Bezug auf den dort zu lesenden Text mit dem Begriff "data" nichts anfangen kann.
Hmmm....
Dann wäre es kein Fehler, sich mal mit den Grundlagen der Sprache zu beschäftigen, welche du da verwendest.

Denn:
Es ist kontraproduktiv, Dinge auszublenden, nur weil man sie nicht begreift.

Quote
Wire.write(zu, 4); führt leider zu einer Fehlermeldung.
Ein einfaches Ausprobieren, ist keine tragfähige Strategie.


Code: [Select]
Wire.write((byte *)&zu,sizeof(zu));                // Schaltet alle Funksteckdosen aus
Und nein, den Ausdruck erkläre ich dir jetzt nicht.
Das kannst du in jedem beliebigen (halbwegs guten) C/C++ Buch/Tutorial nachlesen.
Und ja!
Das wirst du noch an 1000 Ecken gebrauchen.


--------
wobei, dieses ist auch funktional, nicht schön, aber funktional:
Code: [Select]

Wire.write(zu & 0xff);       
Wire.write(zu >> 8);



Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Chris72622

..den Ausdruck erkläre ich dir jetzt nicht.
Schade, da es sehr schwierig für mich ist herauszufinden wonach ich suchen soll.

Da ich hier ein Buch bzgl. C++ Programmierung liegen habe, könnte ich mir vorstellen, dass mir die Nennung eines Begriff nach dem ich suchen könnte evtl. helfen könnte.

Gruß Chris
Bilnk wtiohut daley.

Tommy56

Also bei > 1250 Postings sollten doch nun langsam mal ein paar Grundlagen hängen geblieben sein. Das Buch ist zum Lesen und Verstehen, nicht nur zum Hinlegen ;)

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Chris72622

Bilnk wtiohut daley.

combie

#13
Mar 24, 2017, 04:50 pm Last Edit: Mar 24, 2017, 04:57 pm by combie
Schade, da es sehr schwierig für mich ist herauszufinden wonach ich suchen soll.

Da ich hier ein Buch bzgl. C++ Programmierung liegen habe, könnte ich mir vorstellen, dass mir die Nennung eines Begriff nach dem ich suchen könnte evtl. helfen könnte.

Du sollst nicht in dem Buch suchen, sondern das Buch lesen!
Ganz!

----------------------

Stichworte?

Gerne:
Adress Operator
Pointer
Cast
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Chris72622

Bilnk wtiohut daley.

Go Up