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: