Forum: Mikrocontroller und Digitale Elektronik Arduino Wire


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Der Hornochse (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo,

folgendes Problem würde gerne über Wire eine Zahl sendet und der 
Empfänger soll dann ein Licht anmachen funktioniert auch gut.

So und jetzt würde ich auch gerne die zahl 10 und 11 u.s.w benutzen 
leider reagiert der Slave nur bis zur Zahl 9.

Hat da jemand eine Ahnung wieso?

Master
1
#include <Wire.h> 
2
3
String incoming;
4
5
void setup(){
6
  Serial.begin(9600);
7
  Wire.begin(); 
8
}
9
10
void loop(){
11
  while( Serial.available() ) {
12
    int incoming = Serial.read();
13
   
14
    if(incoming == '1') {
15
      Wire.beginTransmission(1); 
16
      Wire.write('1');
17
      Wire.endTransmission();
18
    }
19
    
20
    if(incoming == '2') {
21
      Wire.beginTransmission(2); 
22
      Wire.write('2');
23
      Wire.endTransmission();
24
    }
25
  }
26
}


Slave
1
#include <Wire.h>
2
3
4
5
int laser = 8;
6
int ledBlau = 2;
7
8
int ledRot = 4;
9
10
bool laserstatus = false;
11
bool led_Blau = false;
12
bool led_Rot =false;
13
14
void setup(){
15
  Serial.begin(9600);
16
  
17
  Wire.begin(1); //I2C-Adresszuweisung: Slave 1
18
19
  
20
  Wire.onReceive(receiveEvent);
21
 
22
  pinMode(ledBlau,OUTPUT); 
23
  pinMode(ledRot,OUTPUT);
24
  digitalWrite(ledBlau,LOW); 
25
  digitalWrite(ledRot,LOW); 
26
  pinMode(laser, INPUT);    
27
  //digitalWrite(laser, HIGH); 
28
}
29
30
31
void loop(){
32
33
  if(digitalRead(laser) == HIGH)
34
  {
35
    laserstatus=false;
36
  } 
37
  
38
  else 
39
  {
40
    laserstatus=true;
41
  }
42
43
  if(laserstatus == true && led_Blau==true)
44
  {
45
    digitalWrite(ledBlau,LOW);
46
    delay(1000);
47
    led_Blau=false;
48
    delay(1000);
49
    led_Rot=false;
50
    delay(1000);
51
    laserstatus=false;
52
  }
53
  else 
54
  {
55
    Serial.print("LASER: ");
56
    Serial.println(laserstatus);
57
    Serial.print("LEDBLAU: ");
58
    Serial.println(led_Blau);
59
    Serial.print("LEDROT: ");
60
    Serial.println(led_Rot);
61
62
    
63
  }
64
65
      if(laserstatus == true && led_Blau==false && led_Rot==false)
66
  {
67
          digitalWrite(ledRot,HIGH);
68
    delay(500);
69
          digitalWrite(ledRot,LOW);
70
    delay(500);
71
          digitalWrite(ledRot,HIGH);
72
    delay(500);
73
          digitalWrite(ledRot,LOW);
74
    delay(500);
75
          digitalWrite(ledRot,HIGH);
76
    delay(500);
77
          digitalWrite(ledRot,LOW);
78
    delay(500);
79
          digitalWrite(ledRot,HIGH);
80
    delay(500);
81
          digitalWrite(ledRot,LOW);
82
    delay(500);
83
          digitalWrite(ledRot,HIGH);
84
    delay(500);
85
          digitalWrite(ledRot,LOW);
86
    delay(500);
87
          digitalWrite(ledRot,HIGH);
88
    delay(500);
89
          digitalWrite(ledRot,LOW);
90
    delay(500);
91
          digitalWrite(ledRot,HIGH);
92
    delay(500);
93
          digitalWrite(ledRot,LOW);
94
          led_Rot=false;
95
  }
96
}
97
98
void receiveEvent(int howMany){
99
100
 while(Wire.available())
101
  {
102
    
103
    int incoming = Wire.read();
104
   
105
    if(incoming == '1')
106
    {
107
      digitalWrite(ledBlau,HIGH);
108
      led_Blau=true;
109
    }
110
  }
111
}

von Adam P. (adamap)


Bewertung
0 lesenswert
nicht lesenswert
Du sendest die Zahlen als ASCII,
also deine '1' ist binär im ASCII Code 0x31.

Eigentlich wird 0x31 als Byte gesendet.

Entweder du sendest es binär, also 0x01 für 1 und 0x0A für 10...
oder du sendest für 10 halt zwei Byte. Erst die 1 dann die 0.

von Marc V. (Firma: Vescomp) (logarithmus)


Bewertung
0 lesenswert
nicht lesenswert
Der Hornochse schrieb:
> leider reagiert der Slave nur bis zur Zahl 9.

 Weil 10 zweistellig ist.

von Joachim B. (jar)


Bewertung
-2 lesenswert
nicht lesenswert
Marc V. schrieb:
> Weil 10 zweistellig ist.

und sogar eine '1' und eine '0' enthält, wie würde Robert sagen? 
"welches Schweinerl hätten sie gern?"

Also erst mal den ganzen Text String (array of char) lesen und dann in 
eine Zahl wandeln -> atoi()

: Bearbeitet durch User
von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
Joachim B. schrieb:
> Also erst mal den ganzen Text String (array of char) lesen und dann in
> eine Zahl wandeln -> atoi()

Nein!
Warum den Weg über String?

von Joachim B. (jar)


Bewertung
-2 lesenswert
nicht lesenswert
Arduino Fanboy D. schrieb:
> Nein!

doch
https://www.youtube.com/watch?v=w4aLThuU008

Arduino Fanboy D. schrieb:
> Warum den Weg über String?

weil der TO Zeichen versendet, oder wie verstehst du?
Der Hornochse schrieb:
> if(incoming == '1')

'1' erwartet ist ein Char(ascii49) und nicht eine 1

mir scheint du willst wieder mit mir stänkern aber da habe ich keinen 
Bock drauf!

von Arduino Fanboy D. (ufuf)


Bewertung
-1 lesenswert
nicht lesenswert
Offensichtlich magst du lieber angepisst sein, als mich verstehen zu 
wollen.

OK, dann formuliere ich es um.


Es ist völlig unsinnig per I2C Zeichen, oder Ketten der selben, zu 
versenden.
Also macht auch die Auswertung dieser Zeichen(ketten) keinen Sinn.

: Bearbeitet durch User
von Joachim B. (jar)


Bewertung
-1 lesenswert
nicht lesenswert
Arduino Fanboy D. schrieb:
> Offensichtlich magst du lieber angepisst sein, als mich verstehen zu
> wollen.

moment mal, du fragest mich doch:

Arduino Fanboy D. schrieb:
> Joachim B. schrieb:
>> Also erst mal den ganzen Text String (array of char) lesen und dann in
>> eine Zahl wandeln -> atoi()
>
> Nein!
> Warum den Weg über String?

das war vom TO!
der bekommt doch offensichtlich '1' also gibt es auch einen '1' Sender

wie soll ich darauf antworten?
Richte deine Frage doch an den TO und nicht an mich!

und wenn mehrstellige Zahlen eintrudeln muss man alle lesen und ein Ende 
definieren

: Bearbeitet durch User
von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Joachim B. schrieb:
> Also erst mal den ganzen Text String (array of char) lesen und dann in
> eine Zahl wandeln -> atoi()

Das kann man tun, wenn die 256 möglichen Werte, die ein einzelnes Byte 
annehmen kann, nicht reichen. Vorher gibt es dazu in dem hier 
geschilderten Fall keinen Grund. Wenn man das auch nur näherungsweise 
ausschöpfen will, ist es allerdings dringend geraten, über die 
Programmstruktur nochmal genauer nachzudenken.

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht lesenswert
> das war vom TO!
Offensichtlich ist der Sender auch von ihm.
Eine gesendete '10' kann es nicht geben, und damit kann eine solche auch 
nicht ankommen.

Und das wurde ihm auch schon von Marc V. gesagt.
Warum sollte ich mich dann auch noch darum kümmern?


> wie soll ich darauf antworten?
Wer den String eingeführt hat, warst schließlich du.
Also frage ich auch dich, was du mit dem String anstellen willst.


> Richte deine Frage doch an den TO und nicht an mich!
Warum sollte ich den TO nach Dingen fragen, welche du von dir gibst?
Das halte ich für irrational.

: Bearbeitet durch User
Beitrag #6415262 wurde von einem Moderator gelöscht.
von Arduino Fanboy D. (ufuf)


Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
LIDL Konzern schrieb im Beitrag #6415262:
> Hausverbot

Ja, das ist wahr...
Aber das erzählst du doch nur deswegen hier rum, weil ich dich letztens 
wegen deinem winzigen Schnäbi vor der Kasse aufgezogen habe.

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


Und jetzt etwas zum Ernst der Sache.
Aus meiner Wühlkiste, ein Master, welcher permanent die Zahlen von 0 bis 
255 sendet. Bei Misserfolg wird der aktuelle Versuch wiederholt.

Und ein Slave, welcher die Daten entgegennimmt und den Empfang 
unterbindet, bis die Daten verarbeitet wurden.

: Bearbeitet durch User
von Joachim B. (jar)


Bewertung
-1 lesenswert
nicht lesenswert
Arduino Fanboy D. schrieb:
> Das halte ich für irrational.

mag sein, aber wenn der TO Char sendet und keine Zahlen!

Du hast bei I2C natürlich Recht, man kann auch 0-255 direkt senden und 
auch so auswerten!

Arduino Fanboy D. schrieb:
> Aus meiner Wühlkiste, ein Master, welcher permanent die Zahlen von 0 bis
> 255 sendet. Bei Misserfolg wird der aktuelle Versuch wiederholt.

erinnert mich an meine erste Übertragung vom PC1500 zum apple2, dort 
habe ich es ähnlich gemacht, Bytes zu senden und als Bestätigung das 
gespiegelte Byte zurückzusenden und erst wenn der Sender das 
ordnungsgemäße Byte bestätigt wurde zum nächsten Byte gegangen, aber da 
hatte ich Kontrolleitungen(IEEE488 ähnlich).
Hier am I2C müsste man sich doch ein Protokoll überlegen, oder ein 
Spezialbyte AA/55 welches dann nicht im übertragenen Wertebereich liegen 
darf.

von M. K. (sylaina)


Bewertung
1 lesenswert
nicht lesenswert
Arduino Fanboy D. schrieb:
> Es ist völlig unsinnig per I2C Zeichen, oder Ketten der selben, zu
> versenden.
Richtig
Arduino Fanboy D. schrieb:
> Also macht auch die Auswertung dieser Zeichen(ketten) keinen Sinn.
Aber wenn jetzt Zeichen(ketten) via I2C versendet wurden machen die 
Auswertungen dieser Zeiche(ketten) sehr wohl sinn ;)

Der TO müsste sich jetzt also überlegen: Soll er Zeichen via I2C 
versenden oder soll er Zahlen via I2C versenden. Je nachdem muss er nur 
sein Programm/Programme anpassen und der Drops ist gelutscht. Deswegen 
sich zu zanken finde ich etwas lächerlich.

von Arduino Fanboy D. (ufuf)


Bewertung
1 lesenswert
nicht lesenswert
M. K. schrieb:
> Aber wenn jetzt Zeichen(ketten) via I2C versendet wurden machen die
> Auswertungen dieser Zeichen(ketten) sehr wohl sinn ;)
1
Wire.beginTransmission(slaveAdr); 
2
Wire << "Hallo Welt!" << endl;
3
byte error = Wire.endTransmission();

Wenn man muss, geht vieles.


Dieses allerdings nicht:
1
Wire.beginTransmission(slaveAdr); 
2
Wire.write('10');
3
byte error = Wire.endTransmission();

Etwas besser, aber nur weil es funktioniert.
1
Wire.beginTransmission(slaveAdr); 
2
Wire.print(10);
3
byte error = Wire.endTransmission();
Dann muss man den String allerdings wieder zusammen klöppeln und 
sicherlich wieder zu einer Zahl wandeln

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.