я в курсе .. но выглядит эффектно .. типа нафиг нам питание .. нафиг нам вообще всё .. датчик и так будет работать
Ээээ...У меня там Pin2 .Можно повесить на любой втч и на 15 только пропишите в скетче что на 15 (они все по умолчанию не аналоговые а цифровые) #define ONE_WIRE_BUS 15 // датчик на пин 15
Ну или это моя догадка (бывает и такое) не "палёные" ли порты?Мега может нормально фунциклировать с одним двумя тремя и более сожжёнными портами.Есть у меня такая Мега8 читается и пишется через ISP (MISO MOSI SCK ) через RX/TX а через HV PROG ну никак потому что 3 порта спалил.
вот в этой строчке прописаны номера пинов Код (C++): const byte OUT[5] = {13, 12, 11, 3, 2}; // номера выходов отсюда вопрос .. на каком пине датчик не работает? второй пин исключаем потому как ты его уже проверил. для проверки используй микро-скетч который предоставил господин Airbus .. только в его скетче в строчке Код (C++): #define ONE_WIRE_BUS 2 меняй пин 2 на другие для проверки и соответственно втыкай датчик в пин который пропишешь. так ты проверишь работает ли вообще пин или он уже отошёл в мир иной.
я так понял речь об этом Скетче? Код (C++): // Термостат, до пяти датчиков DS18B20. // Автоматическое определение количества датчиков на // шине, установка температуры и хранение в энергонезависимой // памяти на каждый выход. // подробнее // v 0.2 beta #include <EEPROM.h> #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal.h> const byte OUT[5] = {13, 12, 11, 3, 2}; // номера выходов byte pos; byte tempOUTon[5]; // массив с температурой включения выхода float tempSensor[5]; // массив куда читается температура byte qty; // количество градусников на шине OneWire oneWire(15); // A1 вход датчиков 18b20 DallasTemperature ds(&oneWire); LiquidCrystal lcd(8, 9, 4, 5, 6, 7); byte gradus[8] = { 0b00110, 0b01001, 0b01001, 0b00110, 0b00000, 0b00000, 0b00000, 0b00000 }; byte on[8] = { 0b00110, 0b01111, 0b11111, 0b11111, 0b11111, 0b11111, 0b11110, 0b01100 }; void readSet(){ for (byte i = 0; i < qty; i++) tempOUTon[i] = EEPROM.read(i); } void outOff(){ // выключает выходы for (byte i = 0; i < qty; i++) digitalWrite(OUT[i], LOW); } void erorr(){ // останавливает работу программы и сигнализирует ошибку outOff(); // выключаем выходы while(1){ // крутим бесконечный цикл analogWrite(10, 100); delay(500); analogWrite(10, 255); delay(500); } } //// byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 150) return 3; else if (val < 350) return 4; else if (val < 500) return 2; else if (val < 800) return 1; else return 0; } //// void setMenu(byte pos){ // установка температуры outOff(); lcd.clear(); while(1){ // крутим бесконечный цикл byte KEY = key(); // читаем состояние кнопок lcd.setCursor(2, 0); // выводим на экран lcd.print("Out:"); lcd.print(pos+1); lcd.setCursor(9, 0); lcd.print("Pin:"); lcd.print(OUT[pos]); lcd.print(" "); lcd.setCursor(0, 1); lcd.print(" PinON: "); lcd.print(tempOUTon[pos]); lcd.write(1); lcd.print("C <>"); if (KEY == 2) { // если нажата кнопка tempOUTon[pos]--; // изменяем значение if (tempOUTon[pos] > 125) tempOUTon[pos] = 0; EEPROM.write(pos, tempOUTon[pos]); // сохраняем в еепром } else if (KEY == 5){ tempOUTon[pos]++; if (tempOUTon[pos] > 125) tempOUTon[pos] = 0; EEPROM.write(pos, tempOUTon[pos]); } delay(200); }///// }// void getTemp(){ // читаем температуру и заполняем массив ds.requestTemperatures(); for (int i = 0; i < qty; i++) tempSensor[i] = ds.getTempCByIndex(i); } void setup() { Serial.begin(9600); ds.begin(); qty = ds.getDeviceCount(); // количество датчиков на шине if (qty > 5) qty = 5; // if (qty < 5) erorr(); // проверка количества датчиков for (int i = 0; i < qty; i++) pinMode(OUT[i], OUTPUT); for (int i = 0; i < qty; i++) digitalWrite(OUT[i], LOW); lcd.createChar(1, gradus); lcd.createChar(2, on); lcd.begin(16, 2); lcd.clear(); readSet(); // читаем настройки из еепром } void loop() { ///// обработка кнопок if (key() == 1) setMenu(pos); // если нажата селект, уходим в настройки else if (key() == 4 && pos < qty-1) pos++; // крутим позицию else if (key() == 3 && pos != 0) pos--; getTemp(); // читаем температуру с датчиков //// сверяем температуру и управляем выходами for (int i = 0; i < qty; i++) { if (tempSensor[i] < tempOUTon[i]) digitalWrite(OUT[i], HIGH); else digitalWrite(OUT[i], LOW); } /////// вывод инфы на экран lcd.setCursor(0, 0); lcd.print(pos+1); lcd.print(". "); lcd.print(tempSensor[pos], 1); // показываем температуру с датчика lcd.write(1); lcd.print("C "); lcd.setCursor(2, 1); lcd.print(tempOUTon[pos]); // показываем установленную температуру lcd.write(1); lcd.print("C "); lcd.setCursor(11, 0); // рисуем статус выхода for (int i = 0; i < qty; i++){ if (digitalRead(OUT[i])) lcd.write(2); else lcd.print(" "); } lcd.setCursor(11, 1); // рисуем номера выходов for (int i = 0; i < qty; i++) lcd.print(i+1); } Погонял я его немного в паре с LCD шилдом всё прекрасно работает (правда "градусник" у меня один так что сорри) пробовал убрать "минус" с DS18в20 и как только я его убирал выдавало -127
да он самый .. правда там другая версия кода ещё есть .. но суть не в версии кода .. а дать юному падавану шанс самому пощупать контроллер и разобраться с этим кодом .. так сказать волшебный пинок что бы мозги начали варить в сторону "прочитал - потыкал", а не в сторону "прочитал - поныл на форуме что лёлик всё пропало"
Да, уважаемые, пробовал ваш скеч(пробный) и на 15-ом и на 16-ом, ваш пробный работает -думал не будет (так как аналоговые и предполагал что их надо "включить" как цифровые), однако все работает , но стоит желаемый скетч загрузить ни на 2-ом, ни на 3-м, 13-м, ни на 15, ни на 16 не хочет, страннно как то
ну круто чё .. там в коде идёт жёсткая привязка серийных номеров от датчиков что не есть хорошо .. потому что запрос делается по нему .. и если датчика с таким серийником нету на шине то что происходит я фиг знает .. надо колупать библиотеку .. в самом начале поста я скидывал пример работы с этими датчиками через цифровые входа/выхода .. один датчик на один вход/выход без всяких серийных номеров и прочей требухи где точно можно сказать работает тот или иной датчик .. 5 входов/выходов не такая уж и большая потеря для ардуинки .. можно переработать код и втыкать каждый датчик в свой пин на ардуинке .. менять без боязненно что они не определятся их местами по пинам определённым под датчики тут вопрос в другом .. тебе действительно нужен этот термостат??? потому как если использовать этот скетч под версией 0.2.1 то я бы пошёл путём наименьшего сопротивления. т.е. в ардуино айди куда ты вставляешь скетчи есть пример работы с датчиками ds18b20. я бы тупо его залил в контроллер .. открыл монитор и палил бы серийные номера дачиков поочерёдно их втыкая. потом эти серийные номера записал бы в этот странный скетч под номером 0.2.1 и было бы мне счастье .. НО .. я бы парился так постоянно при выходе датчика из строя
загрузил v 0.2 beta - появился градус!!! 25,1С !!! теперь буду делать сравнение с v 2.0.1 beta - интересно в чем разница
Да, сразу заработали два подключенных датчика, спасибо. Чуть позже проверю на пять. А разницу хочу поискать в версиях скетча.
так и сделал, Но в примерах есть Dallas - Tester, он до 9 датчиков проверяет(5 точно-проверено) и адреса тоже. Заработала v 2.0.1 beta. Приношу свои извинения в адрес автора скетча за прошлые свои "подозрения" теперь пойду таймер "примерять"
лучше раздели датчки по пинам .. так не надо смотреть какой серийник у датчика .. если он нагнулся то просто выкинул потухший .. воткнул новый .. и дальше всё прекрасно работает а по такому принципу гирлянды надо ещё будет найти тот самый который вышел из строя среди пяти штук
хорошо бы, но "идейность" не позволяет - нужна экономия пинов, просто в эксплуатации придется записывать адреса датчиков по месту положения на объекте и потом корректировать скетч, но надеюсь не придется, на практике за 9 лет эксплуатации отказал 1 датчик из 11