Дайте пожалуйста подсказку

День добрый. Строю баню и хочу сразу сделать ее немного умной. задачей стоит соединить несколько ардуино нано по шине 1 wire. где каждая будет отвечать за свое назначение.
1-я (slave)принимать значение со всех кнопок переключателей и тд, сохранять значения в массив к которому будет доступ у всех ардуино на шине
2-я (slave )принимать значение с датчиков температур ds18b20(порядка 20 шт) и сохранять в массив к которому будет доступ у всех ардуино на шине
3-я (master) считывать значения из массивов 1 и 2 ардуино и в зависимости от сценария управлять 16 канальным реле
Начал с той что считывает температуру. после как добавляю библиотеку
#include <Wire.h>
#include <iarduino_I2C_connect.h>
iarduino_I2C_connect I2C2;
возникает ошибка компиляции " exit status 1
Ошибка компиляции для платы Arduino Nano." не указывающей на строку. подозреваю
что как то не получается работать библиотекам вместе.
дайте пожалуйста подсказку как решить проблемму. Сильно не пинайте, может за глупый вопрос.

#include <Wire.h>                                     
#include <iarduino_I2C_connect.h>
iarduino_I2C_connect I2C2;
#include <microDS18B20.h>
#define DS_PIN 2 // пин подключения датчиков температуры 
float array_sensors[20]; // создаем массив с 20 ю ячейками. отсчет идет от 0.
// Уникальные адреса датчиков - считать можно в примере address_read
uint8_t s1_addr[] = {0x28, 0xFF, 0xE5, 0x46, 0x88, 0x16, 0x3, 0x4A}; // адрес 1 датчика 
uint8_t s2_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s3_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s4_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s5_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s6_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s7_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s8_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s9_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s10_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s11_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s12_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s13_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s14_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s15_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s16_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s17_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s18_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s19_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};
uint8_t s20_addr[] = {0x28, 0xFF, 0x36, 0x94, 0x65, 0x15, 0x2, 0x80};

MicroDS18B20<DS_PIN, s1_addr> sensor1;  // Создаем термометр с адресацией
MicroDS18B20<DS_PIN, s2_addr> sensor2;  // Создаем термометр с адресацией
MicroDS18B20<DS_PIN, s3_addr> sensor3;
MicroDS18B20<DS_PIN, s4_addr> sensor4;
MicroDS18B20<DS_PIN, s5_addr> sensor5;
MicroDS18B20<DS_PIN, s6_addr> sensor6;
MicroDS18B20<DS_PIN, s7_addr> sensor7;
MicroDS18B20<DS_PIN, s8_addr> sensor8;
MicroDS18B20<DS_PIN, s9_addr> sensor9;
MicroDS18B20<DS_PIN, s10_addr> sensor10;
MicroDS18B20<DS_PIN, s11_addr> sensor11;
MicroDS18B20<DS_PIN, s12_addr> sensor12;
MicroDS18B20<DS_PIN, s13_addr> sensor13;
MicroDS18B20<DS_PIN, s14_addr> sensor14;
MicroDS18B20<DS_PIN, s15_addr> sensor15;
MicroDS18B20<DS_PIN, s16_addr> sensor16;
MicroDS18B20<DS_PIN, s17_addr> sensor17;
MicroDS18B20<DS_PIN, s18_addr> sensor18;
MicroDS18B20<DS_PIN, s19_addr> sensor19;
MicroDS18B20<DS_PIN, s20_addr> sensor20;


void setup() {
  Serial.begin(9600);
  //Wire.setClock(400000);                              // устанавливаем скорость передачи данных по шине I2C = 400кБит/с 
  Wire.begin(0x03);                                 // инициируем подключение к шине I2C в качестве ведомого (slave) устройства, с указанием своего адреса на шине. 
  I2C2.begin(array_sensors);                   // инициируем возможность чтения/записи данных по шине I2C, из/в указываемый массив
}

void loop() {
  
  sensor1.requestTemp();      // Запрашиваем преобразование температуры для 1 го датчика 
  sensor2.requestTemp();
  sensor3.requestTemp();
  sensor4.requestTemp();
  sensor5.requestTemp();
  sensor6.requestTemp();
  sensor7.requestTemp();
  sensor8.requestTemp();
  sensor9.requestTemp();
  sensor10.requestTemp();
  sensor11.requestTemp();
  sensor12.requestTemp();
  sensor13.requestTemp();
  sensor14.requestTemp();
  sensor15.requestTemp();
  sensor16.requestTemp();
  sensor17.requestTemp();
  sensor18.requestTemp();
  sensor19.requestTemp();
  sensor20.requestTemp();
              
              delay(1000);           // ожидаем результат 
              
  array_sensors[0] = sensor1.getTemp(); // сохраняем значение температуры 1го датчика в первую ячейку массива
  array_sensors[1] = sensor1.getTemp(); 
  array_sensors[2] = sensor1.getTemp(); 
  array_sensors[3] = sensor1.getTemp(); 
  array_sensors[4] = sensor1.getTemp(); 
  array_sensors[5] = sensor1.getTemp(); 
  array_sensors[6] = sensor1.getTemp(); 
  array_sensors[7] = sensor1.getTemp(); 
  array_sensors[8] = sensor1.getTemp(); 
  array_sensors[9] = sensor1.getTemp(); 
  array_sensors[10] = sensor1.getTemp(); 
  array_sensors[11] = sensor1.getTemp(); 
  array_sensors[12] = sensor1.getTemp(); 
  array_sensors[13] = sensor1.getTemp(); 
  array_sensors[14] = sensor1.getTemp(); 
  array_sensors[15] = sensor1.getTemp(); 
  array_sensors[16] = sensor1.getTemp(); 
  array_sensors[17] = sensor1.getTemp(); 
  array_sensors[18] = sensor1.getTemp(); 
  array_sensors[19] = sensor1.getTemp(); 
  






//Serial.println(array_sensors[1]); //вывод значения температуры из 1 ячейки массива
}

Так не бывает. Включите вывод всех сообщений в настройках ИДЕ

Подсказка: не трать время на эту блажь. Ничего не получится.

1 лайк

И сразу непрошеный совет (я уже давно сделал примерно то, что вы задумали). Для всего перечисленного вам нужен ОДИН контроллер. Лично я люблю ESP32. Заманаетесь протоколы обмена данными писать и отлаживать для каждого МК. Тонны строк бесполезного и ненужного кода

я понимаю о чем вы говорите, но я как новичек в этом, то мне разобраться с одним маленьким кодом проще для каждой ардуино. В будущем в задумке все эти данные подключить к Raspberry на которой установлен Open Hab, чтоб появилась возможность управлять всем с телефона

Именно поэтому вам не нужно несколько ардуино. Нужен один контроллер с беспроводными стеками на борту. Маленького кода с вашей идеей “сети ардуино” у вас не будет по определению. Дело ваше, конечно.
И да, сетевой обмен очень плохо сочетается с длинными “делеями” в коде. В связи с этим, кстати, придется отказаться от использования библиотек ds18b20. Они все на делеях. Придется писать свой вариант на миллис…
А разбираться с маленькими функциональными кусками программы вам никто не помешает. Так все и делают

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

Еще раз: сделать сеть на 1wire и нано фундаментально невозможно.

1 лайк

Можете немного обьяснить почему?
Я беру за решение вот этот пример
https://lesson.iarduino.ru/page/urok-26-3-soedinyaem-dve-arduino-po-shine-i2c/

Не мне, но… 1wire и i2с не одно и то же. И тем более i2c не рожден для длинных сетей. Это межблочный протокол. Грубо говоря, на одной плате модули обмениваются. 1wire - это ваши термодатчики…

1 лайк

Потому что не хватит производительности и целостности сигнала.

Поскроллить окошко сообщений вверх и почитать сообщение об ошибке, оно там есть.

Вот оно, кстати
In file included from D:\GoogleD\Soft\Kaka\kaka2\kaka2.ino:2:0:
...\libraries\iarduino_I2C_connect-master\src/iarduino_I2C_connect.h: In instantiation of 'void iarduino_I2C_connect::begin(T (&)[j]) [with T = float; unsigned int j = 20]':
...\Kaka\kaka2\kaka2.ino:55:27:   required from here
...\libraries\iarduino_I2C_connect-master\src/iarduino_I2C_connect.h:24:59: error: no matching function for call to 'iarduino_I2C_connect::I2C_func_BEGIN(float [20], unsigned int)'
   template< typename T, size_t j> void begin   (T(&i)[j]){I2C_func_BEGIN(i,j);}// инициализация в качестве slave, с указанием массива, данные кторого будут доступны для чтения/записи по шине I2C
                                                           ^~~~~~~~~~~~~~
...\libraries\iarduino_I2C_connect-master\src/iarduino_I2C_connect.h:26:22: note: candidate: void iarduino_I2C_connect::I2C_func_BEGIN(uint8_t*, uint8_t)
  private:       void I2C_func_BEGIN (uint8_t*, uint8_t);   //  внутренняя функция
                      ^~~~~~~~~~~~~~
...\libraries\iarduino_I2C_connect-master\src/iarduino_I2C_connect.h:26:22: note:   no known conversion for argument 1 from 'float [20]' to 'uint8_t* {aka unsigned char*}'
exit status 1
Ошибка компиляции для платы Arduino Uno.

И почему я не удивлён? Запомните, библиотек хуже, чем у iarduino я ещё не видел нигде и ни у кого. Даже, если на вид они и работают.

3 лайка

Спасибо, в этом наверное и есть загвоздка, я думал что это одно и тоже.

Спасибо вам) Совет про iarduino учту)

хуже чем у Гайвера?

Они примерно одного уровня , но iarduino лидирует на полкорпуса.

И да, гивер же сам не пишет, тупо копипиздит проверенные решения и пытается их допилить функционалом.
Так что в ряде случаев исходные функции работают именно так как задумано , тем же Adafruit’ом

Да, хуже.