DS18B20

Тема в разделе "Arduino & Shields", создана пользователем Perun61, 15 ноя 2012.

  1. Onkel

    Onkel Гуру

    это не баг это фича - паразитное питание. При этом они меряют реже, копят энергию от шины data.
     
  2. noevile

    noevile Гик

    я в курсе .. но выглядит эффектно .. типа нафиг нам питание .. нафиг нам вообще всё .. датчик и так будет работать :D:D:D:D
     
  3. Chuk

    Chuk Нерд

    а вот и ни как, это в том скетче работает, а здесь ни как
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Ээээ...У меня там Pin2 .Можно повесить на любой втч и на 15 только пропишите в скетче что на 15 (они все по умолчанию не аналоговые а цифровые) #define ONE_WIRE_BUS 15 // датчик на пин 15
     
  5. Airbus

    Airbus Радиохулиган Модератор

    Ну или это моя догадка (бывает и такое)
    не "палёные" ли порты?Мега может нормально фунциклировать с одним двумя тремя и более сожжёнными портами.Есть у меня такая Мега8 читается и пишется через ISP (MISO MOSI SCK ) через RX/TX а через HV PROG ну никак потому что 3 порта спалил.
     
  6. noevile

    noevile Гик

    вот в этой строчке прописаны номера пинов
    Код (C++):
    const byte OUT[5] = {13, 12, 11, 3, 2}; // номера выходов
    отсюда вопрос .. на каком пине датчик не работает? второй пин исключаем потому как ты его уже проверил. для проверки используй микро-скетч который предоставил господин Airbus .. только в его скетче в строчке
    Код (C++):
    #define ONE_WIRE_BUS 2
    меняй пин 2 на другие для проверки и соответственно втыкай датчик в пин который пропишешь. так ты проверишь работает ли вообще пин или он уже отошёл в мир иной.
     
  7. Airbus

    Airbus Радиохулиган Модератор

    я так понял речь об этом Скетче?
    Код (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
     
  8. noevile

    noevile Гик

    да он самый .. правда там другая версия кода ещё есть .. но суть не в версии кода .. а дать юному падавану шанс самому пощупать контроллер и разобраться с этим кодом .. так сказать волшебный пинок что бы мозги начали варить в сторону "прочитал - потыкал", а не в сторону "прочитал - поныл на форуме что лёлик всё пропало"
     
  9. Chuk

    Chuk Нерд

    Да, уважаемые, пробовал ваш скеч(пробный) и на 15-ом и на 16-ом, ваш пробный работает -думал не будет (так как аналоговые и предполагал что их надо "включить" как цифровые), однако все работает , но стоит желаемый скетч загрузить ни на 2-ом, ни на 3-м, 13-м, ни на 15, ни на 16 не хочет, страннно как то
     
    Последнее редактирование: 26 фев 2016
  10. noevile

    noevile Гик

    какую версию скетча используешь?
    v 0.2 beta или v 0.2.1 beta ?
     
  11. Chuk

    Chuk Нерд

  12. Chuk

    Chuk Нерд

    сверять не стал, пробую v0.2.1 beta
     
  13. noevile

    noevile Гик

    ну круто чё .. там в коде идёт жёсткая привязка серийных номеров от датчиков что не есть хорошо .. потому что запрос делается по нему .. и если датчика с таким серийником нету на шине то что происходит я фиг знает .. надо колупать библиотеку .. в самом начале поста я скидывал пример работы с этими датчиками через цифровые входа/выхода .. один датчик на один вход/выход без всяких серийных номеров и прочей требухи где точно можно сказать работает тот или иной датчик .. 5 входов/выходов не такая уж и большая потеря для ардуинки .. можно переработать код и втыкать каждый датчик в свой пин на ардуинке .. менять без боязненно что они не определятся их местами по пинам определённым под датчики

    тут вопрос в другом .. тебе действительно нужен этот термостат???

    потому как если использовать этот скетч под версией 0.2.1 то я бы пошёл путём наименьшего сопротивления. т.е. в ардуино айди куда ты вставляешь скетчи есть пример работы с датчиками ds18b20. я бы тупо его залил в контроллер .. открыл монитор и палил бы серийные номера дачиков поочерёдно их втыкая. потом эти серийные номера записал бы в этот странный скетч под номером 0.2.1 и было бы мне счастье .. НО .. я бы парился так постоянно при выходе датчика из строя
     
    Chuk нравится это.
  14. Chuk

    Chuk Нерд

    загрузил v 0.2 beta - появился градус!!! 25,1С !!!

    теперь буду делать сравнение с v 2.0.1 beta - интересно в чем разница
     
  15. noevile

    noevile Гик

    разница в том что у тебя должны заработать все датчики подключенные к 15 пину
     
  16. Chuk

    Chuk Нерд

    Да, сразу заработали два подключенных датчика, спасибо. Чуть позже проверю на пять.
    А разницу хочу поискать в версиях скетча.
     
  17. Chuk

    Chuk Нерд

    так и сделал, Но в примерах есть Dallas - Tester, он до 9 датчиков проверяет(5 точно-проверено) и адреса тоже.
    Заработала v 2.0.1 beta.
    Приношу свои извинения в адрес автора скетча за прошлые свои "подозрения" ;)

    теперь пойду таймер "примерять":)
     
  18. noevile

    noevile Гик

    лучше раздели датчки по пинам .. так не надо смотреть какой серийник у датчика .. если он нагнулся то просто выкинул потухший .. воткнул новый .. и дальше всё прекрасно работает

    а по такому принципу гирлянды надо ещё будет найти тот самый который вышел из строя среди пяти штук
     
  19. Chuk

    Chuk Нерд

    хорошо бы, но "идейность":confused: не позволяет - нужна экономия пинов,
    просто в эксплуатации придется записывать адреса датчиков по месту положения на объекте и потом корректировать скетч, но надеюсь не придется, на практике за 9 лет эксплуатации отказал 1 датчик из 11
     
  20. noevile

    noevile Гик

    у трындуино УНО 13 цифровых входов/выходов .. 5 под датчики .. 5 под реле .. в запасе ещё 3 пина