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 должна передавать температуру мастеру.
Вы, пожалуйста, выложите нормальный скетч. как он должен быть и тогда говорите. что работает, а что нет. А то, "не работает". "специально закомментировал" - это пудрение мозгов.
Код слэйва
код слэва
код слэва
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,именно поэтому я в своем коде сначала собираю строку на стороне слейва,передаю ее,а на мастере снова разбираю на значения=)кажется так проще,чем с побайтовой передачей
Спасибо! Буду экспериментировать.