i2c arduino

sar-bc
Offline
Зарегистрирован: 30.11.2014

Здравствуйте! Пожалуйста подскажите как доделать код не могу разобраться.

Суть вопроса:

Ардуино мастер запрашивает  данные от ардуино слэйв. К ардуино слэйв подключен датчик температуры ds18b20 эти данные и надо передать  мастеру.

Вот код мастер

#include <Wire.h>

#define SLAVE 4

char buf[8];
int led = 13;
String val = "";
int ch = 0;
int inSize=0;
char str[128];

void setup(){
Wire.begin();
Serial.begin(9600);  
 pinMode(led, OUTPUT);  
}



void loop(){
 Wire.requestFrom(SLAVE, 4);
delay(500);



if (Wire.available()) {  //
    while (Wire.available()) {  //
      ch = Wire.read();
      val += char(ch);
      delay(10);
    }//while
    Serial.println(val);
     
    val = "";  //очищаем
  }//Wire.available





}//loop

Код слэйва

#include <Wire.h>
#include <OneWire.h>
OneWire  ds(8);  // on pin 10 (a 4.7K resistor is necessary)
byte addr[8];//переменная для хранения адреса ds18b20
#define SLAVE 4


void setup(){
  Serial.begin(9600);
    Wire.begin(SLAVE);
 Wire.onReceive(vhod);
 Wire.onRequest(ishod);
 pinMode(13, OUTPUT);
 digitalWrite(13, LOW); 
  
}



void loop(){

  
 Serial.println(getTemp()); 
 delay(100);
 
}

//функция для отправки данных
void ishod(){
  
  //Wire.write(getTemp());
  Wire.write("test");
}
  
  //функция для приема данных
void vhod(int howMany){
  
}

//функция температуры
int getTemp(){   // возвращает температуру с датчика
  byte data[12];    // и останавливает программу на секунду
  ds.search(addr);   
  ds.reset_search(); 
  ds.reset();            
  ds.select(addr);        
  ds.write(0x44);      
  delay(1000);   
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);          
  for (int i = 0; i < 9; i++) data[i] = ds.read(); 
  int raw = (data[1] << 8) | data[0]; // Переводим в температуру   
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];  
  return raw / 16.0;
}

Строка 31 слэва не работает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sar-bc пишет:

Строка 31 слэва не работает

И не должна. Она же комментарий. Что по-Вашему она должна делать?

sar-bc
Offline
Зарегистрирован: 30.11.2014

Строку 31 я специально закоментировал потому что она не работает, а вот строка 32 работает. Передает String, а мне надо int getTemp(). Строка 31 должна передавать температуру мастеру.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы, пожалуйста, выложите нормальный скетч. как он должен быть и тогда говорите. что работает, а что нет. А то, "не работает". "специально закомментировал" - это пудрение мозгов.

sar-bc
Offline
Зарегистрирован: 30.11.2014

Код слэйва


sar-bc
Offline
Зарегистрирован: 30.11.2014

код слэва

#include <Wire.h>
#include <OneWire.h>
OneWire  ds(8);  // on pin 10 (a 4.7K resistor is necessary)
byte addr[8];//переменная для хранения адреса ds18b20
#define SLAVE 4


void setup(){
  Serial.begin(9600);
    Wire.begin(SLAVE);
 Wire.onReceive(vhod);
 Wire.onRequest(ishod);
 pinMode(13, OUTPUT);
 digitalWrite(13, LOW); 
  
}



void loop(){

  
 Serial.println(getTemp()); 
 delay(100);
 
}

//функция для отправки данных
void ishod(){
  
Wire.write(getTemp());

}
  
  //функция для приема данных
void vhod(int howMany){
  
}

//функция температуры
int getTemp(){   // возвращает температуру с датчика
  byte data[12];    // и останавливает программу на секунду
  ds.search(addr);   
  ds.reset_search(); 
  ds.reset();            
  ds.select(addr);        
  ds.write(0x44);      
  delay(1000);   
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);          
  for (int i = 0; i < 9; i++) data[i] = ds.read(); 
  int raw = (data[1] << 8) | data[0]; // Переводим в температуру   
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];  
  return raw / 16.0;
}

 

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

sar-bc пишет:

код слэва

#include <Wire.h>
#include <OneWire.h>
OneWire  ds(8);  // on pin 10 (a 4.7K resistor is necessary)
byte addr[8];//переменная для хранения адреса ds18b20
#define SLAVE 4


void setup(){
  Serial.begin(9600);
    Wire.begin(SLAVE);
 Wire.onReceive(vhod);
 Wire.onRequest(ishod);
 pinMode(13, OUTPUT);
 digitalWrite(13, LOW); 
  
}



void loop(){

  
 Serial.println(getTemp()); 
 delay(100);
 
}

//функция для отправки данных
void ishod(){
  
Wire.write(getTemp());

}
  
  //функция для приема данных
void vhod(int howMany){
  
}

//функция температуры
int getTemp(){   // возвращает температуру с датчика
  byte data[12];    // и останавливает программу на секунду
  ds.search(addr);   
  ds.reset_search(); 
  ds.reset();            
  ds.select(addr);        
  ds.write(0x44);      
  delay(1000);   
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);          
  for (int i = 0; i < 9; i++) data[i] = ds.read(); 
  int raw = (data[1] << 8) | data[0]; // Переводим в температуру   
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];  
  return raw / 16.0;
}

getTemp() у вас возвращает Int а в доке на Wire

Syntax
Wire.write(value) 
Parameters
value: a value to send as a single byte

Может в этом проблема?

sar-bc
Offline
Зарегистрирован: 30.11.2014

Скорей всего да. Я не знаю как передать int

pastry777
Offline
Зарегистрирован: 16.01.2014

читайте,я на этом форуме пример выкладывал того что вам надо...причем можно передавать кучу int за раз

http://majordomo.smartliving.ru/forum/viewtopic.php?f=8&t=73&hilit=Power+monitor&start=220

pastry777
Offline
Зарегистрирован: 16.01.2014

код 100% рабочий и тщательно прокоментирован,для примера я передавал там статические int,а там кто что хочет то и будет передавать...датчик к слейву сами прикрутите уже надеюсь..

pastry777
Offline
Зарегистрирован: 16.01.2014

Andrey12,именно поэтому я в своем коде сначала собираю строку на стороне слейва,передаю ее,а на мастере снова разбираю на значения=)кажется так проще,чем с побайтовой передачей

sar-bc
Offline
Зарегистрирован: 30.11.2014

Спасибо! Буду экспериментировать.