Forum: Mikrocontroller und Digitale Elektronik I2C Slave Problem Arduino


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 Fabian G. (fabian_s51)


Lesenswert?

Hallo,
ich versuche ein I2C Bussystem zwischen 2 Arduino Nanos aufzubauen, 
allerdings habe ich Probleme mit dem Code. Es sollen 2 Bytes vom Master 
verschickt und vom Slave empfangen werden.
Die beiden Bytes sollen nur gesendet werden wenn ein Byte einen anderen 
Wert hat als im vorherigen Programmablauf.

Mastercode

 //I2C Ausgang
  if (a == a1 && b == b1)
  {}
  else
  { //wire ausgang
    Wire.beginTransmission(8); // transmit to device #8
    Wire.write("a" );              // sends one byte
    Wire.write("b" );
    Wire.endTransmission();
  }
  a1 = a;
  b1 = b;

Slavecode

void receiveEvent() {

    int a = Wire.read();
    int b = Wire.read();


}

Der Code vom Master wurde ohne Probleme Überprüft, beim Slave
wurde ein Fehler gefunden:
s51output_f_r_I2C:149:14: error: 'Wire' was not declared in this scope

     int a = Wire.read();

              ^~~~

Bibliothek Wire in Version 1.0 im Ordner: C:\Program 
Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.33.0_x86__mdqgnx93n4wtt\hard 
ware\arduino\avr\libraries\Wire   wird verwendet
exit status 1
'Wire' was not declared in this scope

Ich habe schon im Netz geschaut, weiß allerdings nicht was ich verändern 
muss.

Ich bitte um Hilfe.

MfG Fabian

: Bearbeitet durch User
von Helmut -. (dc3yc)


Lesenswert?

Ganzen code posten! Formatierung beachten!

von TR.0LL (Gast)


Lesenswert?

Helmut -. schrieb:
> Ganzen code posten! Formatierung beachten!

Und den Code in die Code-tags packen.
https://www.mikrocontroller.net/articles/Formatierung_im_Forum

von Fabian G. (fabian_s51)


Lesenswert?

Der Komplette Code vom Slave:
1
const int blinkenrechts = 3 ;//oben K4
2
const int blinkenlinks = 2 ;//oben K3
3
const int standlicht = 4 ;//obenK2
4
const int ruecklicht = 5 ;//oben K1
5
const int fernlicht = 6 ;//unten K4
6
const int bremslicht = 7 ;//unten K3
7
const int regler = 8 ;//unten K2
8
const int zuendung = 9 ;//unten K1
9
const int batterie = 14 ;
10
const int anlasser = 16;
11
const int hupe = 17;
12
13
// Variablen zur i2c  auswertung
14
int a = 0;
15
int a1 = 0;
16
int a2 = 0;
17
int b = 0;
18
int b1 = 0;
19
int b2 = 0;
20
21
int zuendungan
22
//a4, a5 sind i2c pins
23
#include <Wire.h>
24
25
void setup() {
26
  Wire.begin(8);                // join i2c bus with address #8
27
  Wire.onReceive(receiveEvent); // register event
28
  Serial.begin(9600);           // start serial for output
29
30
  pinMode( blinkenrechts , OUTPUT);  
31
  pinMode( blinkenlinks , OUTPUT); 
32
  pinMode( standlicht , OUTPUT);
33
  pinMode( ruecklicht , OUTPUT); 
34
  pinMode( fernlicht , OUTPUT);
35
  pinMode( bremslicht , OUTPUT);
36
  pinMode( regler , OUTPUT);
37
  pinMode( zuendung , OUTPUT);
38
  pinMode( batterie , OUTPUT);
39
  pinMode( anlasser , OUTPUT);
40
  pinMode( hupe , OUTPUT);
41
}
42
43
void loop() {
44
  if (a1 = a)
45
  {}
46
  else
47
  { a1 = a;
48
    a2 = a;
49
    if (a2 >= 128)
50
    { a2 = a2 - 128;
51
      digitalWrite(zuendung , HIGH);
52
    }
53
    else
54
    { digitalWrite(zuendung , LOW);
55
    }
56
    if (a2 >= 64)
57
    { a2 = a2 - 64;
58
      bool rfstatus = HIGH;
59
    }
60
    else
61
    { bool rfstatus = LOW;
62
    }
63
    if (a2 >= 32)
64
    { a2 = a2 - 32;
65
      digitalWrite(bremslicht , HIGH);
66
    }
67
    else
68
    { digitalWrite(bremslicht , LOW);
69
    }
70
    if (a2 >= 16)
71
    { a2 = a2 - 16;
72
      digitalWrite(fernlicht , HIGH);
73
    }
74
    else
75
    { digitalWrite(fernlicht , LOW);
76
    }
77
    if (a2 >= 8)
78
    { a2 = a2 - 8;
79
      digitalWrite(blinkenlinks , HIGH);
80
    }
81
    else
82
    { digitalWrite(blinkenlinks , LOW);
83
    }
84
    if (a2 >= 4)
85
    { a2 = a2 - 4;
86
      digitalWrite(blinkenrechts , HIGH);
87
    }
88
    else
89
    { digitalWrite(blinkenrechts , LOW);
90
    }
91
    if (a2 >= 2)
92
    { a2 = a2 - 2;
93
      digitalWrite(hupe , HIGH);
94
    }
95
    else
96
    { digitalWrite(hupe , LOW);
97
    }
98
    if (a2 >= 1)
99
    { a2 = a2 - 1;
100
      bool leerlaufstatus = HIGH;
101
    }
102
    else
103
    { bool leerlaufstatus = LOW;
104
    }
105
  }
106
  if (b1 = b)
107
  {}
108
  else
109
  { b1 = b;
110
    b2 = b;
111
    if (b2 >= 128)
112
    { b2 = b2 - 128;
113
      digitalWrite(anlasser , HIGH);
114
    }
115
    else
116
    { digitalWrite(anlasser , LOW);
117
    }
118
    if (b2 >= 64)
119
    { b2 = b2 - 64;
120
      bool nachtlichtan = HIGH;
121
    }
122
    else
123
    { bool nachtlichtan = LOW;
124
    }
125
    if (b2 >= 32)
126
    { b2 = b2 - 32;
127
      digitalWrite(standlicht , HIGH);
128
      digitalWrite(ruecklicht , HIGH);
129
    }
130
    else
131
    { digitalWrite(standlicht , LOW);
132
      digitalWrite(ruecklicht , LOW);
133
    }
134
  }
135
136
137
138
139
140
}
141
142
// function that executes whenever data is received from master
143
// this function is registered as an event, see setup()
144
void receiveEvent() {
145
146
    int a = Wire.read();
147
    int b = Wire.read();
148
    
149
150
}

: Bearbeitet durch User
von Stefan ⛄ F. (stefanus)


Lesenswert?

Normalerweise gehören die Includes ganz nach oben.

Hinter
> int zuendungan
fehlt ein Semikolon.


Die Funktion
> void receiveEvent()
benötigt einen Parameter vom Typ Integer.

> blinkenrechts
ist undefiniert

: Bearbeitet durch User

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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