I2C arduino nano & uno werkt niet

Ik ben bezig met een school project waarbij ik een I2C verbinding nodig hebt tussen een arduino nano en een arduino uno.

Ik gerbuik de nano als slave en de uno als master. Het gaat hier om een master writer en een slave receiver.

Het probleem is wanneer ik twee arduino uno's gebruik en verbind komt de informatie netjes aan en werkt het zoals het moet werken, maar wanneer ik een uno en een nano wil verbinden komt er alleen -1 binnen(als ik het goed heb betekent het dat er geen informatie binnen komt). Ik heb alle kabels goed aangesloten. Iemand die ik ken heeft het ook geprobeerd en heeft precies hetzelfde probleem.

Voor extra info, ik gebruik de A4,A5 pinnen op de nano en de uno en heb gnd(uno) aan de gnd(nano) verbonden. De code die ik gebruik is van de arduino library zelf. Ik heb ook een foto toegevoegd van de serial monitor van de slave.

Ik hoop dat er iemand is die me met dit probleem kan helpen.

Master code:

#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);  
}

byte x = 0;

void loop() {
  Wire.beginTransmission(8); // transmit to device #8
  Wire.write("x is ");        // sends five bytes
  Wire.write(x);              // sends one byte
  Wire.endTransmission();    // stop transmitting
  Serial.println(x);

  x++;
  delay(500);
}

Slave code:

#include <Wire.h>

void setup() {
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop() {
  delay(100);
  receiveEvent(8);
}
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer

Kun je er op letten om altijd de volledige sketch te laten zien.

Het Arduino voorbeeld is helaas ronduit slecht: https://www.arduino.cc/en/Tutorial/MasterWriter.

Deze vraag heb ik pas nog langs zien komen. Diegene liet een foto zien en het leek er op alsof D4 en D5 werd gebruikt in plaats van A4 en A5 op het Nano board. Kun je dat nakijken of kun je er een foto van maken ?

Als er iets binnenkomt via de I2C bus, dan wordt dat binnen in de Wire library afgehandeld. Als alles is ontvangen dan wordt receiveEvent() aangeroepen vanuit een interrupt.
De receiveEvent() is dus ook een interrupt routine, en die kun maar beter zo klein mogelijk houden. Je kunt ook beter geen Serial functie aanroepen.

Om zomaar vanuit het niets zelf die interrupt functie aan te roepen, dat hoort niet. Die aanroep kun je uit de loop() halen.

Je verstuurt dus één byte. Als het goed is, dan ontvang je ook één byte.

#include <Wire.h>

void setup()
{
  Serial.begin(9600);           // start serial for output
  Serial.println( "De sketch is begonnen");
  
  Wire.begin(8);                // join i2c bus with address #8
  Wire.onReceive(receiveEvent); // register event
}


void loop()
{
  // Nothing in the loop().
  // Some boards like to have a delay() instead of nothing.
}


// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  if( howMany == 1)              // we are expecting one byte
  {
    byte myData = Wire.read();   // get the byte
    Serial.println(myData);      // print the byte, do not use Serial.println in the final version.
  }
}

De "Serial.println()" in de receiveEvent() hoort daar niet. Dat heb ik even gedaan zodat je het kunt testen.

Een uitgebreide tutorial is hier: Use I2C for communication between Arduinos - Exhibition / Gallery - Arduino Forum.

Je kunt in je sketch een link naar dit opnemen, en ook een link naar die tutorial als je daar iets van zou gebruiken.