Funktion Zusammenbau aber wie

Hallo Leute :-),

ich bin neu in dem "Arduino-Bereich" und probiere mich jetzt durch alles durch.

Zum Spielen mit I2C habe ich jetzt was zum laufen bekommen. jetzt möchte ich ein Teil vom Skript benutzen als ein "Baustein" zum Wiederverwenden damit ich den teil nicht immer wieder neu schreiben muss, wenn ich ein anderen "Slave" ansprechen möchte.

Jetzt habe ich was probiert und es geht nicht so wie ich mir das vorstelle.

Könnt ihr bitte mal gucken, wo ich VerstÀndnisprobleme habe.

#include <Wire.h>
int pin1 = 18; // schaltet LED
int taster = 0;


void setup() 
{
   Wire.begin(D1,D2);
   pinMode(pin1,OUTPUT);
   Serial.begin(9600); 
}




void loop()
{
Slave(22,taster);

 if(taster==1)
 {
  digitalWrite(pin1,HIGH);
  }
  else
  {
    digitalWrite(pin1,LOW);
  }  

}

void Slave (int adresse, int data)
{
Wire.requestFrom(adresse, 1); 
while(Wire.available()) 
{
data = Wire.read(); 
}
}

Wozu das ganze, und dann auch noch grob fehlerhaft ?
Je nach I2C-Slave hast du doch passende Libraries, die du da verwenden kannst.
Das spart dir ne Menge Arbeit.

#include <Wire.h>
int pin1 = 18; // schaltet LED
int taster = 0; // KANN taster negativ werden? Nein? Dann unsigned int!
const byte slave22 = 22;

void setup()
{
  Wire.begin();
  pinMode(pin1, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  taster = Slave(slave22);
  if (taster == 1)
  {
    digitalWrite(pin1, HIGH);
  }
  else
  {
    digitalWrite(pin1, LOW);
  }
}

int Slave (byte adresse)
{
  // kann data nicht negativ werden? dann unsigned int!
  int data = 0;
  Wire.requestFrom(adresse, 1);
  while (Wire.available())
  {
    data = Wire.read();
  }
  return data;
}

Die Unterschiede findest Du selbst.

@my_xy_projekt Danke

Oha, das muss ich jetzt erstmal alles nachvollziehen.
Was mach „return“ ?
Warum „const byte“ fĂŒr die Adresse ?

Lieben Gruß und danke :blush:

Das was drauf steht :wink: es sorgt dafĂŒr, das ein Wert zurĂŒck gegeben wird.

Die sollte sich nicht verÀndern. darum const.
Byte, weil ein byte nur ein byte belegt ein (unsigned) int belegt 2 byte.
Du hast nicht unendlich Speicher. Jetzt mag es noch nicht so schwierig sein mit Speicherverbrauch - gewöhn Dir aber an, wenigstens die Variablen auf den kleinsten Nenner zu belegen.

im Übrigen:

const byte pin1 = 18; // schaltet LED

der Pin Àndert sich nicht und braucht ein byte weniger Speicherplatz.
Und wenn wir schon beim angewöhnen sind:
Benenne Pin's nach ihrer Funktion, ggfls. beschreibe was das wird.

const byte LED1 = 18; // Statusanzeige fĂŒr Daten auf dem I2C-Slave

In dem Post: Code ausfĂŒren wen 2 Bedinungen erfĂŒlt sind(if) - #14 by my_xy_projekt
ist unten ein pdf zum download angehangen.
Lies es durch. Jeden Abend ein wenig.

1 Like

@my_xy_projekt
Super liebe, danke :slight_smile:

Aber wie kommt der Wert von "daten" in die "void loop" ?

und wenn ich ein zweiten "Slave" einbinden möchte?

Das mit dem Speicher sparen werde ich in zukunft berĂŒcksichtigen.

Danke fĂŒr die Hilfe

Dann geht das so:

#include <Wire.h>
const byte LED1 = 18; // Statusanzeige fĂŒr Daten auf dem I2C-Slave 22
const byte LED2 = 17; // Statusanzeige fĂŒr Daten auf dem I2C-Slave 21
byte taster = 0; // KANN taster negativ werden? Nein? Dann unsigned int!
const byte slave22 = 22;
const byte slave21 = 21;

void setup()
{
  Wire.begin();
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  taster = Slave(slave22);
  if (taster == 1)
  {
    digitalWrite(LED1, HIGH);
  }
  else
  {
    digitalWrite(LED1, LOW);
  }
  taster = Slave(slave21);
  if (taster == 1)
  {
    digitalWrite(LED2, HIGH);
  }
  else
  {
    digitalWrite(LED2, LOW);
  }
  
}

byte Slave (int adresse)
{
  // kann data nicht negativ werden? dann unsigned int!
  byte data = 0;
  Wire.requestFrom(adresse,1);
  while (Wire.available())
  {
    data = Wire.read();
  }
  return data;
}

Es geht auch noch einfacher, aber erstmal zum lernen ist das schick.

Die Funktion "byte Slave(int adresse)" gibt einen Wert zurĂŒck.
Initialisiert ist dieser mit byte - anders als void, heisst es, das ein byte zurĂŒckgegeben wird. Void heist nichts, da wird also nichts zurĂŒck gegegeben. void (SchlĂŒsselwort) – Wikipedia

Was zurĂŒck gegeben wird, bestimmst Du mit return. Und da steht das data hinter.

Der Wert der in data drin steckt, ist der Wert, mit dem taster gefĂŒttert wird.

1 Like

Das hast du gut erklĂ€rt, danke dafĂŒr. Sobald ich zuhause bin werde ich es mal probieren.
Danke, dass du dir bis jetzt die MĂŒhe gemacht hast, mir das alles zu erlĂ€utern.

Super :slight_smile: Es Funktioniert .
Dankeschön

Dann verwirre ich Dich mal mit einer Kurzfassung.
Bedingung ist, das die Anzahl LED und Slaves gleich ist....

#include <Wire.h>
const byte anzahl = 2;
const byte LED[anzahl] = {18, 17}; // Statusanzeige fĂŒr Daten auf dem I2C-Slave
const byte slave[anzahl] = {22, 21}; // Slaveadressen
void setup()
{
  Wire.begin();
  for (unsigned int i = 0; i < sizeof(LED); i++) pinMode(LED[i], OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  for (unsigned int i = 0; i < sizeof(slave); i++)
  {
    if (Slave(slave[i]))
    {
      digitalWrite(LED[i], HIGH);
    }
    else
    {
      digitalWrite(LED[i], LOW);
    }
  }
}

byte Slave (int adresse)
{
  // kann data nicht negativ werden? dann unsigned int!
  byte data = 0;
  Wire.requestFrom(adresse, 1);
  while (Wire.available())
  {
    data = Wire.read();
  }
  return data;
}

ich bin raus :sweat_smile: