вопрос по DS18B20


Разбираюсь с этими датчиками. С одного датчика считать данные проблем нет. А вот как работать с двумя и более воткнутыми в один порт понять не могу.

По идее же надо сначала определить их ИД а уже потом по ИД с ними работать. Но не могу Duino заставить искать все ИД датчиков. Она находит один и успокаивается.


12 комментариев на «“вопрос по DS18B20”»

    • проверка правильности переданных данных 🙂

    • так и если этот тест не проходит то в чем может быть причина. Когда убираю этот тест все прекрасно работает

    • хм… получается — либо CRC неправильно считается, либо данные идут с помехами.

    • CRC неправильно это как? 🙂
      Помехи. Пока работает — они в каком-нибудь малозначащем разряде.

    • Все равно не понимаю. Датчики воткнуты в монтажку и к Ардуино проводок ну сантимов 10. Откуда помехи то?

    • 1. контакт в монтажке
      2. контакт в проводке к ардуино.
      3. попробуй по одному датчику отцеплять — может сам датчик глючит.

  1. Почему успокаивается?
    По идее должно работать так (см. комментарии):

    #include <OneWire.h>
    
    OneWire  ds(1wirePin);
    
    void setup(void)  {
      Serial.begin(9600);
    }
    
    void loop(void) {
      byte addr[8];
      
      if (!ds.search(addr)) { // поиск нового датчика
          ds.reset_search(); // если не нашли, сбрасываем поиск в начало
          return; // и возвращаемся в самое начало главного цикла void loop(void)
      }
      
      // Часть кода, которая ниже, выполняется только если
      // найден новый датчик, с которым ещё не работали в
      // главном цикле до сброса поиска
    
      if (OneWire::crc8( addr, 7) != addr[7]) { // Проверка CRC
          Serial.print("CRC is not valid!\n");
          return; // Если не пройдена, то в начало главного цикла и продолжаем поиск других датчиков
      }
      
      if (addr[0] != 0x28) {	// Проверка того, что найденное устройство - температурный датчик DS18B20
          Serial.print("Device is not a DS18B20 family device.\n");
          return; // Если не он, то опять в начало главного цикла на продолжение поиска
      }
      
      ds.reset();
      ds.select(addr);
      // И вот после этого селекта делаем с очередным найденным датчиком что хотим
      // После возврата в начало цикла поиск будет продолжен, пока не сработает первое условие и не выполнится ds.reset_search().
    }
    • Единственное подозрение на ds.reset(); — я не особо понимаю зачем там сброс шины происходит. Попробуй убрать.

    • Работает. Делаю работу на ошибками над своим кодом.

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение