oneWire поиск присутствия DS18b20, DS2401 по MAC-адресу
- Войдите на сайт для отправки комментариев
Пт, 06/12/2013 - 13:06
Здравствуйте,
помогите, пожалуйста, написать(дописать) строчку кода, которая возвращает 1, если устройство с МАС-адресом присутствует(найдено, подключено и т.д.) в сеть 1-wire.
#if defined(ARDUINO) && ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif #include <SPI.h> #include <Ethernet.h> #include <Wire.h> #include <DS1307.h> byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; byte ip[] = {192, 168, 0, 147}; byte subnet[] = {255, 255, 255, 0}; byte gateway[] = {192, 168, 0, 100}; byte mydns[] = {192, 168, 0, 100}; byte smtp[] = {94, 100, 177, 1}; //EthernetServer server(80); EthernetClient client; #include <OneWire.h> //1-WIRE byte i; //1-WIRE byte present = 0; //1-WIRE byte type_s; //1-WIRE byte data[12]; //1-WIRE byte addr[8]; //1-WIRE float celsius; //1-WIRE const int relePin = 4; const int relePin2 = 5; const int dat220 = 3; int dat220State = 0; // variable for reading the gerkon status int fignya = 0; byte address_1[] = {0x28, 0xBA, 0x81, 0x9A, 0x04, 0x00, 0x00, 0xB4}; //1-WIRE термометр №1 28:BA:81:9A:4:0:0:B4: byte address_2[] = {0x01, 0x5D, 0x30, 0x45, 0x16, 0x00, 0x00, 0x27}; //1-WIRE геркон мет дверь 1:5D:30:45:16:0:0:27: OneWire ds (2); // все 1-WIRE устройства на pin 2 byte done[8]; //1-WIRE void setup() { Ethernet.begin(mac, ip, mydns, gateway, subnet); Serial.begin(9600); delay(1000); pinMode(relePin, OUTPUT); pinMode(relePin2, OUTPUT); pinMode(dat220, INPUT); } void reeds1WARE (void) { if (ds.search (addr)!=1) { ds.reset_search (); delay (250); for(byte i = 0; i < 8; i++) addr[i] = 0; return; } ds.reset (); ds.select (addr); //***расскоментировать, чтобы показывал MAC-адреса устройств вместе с температурой*** // Serial.print("Addr:"); // for(byte i = 0; i < 8; i++) //{ // Serial.print("0x"); // if(addr[i] < 0x10) Serial.print("0"); // Serial.print(addr[i], HEX); // if(i == 7) Serial.println(); // else Serial.print(", "); //} ds.write (0x44,1); // start conversion, with parasite power on at the end delay (1000); // maybe 750ms is enough, maybe not // we might do a ds.depower () here, but the reset will take care of it. present = ds.reset (); ds.select (addr); ds.write (0xBE); // Read Scratchpad for (i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read (); } // convert the data to actual temperature unsigned int raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; // 9 bit resolution default if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms } celsius = (float)raw / 16.0; } void(* resetFunc) (void) = 0; // Reset MC function void loop() { if ((ds.search (addr)) == address_2) { Serial.println("ok"); } else { digitalWrite(relePin, HIGH); } }
а именно 107 строчку
Вам же уже давали ссылку на то как это делается.
http://arduino.ru/forum/programmirovanie/3-datchika-ds18b20arduino#comment-40925
Вам же уже давали ссылку на то как это делается.
http://arduino.ru/forum/programmirovanie/3-datchika-ds18b20arduino#comment-40925
спасибо, "ok" пишется в serial НО и РЕЛЕ срабатывает ТОЖЕ 8(. странно...
Ничего странного, каждый неверный адрес включает реле ,а верный выводит "ок". И не НО ,так как что у вас в голове известно только вам.
ситуация в том, что есть 2 датчика и оба они подключены. Все-таки спрашивал я о возвращении 1 если найден address_2. Точнее - другие адреса он искать вообще не должен. возможно? поиск по шаблону и вывод 1 или 0.
Все-таки спрашивал я о возвращении 1 если найден address_2.
Конечно возможно. Добавьте еще одну переменную, которая будет себя вести так как вы описали - если найден адрес, то устанавливаете эту переменную в единицу, а после того как поиск окончен проверяете эту переменную и если она равна нулю включаете реле.
Ничего странного, каждый неверный адрес включает реле ,а верный выводит "ок". И не НО ,так как что у вас в голове известно только вам.
можно, конечно и так как вы подсказали, но геркон работает на размыкание(про работающие на замыкание не слышал), поэтому я воспользовался "else". Если использовать только if, то все конечно работает. Но где найти геркон на замыкание? 8) ...замкнутый круг. Можно инвертировать логику на "если отсутсвует address_2"?
спасибо вам. все теперь понятно.
...но геркон работает на размыкание(про работающие на замыкание не слышал)...
Во первых геркон, лежащий на столе, разомкнут.
А ещё есть трёхконтактные, перекидываюшиеся....
http://www.alibaba.com/trade/search?fsb=y&IndexArea=product_en&CatId=&Se...
а вот как прикрутить логику из примера работы с кнопками из этого примера:
сделал как ниже - горит постоянно:
Поиск датчика никак не связан с кнопками.
спасибо большое. это нереальная задача для меня, потому-что тот код, который вы дали вообще невозможно додумать новичку.
с DS2401 все нормально стало, но теперь я не могу "вытащить" температуру с address_1 (ds18b20), т .к. функция
void
reeds1WARE (
void
) не хочет в loop работать с вашим кодом. либо то либо другое. как быть?
рабочий код:
не рабочий код:
после запуска не рабочего кода температуту он покажет ЛИШЬ ОДИН раз до перезагрузки контроллера, и count в serial все время увеличивается