Freeduino 2009 с Atmega328+Ethernet Shield v2+DS18B20(датчики) 2 шт паралельно на одном пине
- Войдите на сайт для отправки комментариев
Всем привет!
Решил сделать своими руками ip-термометр.
Погуглил немного и прикупил микромодуль+Ethernet модуль и соответсвенно сами термодатчики.
Проключил 1 датчик на 7 пин микромодуля сверху через Ethernet модуль, + соответсвенно подключил на 5В, - на выходе "Gnd"...
Физика проключена.
установил драйвер, подключил через квадпатный кабель Usb к компу и патч-корд в сетку к Ethernet-модулю.
в сете развёрнут web-сервер Apach на компе с адресом 192.168.0.1 255.255.255.0, ну на этом же компе и DHCP развёрнут тоже.
вообщем цель такова-получить на 192.168.0.1 данные от датчика и соответсвенно потом уже на серваке с этими данными работать)
собсвенно вроде бы как не очень сложная задача с одной стороноы и я написал одну программу, но для одного датчика..программу в студию?
-----------------------------------------------------------------------------
#include <SPI.h> #include <Ethernet.h> #include <OneWire.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xE0 }; IPAddress server(192,168,0,1); // ip web_server EthernetClient client; OneWire ds(7); void setup() { // start the serial library: Serial.begin(9600); // start the Ethernet connection: if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); // no point in carrying on, so do nothing forevermore: for(;;) ; } // give the Ethernet shield a second to initialize: delay(1000); Serial.println("connecting..."); } void loop() { byte i; byte present = 0; byte data[12]; byte addr[8]; if (!ds.search(addr)){ ds.reset_search(); return; } for (i = 0;i<8;i++){ Serial.print(" "); } if (OneWire::crc8( addr, 7) != addr[7]){ Serial.print("CRC is not valid! \n"); return; } if (addr[0] == 0x28) { } ds.reset(); ds.select(addr); ds.write(0x44,1); present = ds.reset(); ds.select(addr); ds.write(0xBE); for (i = 0;i<9;i++){ data[i] = ds.read(); } int HighB,LowB,TRead, Tc_100, Holod; int Celch, Drobch; LowB = data[0]; HighB = data[1]; TRead = (HighB << 8) + LowB; Holod = TRead & 0x8000; if (Holod){ TRead =(TRead ^ 0xffff)*1; } Tc_100 = (6*TRead)+TRead/4; Celch = Tc_100/100; Drobch = Tc_100 % 100; delay(1000); Serial.print("TEMPERATURA = "); if (Holod){ Serial.print("-"); } client.connect(server, 8888); char bufer[32]; memset(bufer,0,32); sprintf(bufer,"%i",Tc_100); client.println(bufer); client.println(); client.stop(); Serial.print(Celch); Serial.print("."); if (Drobch < 10){ Serial.print("0"); } Serial.print(Drobch); Serial.println(); if (client.available()) { char c = client.read(); Serial.print(c); } }
--------------------------------------------------------------------
Программа работает на ура)это уже меня порадовало)
но на сервак я отправляю просто всем числом-без выделения целой и дробной части(это уже так-для интереса сделал на устройстве:-) )
но сами понимаете одинм датчиком не ограничешься...
слооответсвенно хотелось бы работать с несколькими датчиками..причём допустим на 7 пине шины повесить паралельно 2 датчика и на 6 пине также повесить паралельно подключаемые датчики..
Да ещё один нюанс забыл написать между 2 и "+" ножек датчиков нужно сопротивление 4.7 кОм резистор-без него ничего не будет работать...
вообщм подключил я дополнительно к вышеуказанной схеме датчик с резистором паралельно к существуещиму-т.е. у меня на 7 пине навешены 2 датчика DS18B20.
Да и датчики использую только DS18B20-по причине, что других у меня просто нет)
собственно и вопрос-не могу подправить прогу вышеуказанную,чтобы зарабатала схема вышеизоженная с 2-мя датчиками((
кто знает-может подправите?я уже несколько вараинтов пробовал, что-то не получается((датчики показывают, что 0 градусов, а реальео градусов 24-25 по цельсию...но я думаю это не неправильное вычисление температуры или неисправность датчиков(они новые), а просто видимо программу на 2 датчика я подпривил не правильно и соответсвенно неправильно обращаюсь к датчикам, чтобы получить от них данные.
Заранее благодарю за практическую помощь!
ну для начала я бы посоветовал вам использовать родную библиотеку этих датчиков
http://milesburton.com/Main_Page?title=Dallas_Temperature_Control_Library
станет чуть чуть удобней...
а дальше начинается веселуха, в плане что я изначально думал что такие да 1wire же, давай буду вешать датчики горстями... но как оказалось выяснить какой где датчик возможно, но только в плане если это вообще разные датчики, но когда датчики одинаковые, и их несколько, то идентифицировать их в сети, какой где представляется не простой задачей... подключая по одному и сохраняя их адреса. Там в родной библиотеки есть образец кода для нескольких датчиков на одной линии... но опять же в коментах сноска о том что адреса нужно выяснять в ручную :)
да и в принципе не думаю что у вас датчиков больше чем свободных пинов.. вешайте на каждый по одному и будете точно знать где какой. :)
сопротивление можно запаять так как у меня на фото.. на каждый датчик персонально. Либо можно на выходе с дуинки запаять одно на всех...
Спасибо за совет!
Но дело в том, что у меня проблема в написании этой вот программы ....
как будет выглядеть (на основе вышеизложенной программы,кот я написал))программа в случае, если к примеру на 7 пине будет 1 датчик DS18B20, на 6 пине-1 датчик DS18B20, и на 5 пине-1 датчик DS18B20 и допустим в паралель как вы говорите нужен другой датчик-допустим возьмём датчик DS18S20.
Я впервые это устройство взял-поэтому только разбираюсь, но на примерах просто намного бытсрее понимаю и синтаксис и вообще алгоритм работы.
Заранее благодарю!
выглядеть будет примерно так, все так сказать просто
OneWire ds(7);
OneWire ds1(5);
OneWire ds2(6);
ну и так далее
вот так будет выглядить программа, если посадить на 7,6, и 5 пины датчики по одному?если да, то для 5-го же пина-там посадить нужно 2 разных датчика-для 5-го в данном случае тогда как нужно обращаться к датчикам,если они на одном пине, но разные по модели?
у вас что ограниченое количество пинов? обращатся все так же идентифицируйте их по модели датчика.. они отзываются вот и различайте их... читайте спецификацию датчиков. там все раписано по пакету который они присылают.
я попробовал просто посадить 2 датчкиа на 7 и 5 пин, вот такая программа:
зависает вот здесь всё:
и соответсвенно на серваке я вообще ничего не получаю...(((
попробовал по аналогии для 5 пина так же как для 7-го использовать сл строки:
Но на серваке получаю вот такие строки:
т.е. первый датчик работает, а второй не измеряет(((что не так в коде?всё же по аналогии...не могу разобраться(
попробоваал и так тоже(((результат тот же((
дык. CRC вычисляется всегда одинаково. Зачем вы ищете ее в addr[5] когда она в addr[7] для всех датчиков.
я так пробовал-см выше 2-ой вариант проги...вс1 равно по 0 считает 2 датчик((почему?((пробовал менять местами датчики-по 7-ому пину идёт температура, а по 5-ому нет((0 показывает
жестко насильно, как из под топора, без чтения типа создал переменных для обеих датчиков... работает. проверяйте свой код.
И вопрос к знатокам.
Есть код в лупе
Куда ретурнится собака? На setup?