I2C communicatie

Goeie dag allen.

ben momenteel een beetje aan het spelen met de I2C bus.

heb al het een en andere geprobeert wat prima werkte.

nu probeer ik door middel van een register aan tespreken. de button state van de slave tekrijgen.
de button state heb ik laten varen voor nu. en probeer de tekst YEAH op de serial van de slave tekrijgen als alles werkt.
alleen lukt dat niet echt en zie niet echt wat ik fout doe.

ik krijg wel “a” en “b” op de serial. snap dus niet echt waar het mist gaat.
momenteel gebruik ik een pointer maar heb het ook met “return” geprobeert maar krijg het zelfde resultaat.

de state van de led terug sturen ging prima (allen de code mist)

Master:

template<typename T> void send2(uint8_t adress, uint8_t reg, T val);

#include <Wire.h>

uint32_t prevmillis;
uint8_t b;
uint32_t c = 1024;

void setup() {
  Wire.begin(0);
  Serial.begin(9600);
  //Serial.setTimeout(50);
}

void loop() {
  c++;
  if (millis() - prevmillis >= 1000) {
    prevmillis = millis();
    send2(1, 0, b = ~b); // led aan/uit op Pro // return code is al weg maar werkte prima.
    send2(1, 1, c); // counter op pro
    write2Return8(1, 2); // spreek register aan om button state tekrijgen
  }
}


template<typename T> void send2(uint8_t adress, uint8_t reg, T val) {
  Wire.beginTransmission(adress);
  Wire.write(reg);
  for (int8_t valSize = sizeof(val) - 1; valSize >= 0; valSize--) {
    Wire.write(val >> valSize * 8);
  }
  Wire.endTransmission();
}


uint8_t write2Return8(uint8_t adress, uint8_t reg) {
  Wire.beginTransmission(adress);
  Wire.write(reg);
  Wire.endTransmission();
  Wire.requestFrom(1, 1);
  while (Wire.available()) {
    return  Wire.read();
  }
}

Slave:

template<typename T> void receive2 (uint8_t regin , uint8_t reg, uint8_t valSize, T& val);
#include <Wire.h>

uint8_t led = 0;
uint32_t count;
uint8_t register2;
#define pin4 4
#define pin5 5
#define pin6 6
#define pin7 7

#define led13 13

void setup() {
  pinMode(led13, OUTPUT);
  pinMode(pin4, INPUT);
  pinMode(pin5, INPUT);
  pinMode(pin6, INPUT);
  pinMode(pin7, INPUT);

  Wire.begin(1);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(led13, led);
  //Serial.println(register2);
}

void receiveEvent() {
  if (Wire.available()) {
    uint8_t reg = Wire.read();
    receive2(reg, 0, led);
    receive2(reg, 1, count);
    reg2(reg, 2, register2);
  }
}

void requestEvent() {
  if (led == 0) {
    Wire.write(0);
    Serial.println("Led uit");
  } else {
    Wire.write(1);
    Serial.println("Led aan");
  }
  if (register2 == 0) {
    Serial.println("YEAH"); // zo dra register 2 == 0 print YEAH maar werk niet! krijg wel A en B in de Serial.print
  }
}

template<typename T> void receive2 (uint8_t regin , uint8_t reg, T& val) {
  if (regin == reg) {
    for (uint8_t x = 0; x < sizeof(val); x++) {
      val = val << 8;
      val += Wire.read();
    }
  }
}

uint8_t reg2(uint8_t regin, uint8_t reg, uint8_t& val) {
  if (regin == reg) {
    Serial.println("a"); // Print A zodra regin == reg
    val = 1;
  } else {
    Serial.println("b"); // Print B zodra regin == reg
    val = 0;
  }
}

en dit is wat ik krijg op de Serial port van de slave:

b
b
a
Led aan
b
b
a
Led uit
b
b
a
Led aan

Oke never mind tot zo ver. ik krijg nu dit op de Serial.

b
a
Led uit
YEAH
b
b
a
Led aan
YEAH

ik heb dit verandert:

void reg2(uint8_t regin, uint8_t reg, uint8_t& val) {
  if (regin == reg) {
    Serial.println("a"); // Print A zodra regin == reg
    val = 1; // <<<<
  } else {
    Serial.println("b"); // Print B zodra regin == reg
    val = 0; // <<<<
  }
}

naar

void reg2(uint8_t regin, uint8_t reg, uint8_t& val) {
  if (regin == reg) {
    Serial.println("a"); // Print A zodra regin == reg
    val = 0; // <<<<
  } else {
    Serial.println("b"); // Print B zodra regin == reg
    val = 1; // <<<<
  }
}

alleen op de master krijg ik 0 en 1 om en om

1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1

en heb ik dit aangepast.

if (register2 == 0) {
    Serial.println("YEAH"); // zo dra register 2 == 0 print YEAH maar werk niet! krijg wel A en B in de Serial.print
  }

naar

if (register2 == 0) {
    Serial.println("YEAH"); // zo dra register 2 == 0 print YEAH maar werk niet! krijg wel A en B in de Serial.print
    Wire.write(pin4state);
  }

uiteraard heb ik in de loop ook “pin4state = digitalRead(pin4);” toegevoegt.

en master heeft nu dit

byte x = write2Return8(1, 2); // spreek register aan om button state tekrijgen
    Serial.println(x);

of toe wel nieuwe code :wink:

Master:

template<typename T> void send2(uint8_t adress, uint8_t reg, T val);

#include <Wire.h>

uint32_t prevmillis;
uint8_t b;
uint32_t c = 1024;

void setup() {
  Wire.begin(0);
  Serial.begin(9600);
  //Serial.setTimeout(50);
}

void loop() {
  c++;
  if (millis() - prevmillis >= 1000) {
    prevmillis = millis();
    send2(1, 0, b = ~b); // led aan/uit op Pro // return code is al weg maar werkte prima.
    send2(1, 1, c); // counter op pro
    byte x = write2Return8(1, 2); // spreek register aan om button state tekrijgen
    Serial.println(x);
  }
}


template<typename T> void send2(uint8_t adress, uint8_t reg, T val) {
  Wire.beginTransmission(adress);
  Wire.write(reg);
  for (int8_t valSize = sizeof(val) - 1; valSize >= 0; valSize--) {
    Wire.write(val >> valSize * 8);
  }
  Wire.endTransmission();
}


uint8_t write2Return8(uint8_t adress, uint8_t reg) {
  Wire.beginTransmission(adress);
  Wire.write(reg);
  Wire.endTransmission();
  Wire.requestFrom(1, 1);
  while (Wire.available()) {
    return  Wire.read();
  }
}

slave:

template<typename T> void receive2 (uint8_t regin , uint8_t reg, uint8_t valSize, T& val);
#include <Wire.h>

uint8_t led = 0;
uint32_t count;
uint8_t register2;
#define pin4 4
#define pin5 5
#define pin6 6
#define pin7 7

uint8_t pin4state;

#define led13 13

void setup() {
  pinMode(led13, OUTPUT);
  pinMode(pin4, INPUT);
  pinMode(pin5, INPUT);
  pinMode(pin6, INPUT);
  pinMode(pin7, INPUT);

  Wire.begin(1);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(led13, led);
  //Serial.println(register2);
  pin4state = digitalRead(pin4);
  Serial.println(pin4state);
}

void receiveEvent() {
  if (Wire.available()) {
    uint8_t reg = Wire.read();
    receive2(reg, 0, led);
    receive2(reg, 1, count);
    reg2(reg, 2, register2);
  }
}

void requestEvent() {
  if (led == 0) {
    Wire.write(0);
    Serial.println("Led uit");
  } else {
    Wire.write(1);
    Serial.println("Led aan");
  }
  if (register2 == 0) {
    Serial.println("YEAH"); // zo dra register 2 == 0 print YEAH maar werk niet! krijg wel A en B in de Serial.print
    Wire.write(pin4state);
  }
}

template<typename T> void receive2 (uint8_t regin , uint8_t reg, T& val) {
  if (regin == reg) {
    for (uint8_t x = 0; x < sizeof(val); x++) {
      val = val << 8;
      val += Wire.read();
    }
  }
}

void reg2(uint8_t regin, uint8_t reg, uint8_t& val) {
  if (regin == reg) {
    Serial.println("a"); // Print A zodra regin == reg
    val = 0;
  } else {
    Serial.println("b"); // Print B zodra regin == reg
    val = 1;
  }
}

Owww stupid me.

het is opgelost.

de 01010101 die ik krijg is van de led aan/uit nadat ik 2 bytes binnen haalde kreeg ik ook de buttonstate.