где может быть проблема в датчике или коде? ds18b20
- Войдите на сайт для отправки комментариев
Ребята, подскажите почему при подключении 2х датчиков DS18B20, один из них ведет себя странно? Он показывает температуру с шагом 0,5 градусов. Со вторым все в порядке.
#define TEMP_PIN 2 //пин D2 для DS18B20 //================================== Температурный датчик OneWire ds(TEMP_PIN); //Создаем объект для работы с термометром float temp1, temp2; unsigned long lastUpdateTime = 0; // Переменная для хранения времени последнего считывания с датчика const int TEMP_UPDATE_TIME = 2000; // Определяем периодичность проверок byte addr1[8]={0x28,0x2A,0x94,0x5E,0x32,0x14,0x01,0x1A}; byte addr2[8]={0x28,0x01,0xBC,0xBC,0x13,0x19,0x01,0x6A}; void setup() { Serial.begin(9600); pinMode(TEMP_PIN, INPUT); // устанавливает режим работы - вход } //================================== Считывание температуры ds18b20 int dTemperature2(){ ds.reset();// сброс шины ds.write(0xCC);// обращение ко всем датчикам ds.write(0x44);// начать преобразование (без паразитного питания) if ((abs(millis() - lastUpdateTime)) > TEMP_UPDATE_TIME) { lastUpdateTime = millis(); ds.reset(); ds.select(addr1); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp1 = ds.read() | (ds.read()<<8); //прочитаны 2 байта ds.reset(); ds.select(addr2); ds.write(0xBE); // Read Scratchpad (чтение регистров) temp2 = ds.read() | (ds.read()<<8); //прочитаны 2 байта } } void loop() { dTemperature2(); Serial.print(temp1/16.00); Serial.print(" "); Serial.println(temp2/16.00); }
Это именно тот код, который выдавал в монитор ту печать?
Давайте Вы запустите его ещё раз, только
1. В строку №45 вставьте Serial.prinln("Read it");
2. В мониторе порта включите временные метки;
3. Содержимое монитора порта выкладывайте текстом
4. Не забудьте также выложить актуальный (после п.1) код - (нужно чтобы мы видели код и его печать в монитор, а не догадывались что и куда Вы вставили)
датчику наверное кирдык
Да это именно тот код который я запустил.
Я delay(2000) еще в loop добавил.
Я delay(2000) еще в loop добавил.
Блин, Вас кто-то просил? У Вас ошибка в loop, я хотел в этом убедиться и показать Вам, а своим делеем Вы её замаскировали.
Кроме того, я просил Вас добавить ещё одну печать (п. 1). Вы этого не сделали.Виноват. Заметил, что сделали. Это моя вина, я ошибся. Эта печать нужна в строке №40, проститеВам нужна помощь? Так делайте что говорят! Давайте ещё раз, только точно, как я написал.
Да конечно нужна помощь.
[spoiler]
Вот и смотрите на свою печать. Вы видите сколько раз она печатает "между" реальными измерениями? Вы и раньше это видели, потому и поставили задержку. Только задержка эта маскирует проблему, а не решает.
Проблема же в том, что у Вас неверно написана логика. Смотрите на свой loop. Он тупо в цикле вызывает detectTemperature2, печатает и снова вызывает detectTemperature2, и так постоянно. Т.е. detectTemperature2 вызывается (судя по Вашей печати) каждые 40 мс.
И что же Вы делаете каждые 40 мс? Вы делаете reset и приказываете всем датчикам начать преобразование (строки №№ 26-28). Через 40 мс Вы снова делаете reset и приказываете всем датчикам начать преобразование, потом ещё и ещё. Потом, когда сработает условие в строке №29 Вы кидаетесь читать значение, хотя начать преобразование приказали только что! Получается, что вместо того, чтобы начать преобразование и спокойно ждать (не дёргая датчик), Вы дёргаете его каждые 40 мс, приказывая отресетится начать преобразование заново. Удивительно, что он у Вас хоть что-то показывает.
Эту логику надо переписывать. Так оно работать не должно и не будет. Вы должны запустить преобразование, выждать интервал и только после этого читать датчик. А не дергать его каждые 40мс приказами "ресет" - "начинай по новой".
Я понятно написал?
С температурами связано несколько параметров - собственно само значение t, адрес датчика этой t, название этой t. Когда датчиков много, удобнее работать со структурами. Ну и между опросом и чтением, само собой, паузу минимум в секунду делать. Также важно проверять контрольную сумму от датчиков, а то частенько пролетают "лютые" значения.
Возможно, датчик стоял уже где- нибудь, и у него в eeprom записано, с каким разрешением считать температуру...