Вопрос мастерам, I2C.

Тема в разделе "Arduino & Shields", создана пользователем Rudolph Sikorskiy, 14 мар 2017.

Метки:
  1. Есть задача, опрашивать несколько ардуино по I2C с целью вывести полученное на дисплей.
    Рабочий код прикладываю, подсоединял по мануалу пробовал подтягивать SCL и SDA резисторами на 1,5кОм.
    Вопрос в следующем.
    Почему то поле некоторого времени слейв перестает определятся.
    Скан видит любую перефирию I2C кроме ардуинки
    Код (C++):
    Код мастера
    01 #include <LiquidCrystal_I2C.h>
    02 LiquidCrystal_I2C lcd(0x26,16,2);
    03 #include <Wire.h>
    04 char co = 0 ;
    05
    06 void setup()
    07  {
    08
    09  Wire.begin(); // join i2c bus (address optional for master)
    10  lcd.init();
    11  lcd.backlight();
    12  Serial.begin(9600);
    13  }
    14
    15 void loop()
    16  {
    17
    18  Wire.requestFrom(0x10, 4,true);
    19  lcd.setCursor(0,0);
    20  while (Wire.available())
    21  {
    22  co = Wire.read();
    23  Serial.print(co);
    24  lcd.print(co);
    25  }
    26  delay(200);
    27
    28
    29  Serial.print(" ");
    30
    31  Wire.requestFrom(0x10, 7,true); // request 6 bytes from slave device #8
    32  lcd.setCursor(4,0);
    33  while (Wire.available())
    34  {
    35  co = Wire.read();
    36  Serial.print(co);
    37  lcd.print(co);
    38  }
    39
    40  Serial.print("\n");
    41  delay(200);
    42  lcd.clear();
    43 }
     
    Код (C++):
    Код слейва


    01 #include <Wire.h>
    02
    03 byte stat = true;
    04
    05 char c[4] = {'N','O',' ',' '};
    06 float x = 322.345;
    07 void setup() {
    08  Wire.begin(0x10);
    09  pinMode(13, OUTPUT);
    10  Serial.begin(9600);
    11  Wire.onRequest(requestEvent);
    12 }
    13
    14 void loop() {
    15  digitalWrite(13, LOW);
    16  delay(100);
    17
    18 }
    19
    20 void requestEvent() {
    21  if (stat == true)
    22  {
    23
    24  Wire.write(c,sizeof c);
    25  stat = false;
    26  }else
    27  {
    28  char outstr[7];
    29  dtostrf(x,7, 3, outstr);
    30  Wire.write(outstr,sizeof outstr);
    31  stat = true;
    32  }
    33  digitalWrite(13, HIGH);
    34
    35
    36
    37
    38 }
     
    Последнее редактирование: 14 мар 2017
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    I2C - это внутриплатный протокол, расстояние между устройствами не должно превышать 15-20 см.
     
  3. Да я и не превышал. Более того разводил платку, но она поработав часок перестала.
    [​IMG]
     
    Последнее редактирование: 14 мар 2017
  4. Faberge

    Faberge Administrator Администратор

    Попробуйте уменьшить номинал подтягивающих резисторов. Возможно еще плохое соединение линий I2C, я так понимаю по фото, вы припаяли штырьки поверх контактов?
     
  5. Посмотреть вложение 8118
    сейчас их нет вообще, пробовал 1ком и 550 и 220 ом, разницы не было.
     
  6. afiskon

    afiskon Нерд

    Качество соединения такими проводами оставляет желать лучшего, да и макетки со временем ушатываются. Попробуйте поставить Proto Shiled и впаять в него все что вы хотите опрашивать. Для эксперимента хотя бы, сравнить результат, потом можно выпаять.