I2C slave



  • Hi, I am having problems in communication between Wemos D1 mini and Wemos XI via I2C.

    Whenever I send I2C packet from D1 to XI, the program on XI gets stucked.

    I'm using this example to test it:

    // Wire Slave Receiver
    // by Nicholas Zambetti <http://www.zambetti.com>
    
    // Demonstrates use of the Wire library
    // Receives data as an I2C/TWI slave device
    // Refer to the "Wire Master Writer" example for use with this
    
    // Created 29 March 2006
    
    // This example code is in the public domain.
    
    
    #include <Wire.h>
    
    void setup()
    {
      Wire.begin(0x7F);                // join i2c bus with address #8
      Wire.onReceive(receiveEvent); // register event
      Serial.begin(9600);           // start serial for output
    }
    
    void loop()
    {
      delay(100);
      Serial.print(".");
    }
    
    // function that executes whenever data is received from master
    // this function is registered as an event, see setup()
    void receiveEvent(int howMany)
    {
        Serial.print("x");
      while (1 < Wire.available()) // loop through all but the last
      {
          Serial.print("*");
        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
    } 
    

    And get this output:

    ..................
    

    I'm having D1, D2 and A4, A5 (+GNDs), connected with pullups 4k7 to 3V3.

    Any thoughts?

    The documentation for XI is shit as it doesn't exists :( No schematics, no API

    Thanks



  • I don't think you should be using Serial.print inside an interrupt.



  • Hi, thanks for the response.

    It's not working even without Serial.

    And on the top it's an "official" example.

    But as you propose I've tried it once more.

    #include <Wire.h>
    
    volatile uint8_t val;
    
    void setup()
    {
      Wire.begin(0x7f);
      Wire.onReceive(receiveEvent);
    
      pinMode(13, OUTPUT);
    
      val = 1;
    }
    
    void loop() {}
    
    void receiveEvent(int count)
    {
      digitalWrite(13, val);
      val = 1 - val;
    }
    

    It should blink, but nothing happens :(

    The script I want to run is this one: https://github.com/letscontrolit/ESPEasySlaves/blob/master/MiniProExtender/MiniProExtender.ino



  • @majklovec Do you have pullup resistors on your i2c lines?


Log in to reply
 

Looks like your connection to WEMOS Forum was lost, please wait while we try to reconnect.