I2C и ESP8266

Тема в разделе "Проводная и беспроводная связь", создана пользователем ObelardO, 28 ноя 2015.

Метки:
  1. ObelardO

    ObelardO Нерд

    Доброго всем времени!
    Подскажите, пожалуйста, возможно ли на ESP8266 реализовать i2c интерфейс, или на подобном wi-fi модуле?
    Спасибо.
     
  2. ИгорьК

    ИгорьК Оракул Модератор

  3. ObelardO

    ObelardO Нерд

  4. NE_XT

    NE_XT Гик

    Значит надо сначала цели обозначить, а то получается -" незнаю как, но чтоб красиво".
     
  5. ObelardO

    ObelardO Нерд

    Ничего подобного не получается. Я не просил ни кого решать мои задачи и цели, единственный момент который меня интересует - реализация i2c на esp8266, например возможно ли работать с дисплеем 20х4 символа. nodemcu меня не интересует, собираюсь прошивать из arduino ide, и если для той же ардуино это wire, то как быть с esp - будет ли работать стандартная библиотека и т.п.
     
  6. lexa

    lexa Нуб

    Всем доброго времени суток,есть esp12e работаю через ардуино компилятор,хочу сделать передачу данных с Pic18f46k22 в роли мастера на esp12e в роли slave,возможно ли это? Ибо esp12 имеет i2c, но не знаю сможет ли быть в роли slave,за рание огромное спасибо
     
  7. Slaiterx

    Slaiterx Гик

    nodemcu прекрасно работает с компилятором ардуино все примеры все работает ноги только по другому я и часы делал по i2c с обновлением с интернета по wi-fi и дисплей подключал 20х4
     
  8. lexa

    lexa Нуб

    я знаю,но он как мастер работает,а мне нужно в режиме slave,хотел узнать возможно ли это,а вы подключали дисплей в режиме мастера.
     
  9. Ser8191

    Ser8191 Нерд

    Подскажите:
    Безымянный.png
    Код ардуино
    Код (C++):
    #include <Wire.h>
    #include <iarduino_I2C_connect.h>
    iarduino_I2C_connect I2C2;
    const byte PIN_Potentiometer = 0;
    int  VAR_Potentiometer = 0;
    byte REG_Massive[3];
    void setup(){
    Wire.begin(0x02);
    I2C2.begin(REG_Massive);
    }
    void loop(){
      VAR_Potentiometer = analogRead(PIN_Potentiometer);
      REG_Massive[1]    = VAR_Potentiometer>>8;
      REG_Massive[2]    = VAR_Potentiometer;
    //Почему значение потенциометра содержит 2 байта?
    }
    Код nodemcu lua
    Код (C++):
    id=0
    sda=2--Uno A4--Node D2--IO4
    scl=1--Uno A5--Node D1--IO5
    i2c.setup(id, sda, scl, i2c.SLOW)
    function read_reg(dev_addr, reg_addr)
        i2c.start(id)
        i2c.address(id, dev_addr, i2c.TRANSMITTER)
        i2c.write(id, reg_addr)
        i2c.stop(id)
        i2c.start(id)
        i2c.address(id, dev_addr, i2c.RECEIVER)
        c = i2c.read(id, 1)
        i2c.stop(id)
        return c
    end
    -- get content of register 0xAA of device 0x77
    reg = read_reg(0x2, 0x02)
    print(string.byte(reg))
    В итоге получаю числа от 0 до 255
    Как мне получить то,что отсылает ардуино (0-1023)
     
    Последнее редактирование: 5 июл 2017
  10. Ser8191

    Ser8191 Нерд

    Разобрался.
    Взял за основу пример
    Код (C++):
    // Wire Slave Sender
    // by Nicholas Zambetti <http://www.zambetti.com>

    // Demonstrates use of the Wire library
    // Sends data as an I2C/TWI slave device
    // Refer to the "Wire Master Reader" example for use with this

    // Created 29 March 2006

    // This example code is in the public domain.


    #include <Wire.h>

    void setup() {
      Wire.begin(8);                // join i2c bus with address #8
      Wire.onRequest(requestEvent); // register event
    }

    void loop() {
      delay(100);
    }

    // function that executes whenever data is requested by master
    // this function is registered as an event, see setup()
    void requestEvent() {
      Wire.write("hello "); // respond with message of 6 bytes
      // as expected by master
    }
    И код LUA
    Код (C++):
    id=0
    sda=2--Uno A4--Node D2--IO4
    scl=1--Uno A5--Node D1--IO5
    i2c.setup(id, sda, scl, i2c.SLOW)
    function read_reg(dev_addr)
        i2c.start(id)
        i2c.address(id, dev_addr, i2c.RECEIVER)
        c = i2c.read(id, 6)
        i2c.stop(id)
        return c
    end
    -- get content of register 0xAA of device 0x77

    tmr.alarm(0, 1000, 1, function()
    reg = read_reg(0x08, 0x02)
    print(c)
    end )
     
     
  11. Ser8191

    Ser8191 Нерд

    Хотел отправить показания потенциометра, получаю:
    Код (C++):
    int Potentiometer = 0;
    #include <Wire.h>

    void setup() {
    Wire.begin(8);              
    Wire.onRequest(requestEvent);
    }

    void loop() {
      delay(100);
    }


    void requestEvent() {
    Potentiometer = analogRead(0);
    char q="Privet";
    //Wire.write(Potentiometer);
    //Получаю
    //|яяяяя
    //"яяяяя
    //}яяяяя
    //}яяяяя
    //Џяяяяя

    //Wire.write("Privet");//Получаю Privet
    Wire.write("123456");//Получаю 123456
    //Wire.write(q);//Получаю яяяяя

    }
     
  12. Ser8191

    Ser8191 Нерд

    Почему
    Wire.write("Privet"); Читается
    А
    char q="Privet";
    Wire.write(q); НЕ читается
     
  13. Ser8191

    Ser8191 Нерд

    Или (из примера)
    Код (C++):
    byte x = 0;
    Wire.write("x is ");        // sends five bytes
    Wire.write(x);              // sends one byte
    x=++;
    Получаю:

    x is яяя
    x is яяя
    x is яяя
    x is яяя
    x is яяя
    x is яяя
    x is !яяя
    x is "яяя
    x is #яяя
    x is $яяя
    x is %яяя
    x is &яяя
     
  14. Ser8191

    Ser8191 Нерд

    Схема
    i2c.png
     
  15. Ser8191

    Ser8191 Нерд

    Код (C++):
    //char*text="error";
    //String data="123456";
    Potentiometer = analogRead(0);
    String data =  String(Potentiometer, DEC);
    Wire.write(data.c_str());
    Получилось.