Hallo Da ein arduino nano leider nicht genug pins und speicher für mein vorhaben hat sehe ich mich genötigt mein Projekt auf 2 zu verteilen mit i2c. aber erstmal klein anfangen. master #include <Wire.h> byte Speichersenden = 0; void setup(void) { Serial.begin(9600); Wire.begin(); } void loop(void) { int sensorValue = analogRead(A0); float voltage = sensorValue * (4.7 / 1023.0); Speichersenden = voltage; Wire.beginTransmission(4); Wire.write("123,45678910 "); Wire.write(" "); Wire.write("test "); Wire.write(" "); Wire.write(Speichersenden); Wire.write(" "); Wire.write("test ende "); Wire.endTransmission(4); delay(1000); } ----------------------------------------------------------------------- reciver #include <Wire.h> void setup() { Wire.begin(4); // join i2c bus with address #8 Wire.onReceive(receiveEvent); // register event Serial.begin(9600); // start serial for output } void loop() { delay(2000); } void receiveEvent(int anzahl) { while (1 < Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character Serial.print(c); // print the character } int x = Wire.read(); // receive byte as an integer Serial.println(" "); // print the integer } Alles was ich aber zusehen bekommen am ende ist: 123,45678910 test []test ende 123,45678910 test []test ende .......... Das i2c mit der arduino IDE nur int übertragen kann weis ich schon aber die ersten zahlen werden ja auch MIT Komma übertragen ? wenn ich zum senden aber Wire.write((byte)(Speichersenden)); nutze wird immerhin die erste zahl vor dem Komma übertragen dann aber die Übertragung abgebrochen. Wäre über Hilfe Sehr Dankbar.
:
Verschoben durch User
Sind das nicht String und keine Zahlen? Ein String, zufällig nur Ziffern und ein Komma enthält?
Ein String habe ich schon mehrfach versucht zusenden kann aber nicht übersetzt und hochgeladen werden falls du das meinst?
DAVID -. schrieb: > die ersten zahlen werden ja auch MIT Komma übertragen
1 | Wire.write("123,45678910 "); |
Das ist keine Zahl, das ist ein String. DAVID -. schrieb: > wenn ich zum senden aber > Wire.write((byte)(Speichersenden)); > nutze wird immerhin die erste zahl vor dem Komma übertragen dann aber > die Übertragung abgebrochen. Ach was. Du machst aus einem float (4 byte) einen ein byte (1 byte) wert. Natuerlich geht da was verloren. Dir fehlen die absoluten Grundlagen von C/C++. DAVID -. schrieb: > Wäre über Hilfe Sehr Dankbar. Buecher zu C/C++ lesen und die Beispiele durcharbeiten. Das ist die beste Hilfe. Hilfe zur selbsthilfe. DAVID -. schrieb: > Ein String habe ich schon mehrfach versucht zusenden kann aber nicht > übersetzt und hochgeladen werden falls du das meinst? Kann ja nicht sein. Dein Code oben compiliert doch oder etwa nicht? Wenn nicht, wo hast du dann die Ausgaben her? https://www.arduino.cc/en/Reference/WireWrite
1 | write() |
2 | Description |
3 | |
4 | Writes data from a slave device in response to a request from a master, |
5 | or queues bytes for transmission from a master to slave device |
6 | (in-between calls to beginTransmission() and endTransmission()). |
7 | |
8 | |
9 | Syntax |
10 | |
11 | Wire.write(value) |
12 | Wire.write(string) |
13 | Wire.write(data, length) |
14 | |
15 | |
16 | Parameters |
17 | |
18 | value: a value to send as a single byte |
19 | string: a string to send as a series of bytes |
20 | data: an array of data to send as bytes |
21 | length: the number of bytes to transmit |
Kaj schrieb: > Das ist keine Zahl, das ist ein String. Ah ok das erklärt es wenigstens. und das mit 1 und 4 Byte leuchtet mir jetzt auch ein. Wenn ich es aber mit String Speichersenden = 0; Wire.write(String)(Speichersenden); Versuche dann kommt beim übersetzten als ergebniss raus: conversion from 'int' to 'String' is ambiguous Umwandlung von 'int' in 'String' ist mehrdeutig Nur verwende ich doch kein int mehr das wird ja nur zum einlesen der Daten genutzt? Wenn ich mir aber die Seite übersetzten lassen und: Wire.write (Daten, Länge) sowie Data: ein Array von Daten, die als Byte gesendet werden sollen Length: die Anzahl der zu sendenden Bytes. würde ich sagen hat damit was zutun ABER woher soll die IDE wissen wann genau die Übertragung zu ende ist (wenn keine Daten mehr da sind ist ende?)
Die IDE? Die hat damit nichts zu tun. Und das Übertragungsende ist eindeutig - wenn die Anzahl der Bytes gesendet wurde, die Du beim Aufruf im zweiten Parameter angegeben hast. Mit Wire.write(data, 5); beispielsweise sind das fünf (5) Bytes.
DAVID -. schrieb: > Da ein arduino nano leider nicht genug pins und speicher für mein > vorhaben hat sehe ich mich genötigt mein Projekt auf 2 zu verteilen mit > i2c. Damit kommt man als Anfänger vom Regen in die Traufe. Fragt mal erfahrene Programmierer, ne 2. CPU fassen die nur mit ner Kneifzange an. Da muß es schon ernsthaftere Gründe für geben. Für Pinerweiterung gibt es bewährte Lösungen SPI (74HC165/74HC595) oder I2C (PCF8574/A). Und fürs RAM sparen kann man überlegen, ob es immer gleich 2 Bytes sein müssen (int) und ein Byte (uint8_t) nicht schon reicht. Auch sollte man sparsam mit globalen Variablen sein, lokale Variablen kann der Compiler viel besser optimieren. Und die maximale Größe von Arrays kann man berechnen und muß da keine Fantasiegrößen reservieren. Um Flash zu sparen nimmt man Unterfunktionen und Schleifen. Flash-Fresser sind nur die unwartbaren Copy&Paste-Monster.
DAVID -. schrieb: > Wenn ich es aber mit > String Speichersenden = 0; > Wire.write(String)(Speichersenden); > > Versuche dann kommt beim übersetzten als ergebniss raus: > conversion from 'int' to 'String' is ambiguous > Umwandlung von 'int' in 'String' ist mehrdeutig Ein String wird immer mit "" eingerahmt. Deiner Definition > String Speichersenden = 0; entspricht die Aussage "Die Farbe des Autos ist 100PS" Versuch es mal mit > String Speichersenden = "0"; Dann klappt es auch mit dem Nachbarn :-)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.