Связь трёх arduino

Pashock82
Offline
Зарегистрирован: 24.05.2016

Всем доброго дня или другого времени суток!

Помогите пожалуйста  разобраться с кодом. Есть три ардуины, две из которых выполняют функцию измерения тока, сравнения его с заданным и включения/отключения нагрузки, а третья задаёт ток для сравнения, и выводит данные на LCD 2004. Связать платы нужно по I2C. 

Вот примерный код одной из плат измерения, она же "SLAVE":

#include <Wire.h>
int InCurent=0; //ввод с датчика тока
int Curent=0; //сравниваемое значение тока
const int LedOn=7; //питание вкл/выкл
int RealCurent; //реальное значение номинального тока
 
void setup()     
 { 
      Serial.begin(9600); 
       
      pinMode(LedOn, OUTPUT); 
           
          
 } 
 
void loop() 
 
RealCurent = analogRead(InCurent);считываем значение с датчика тока
 
//Запрос по Wire значения "Curent" и выхода "Ledon" (HIGH или LOW)
 
 
 
 
if(RealCurent > Curent)//Сравнение установленного тока с реальным
        {
        digitalWrite(LedOn, LOW);//Гасим светодиод LedOn (подача питания)
        Serial.println("Curent more than setup");
        }
Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Насколько помню, SLAVE режимы I2C в wiring не реализованы или как-то криво, но могу и ошибиться ... не помню ужо.

Pashock82
Offline
Зарегистрирован: 24.05.2016

Я для этого пробовал соединять три платы, на одну заливал скетч "MASTER", на две других "SLAVE". Код где-то в интернете нашёл. Платы между собой "перемигиваются", в сериал монитор с мастера уходят значения "Х". Но вот продвинуться дальше, переделать код под свои нужды не смог пока...

Код Мастера:

// Wire Master Writer
// by Nicholas Zambetti <<a href="http://www.zambetti.com" rel="nofollow">http://www.zambetti.com</a>>
 
// Demonstrates use of the Wire library
// Writes data to an I2C/TWI slave device
// Refer to the "Wire Slave Receiver" example for use with this
 
// Created 29 March 2006
 
// This example code is in the public domain.
 
 
#include <Wire.h>
 
void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
  pinMode(13, OUTPUT);
}
 
byte x = 0;
byte pin = 0;
void loop()
{
  Wire.beginTransmission(4); // transmit to device #4
  Wire.write("x is ");        // sends five bytes
  Wire.write(x);              // sends one byte  
  Wire.endTransmission();    // stop transmitting
 
  x++;
  delay(1000);
  pin=!pin;
  digitalWrite(13, pin);
  
}
 

 Код Слэйва:

// Wire Slave Receiver
// by Nicholas Zambetti <<a href="http://www.zambetti.com" rel="nofollow">http://www.zambetti.com</a>>
 
// 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>
byte pin=0;
void setup()
{
  pinMode(13, OUTPUT);
  Wire.begin(4);                // join i2c bus with address #4
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}
 
void loop()
{
  digitalWrite(13, pin);
}
 
// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  pin=!pin;
  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
}