Здравствуйте, товарищи коты! Очень много вопросов возникает, потому завёл отдельную тему. Собираю в общем электроградусник на Меге8, DS18B20 b 2-х семисегментных индикаторах. Семисегментники ожили, показывают адекватно число в обоих разрядах, датчик откликается, даже данные выдает и на температуру реагирует. )) НО - врёт: При комнатной температуре индикатор показывает "03", если коэфициент "0,0625" подогнать и сделать к примеру "0,625", показывает "32", если подержаться за датчик рукой постепенно поднимается до "42", то есть на температуру действительно реагирует. Ещё что смущает: разряды то поочерёдно, то одновременно показывают случайные числа на интервал около секунды, я так полагаю что с датчика неверные числа приходят. Помогите пожалуйста, товарищи коты! Текст программы ниже.
//Выводим значение температуры на 2 семисегментных индикатора ISR(SIG_OVERFLOW0) { if (count==2) count=0 ; switch(count) { case 0:PORTB = digit2;PORTB |= (0<<5);PORTB |= (1<<6);break; case 1:PORTB = digit1;PORTB |= (1<<5);PORTB |= (0<<6);break; } count++ ; }
//функция определяет есть ли устройство на шине unsigned char w1_find() { unsigned char device; W1_DDR |= 1<<W1_BIT; _delay_us(485); W1_DDR &= ~(1<<W1_BIT); _delay_us(65);
W1_DDR |= 1<<W1_BIT; _delay_us(65); W1_DDR &= ~(1<<W1_BIT); _delay_us(5); } } } //функция читает один байт с устройства 1-wire unsigned char w1_receive_byte() { unsigned char data; for(unsigned char i = 0; i < 8; i++) { W1_DDR |= 1<<W1_BIT; _delay_us(2); W1_DDR &= ~(1<<W1_BIT) ; _delay_us(7);
if((W1_PIN & (1<<W1_BIT)) == 0x00) data &= ~(1<<i); else data |= 1<<i; _delay_us(50); } return data; } //функция преобразует полученные с датчика 18b20 данные в температуру int temp_18b20() { unsigned char data[2]; int temp = 0; if(w1_find()==1)//если есть устройство на шине { w1_sendcmd(0xcc);//пропустить ROM код, мы знаем, что у нас одно устройство или передаем всем w1_sendcmd(0x44);//преобразовать температуру _delay_ms(750);//преобразование в 12 битном режиме занимает 750ms w1_find();//снова посылаем Presence и Reset w1_sendcmd(0xcc); w1_sendcmd(0xbe);//передать байты ведущему(у 18b20 в первых двух содержится температура) data[0] = w1_receive_byte();//читаем два байта с температурой data[1] = w1_receive_byte(); //загоняем в двух байтную переменную temp = data[1]; temp = temp<<8; temp |= data[0]; //переводим в градусы temp *= 0.625;//0.0625 градуса на единицу данных } //возвращаем температуру return temp; }
я так полагаю что с датчика неверные числа приходят
В тыщапицотый раз сообщаю: датчики либо работают либо не работают, СОВСЕМ. Врать лично Вам им нет никакого резона. Проверяй алгоритм. Читай тыщапицот тем в которых все уже разжовано, все ошибки описаны. ЗЫ: если CRC не проверять, то что к датчику придираться....
_________________ — Не говорите мне что делать и я не скажу куда Вам идти...
давайте я погадаю на кофейной гуще - у ТС датчик не 18b20 , а 1820 или 18S20. в этом случае при комнатной 18 градусов с учетом младшего разряда в регистре будет 36. 36 умножаем на 0.0625 = 2.25 градуса 36 умножаем на 0.625 = 22 градуса
В задаче спрашивается - какая температура дома у ТС, если показывает 32 ? Около 25 - буржуй, однако... У меня сейчас 16...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
давайте я погадаю на кофейной гуще - у ТС датчик не 18b20 , а 1820 или 18S20. в этом случае при комнатной 18 градусов с учетом младшего разряда в регистре будет 36. 36 умножаем на 0.0625 = 2.25 градуса 36 умножаем на 0.625 = 22 градуса
В задаче спрашивается - какая температура дома у ТС, если показывает 32 ? Около 25 - буржуй, однако... У меня сейчас 16...
минвату под пол, окна оклеить, кол-во зубов в батареи удвоить и вы тоже буржуй
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Сколько людей пишут здесь неправду, утверждая что эктрасенов здесь нет... а это что по вашему, за тыщапицот километров увидели; какой датчик, температуру в комнате и из чего сделана комната, и что свет в коридоре до сих пор включен...
Заголовок сообщения: Re: В тыщапицотый раз про DS18B20.
Добавлено: Вс фев 05, 2012 09:21:56
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
Dako писал(а):
На момент измерения температуры, на улице было -45, спасибо ТЭЦ, г Новосибирск ))
че-то как-то не верится... даже по брехливым (занижающим) интернет-прогнозам такой температуры в районе Новосибирска не было и нет сейчас... 2-го февраля было -22-24 всего-то...
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Заголовок сообщения: Re: В тыщапицотый раз про DS18B20.
Добавлено: Вс фев 05, 2012 18:31:55
Поставщик валерьянки для Кота
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
Dako писал(а):
Скажите, а для DS1820 аналогично считается?
может, пора, наконец, документацию на датчики почитать? даже ведь на русском полно статей - почитайте, не тратьте зря свое время и время тех, кто тут пытается вам помочь.
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Dako А на счёт того, что у вас датчик белеберду выдает..(навреное, то 55, то 85) вы прерывания отключите, пока датчик опрашиваете. И не надо его дергать чаще чем 1 раз в секунду! Он у нас уже почетный пенсионер, работать так быстро не умеет и не хочет
Не, числа каждый раз разные, в среднем раз в 30 сек выкидывает неправильную температуру, опрашивается раз в 750 мс. Щас усиленно пытаюсь разобраться с алгоритмом расчёта CRC. Пока безуспешно ((
Что там разбираться? Есть ведь готовые библиотеки - бери и пользуйся.
----- по поводу датчиков... У меня 2 датчика на 10-метровом проводе, при ошибке CRC выводится ошибка. Не было ни разу. Сделал затычку - чтобы при первой же ошибке программа зажгла светик и не тушила. Прошла неделя - он не горит.
Пытался вкорячить в код, алгоритм товарища md5sum, то есть в выражение crc=_crc_ibutton_update(crc,bytes[i]); вместо bytes[i] по очереди подсовывал все 8 байт данных, по выходу из цикла сравнивал crc с 9-м полученым байтом. Баг немного видоизменился: стал появляться чаще, но теперь не случайные цифры, а нули только. Пока так....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения