i2c arduino
- Войдите на сайт для отправки комментариев
Вс, 21/02/2016 - 23:59
Здравствуйте! Пожалуйста подскажите как доделать код не могу разобраться.
Суть вопроса:
Ардуино мастер запрашивает данные от ардуино слэйв. К ардуино слэйв подключен датчик температуры 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 слэва не работает
Строка 31 слэва не работает
И не должна. Она же комментарий. Что по-Вашему она должна делать?
Строку 31 я специально закоментировал потому что она не работает, а вот строка 32 работает. Передает String, а мне надо int getTemp(). Строка 31 должна передавать температуру мастеру.
Вы, пожалуйста, выложите нормальный скетч. как он должен быть и тогда говорите. что работает, а что нет. А то, "не работает". "специально закомментировал" - это пудрение мозгов.
Код слэйва
код слэва
#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; }код слэва
#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
Может в этом проблема?
Скорей всего да. Я не знаю как передать int
читайте,я на этом форуме пример выкладывал того что вам надо...причем можно передавать кучу int за раз
http://majordomo.smartliving.ru/forum/viewtopic.php?f=8&t=73&hilit=Power+monitor&start=220
код 100% рабочий и тщательно прокоментирован,для примера я передавал там статические int,а там кто что хочет то и будет передавать...датчик к слейву сами прикрутите уже надеюсь..
Andrey12,именно поэтому я в своем коде сначала собираю строку на стороне слейва,передаю ее,а на мастере снова разбираю на значения=)кажется так проще,чем с побайтовой передачей
Спасибо! Буду экспериментировать.