В данной статье пойдет речь о том, как подключить датчик температуры DS18B20 к ATmega8 и отображать данные на ЖКИ-дисплее 16×1 на базе HD44780. Будут приведены три примеры программ работы с датчиком температуры, а именно: самый простой — подключение одного DS18B20 к ATmega8; подключение нескольких DS18B20 к ATmega8 на разные выводы микроконтроллера; самый сложный — подключение нескольких датчиков температуры DS18B20 к ATmega8 на одну шину. Для проверки работоспособности программ и схем был использован эмулятор Proteus 7 (ISIS 7 Professional). Код программ (проекты в Atmel Studio 7 целиком) вы сможете скачать по ссылке в конце статьи. После оптимизации кода вместо ATmega8 можно использовать более простой микроконтроллер ATtiny2313.
OneWire библиотека
config.h
#ifndef CONFIG_H_ #define CONFIG_H_ #define F_CPU 8000000UL #define ONE_WIRE_PORT PORTB #define ONE_WIRE_DDR DDRB #define ONE_WIRE_PIN PINB #endif /* CONFIG_H_ */
OneWire.h
#ifndef ONEWIRE_H_ #define ONEWIRE_H_ #define CMD_CONVERTTEMP 0x44 #define CMD_RSCRATCHPAD 0xbe #define CMD_WSCRATCHPAD 0x4e #define CMD_CPYSCRATCHPAD 0x48 #define CMD_RECEEPROM 0xb8 #define CMD_RPWRSUPPLY 0xb4 #define CMD_SEARCHROM 0xf0 #define CMD_READROM 0x33 #define CMD_MATCHROM 0x55 #define CMD_SKIPROM 0xcc #define CMD_ALARMSEARCH 0xec void oneWireInit(uint8_t); void writeBit(uint8_t); void writeByte(uint8_t); void setDevice(uint64_t); void searchRom(uint64_t*, uint8_t&); void skipRom(void); uint8_t readByte(void); uint8_t readBit(void); uint8_t reset(void); uint8_t crcCheck(uint64_t, uint8_t); uint64_t readRoom(void); uint64_t searchNextAddress(uint64_t, uint8_t&); extern uint8_t ONE_WIRE_DQ; #endif /* ONEWIRE_H_ */
OneWire.cpp
#define DEVICES_ERROR 1 #include "config.h" #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "OneWire.h" uint8_t ONE_WIRE_DQ = PINB0; void oneWireInit(uint8_t pin) { ONE_WIRE_DQ = pin; ONE_WIRE_PORT |= (1 << ONE_WIRE_DQ); ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход } /* * сброс */ uint8_t reset() { uint8_t response; // импульс сброса, минимум 480us ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ); ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход _delay_us(480); // Когда ONE WIRE устройство обнаруживает положительный перепад, он ждет от 15us до 60us ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход _delay_us(60); // и затем передает импульс присутствия, перемещая шину в логический «0» на длительность от 60us до 240us. response = (ONE_WIRE_PIN & (1 << ONE_WIRE_DQ)); _delay_us(410); // если 0, значит есть ответ от датчика, если 1 - нет return response; } /* * отправить один бит */ void writeBit(uint8_t bit) { if (bit & 1) { cli(); // логический «0» на 1us ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ); ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход _delay_us(10); sei(); ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход _delay_us(55); } else { cli(); // логический «0» на 1us ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ); ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // выход _delay_us(65); ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход sei(); _delay_us(5); } } /* * отправить один байт */ void writeByte(uint8_t byte) { uint8_t i = 8; while (i--) { writeBit(byte & 1); byte >>= 1; } } /* * получить один байт */ uint8_t readByte() { uint8_t i = 8, byte = 0; while (i--) { byte >>= 1; byte |= (readBit() << 7); } return byte; } /* * получить один бит */ uint8_t readBit(void) { uint8_t bit = 0; cli(); // логический «0» на 1us ONE_WIRE_PORT &= ~(1 << ONE_WIRE_DQ); ONE_WIRE_DDR |= (1 << ONE_WIRE_DQ); // вход _delay_us(3); // освободить линию и ждать 14us ONE_WIRE_DDR &= ~(1 << ONE_WIRE_DQ); // вход _delay_us(10); // прочитать значение if (ONE_WIRE_PIN & (1 << ONE_WIRE_DQ)) { bit = 1; } // ждать 45us и вернуть значение sei(); _delay_us(45); return bit; } /* * читать ROM подчиненного устройства (код 64 бита) */ uint64_t readRoom(void) { uint64_t oneWireDevice; if(reset() == 0) { writeByte(CMD_READROM); // код семейства oneWireDevice = readByte(); // серийный номер oneWireDevice |= (uint16_t)readByte()<<8 | (uint32_t)readByte()<<16 | (uint32_t)readByte()<<24 | (uint64_t)readByte()<<32 | (uint64_t)readByte()<<40 | (uint64_t)readByte()<<48; // CRC oneWireDevice |= (uint64_t)readByte()<<56; } else { return 1; } return oneWireDevice; } /* * Команда соответствия ROM, сопровождаемая последовательностью * кода ROM на 64 бита позволяет устройству управления шиной * обращаться к определенному подчиненному устройству на шине. */ void setDevice(uint64_t rom) { uint8_t i = 64; reset(); writeByte(CMD_MATCHROM); while (i--) { writeBit(rom & 1); rom >>= 1; } } /* * провеска CRC, возвращает "0", если нет ошибок * и не "0", если есть ошибки */ uint8_t crcCheck(uint64_t data8x8bit, uint8_t len) { uint8_t dat, crc = 0, fb, stByte = 0; do { dat = (uint8_t) (data8x8bit >> (stByte * 8)); for (int i = 0; i < 8; i++) { // счетчик битов в байте fb = crc ^ dat; fb &= 1; crc >>= 1; dat >>= 1; if (fb == 1) { crc ^= 0x8c; // полином } } stByte++; } while (stByte < len); // счетчик байтов в массиве return crc; } /* * поиск устройств */ void searchRom(uint64_t * roms, uint8_t & n) { uint64_t lastAddress = 0; uint8_t lastDiscrepancy = 0; uint8_t err = 0; uint8_t i = 0; do { do { lastAddress = searchNextAddress(lastAddress, lastDiscrepancy); if(lastAddress != DEVICES_ERROR) { uint8_t crc = crcCheck(lastAddress, 8); if (crc == 0) { roms[i++] = lastAddress; err = 0; } else { err++; } } else { err++; } if (err > 3) { return; } } while (err != 0); } while (lastDiscrepancy != 0 && i < n); n = i; } /* * поиск следующего подключенного устройства */ uint64_t searchNextAddress(uint64_t lastAddress, uint8_t & lastDiscrepancy) { uint8_t searchDirection = 0; uint64_t newAddress = 0; uint8_t idBitNumber = 1; uint8_t lastZero = 0; reset(); writeByte(CMD_SEARCHROM); while (idBitNumber < 65) { uint8_t idBit = readBit(); uint8_t cmpIdBit = readBit(); // id_bit = cmp_id_bit = 1 if (idBit == 1 && cmpIdBit == 1) { return DEVICES_ERROR; } else if (idBit == 0 && cmpIdBit == 0) { // id_bit = cmp_id_bit = 0 if (idBitNumber == lastDiscrepancy) { searchDirection = 1; } else if (idBitNumber > lastDiscrepancy) { searchDirection = 0; } else { if ((uint8_t) (lastAddress >> (idBitNumber - 1)) & 1) { searchDirection = 1; } else { searchDirection = 0; } } if (searchDirection == 0) { lastZero = idBitNumber; } } else { // id_bit != cmp_id_bit searchDirection = idBit; } newAddress |= ((uint64_t) searchDirection) << (idBitNumber - 1); writeBit(searchDirection); idBitNumber++; } lastDiscrepancy = lastZero; return newAddress; } /* * пропустить ROM */ void skipRom() { reset(); writeByte(CMD_SKIPROM); }
Подключение одного DS18B20 к ATmega8
Самый простой способ подключения термодатчика DS18B20 к микроконтроллеру, конечно же, подключение одного датчика. В таком случае нет необходимости искать адрес подключённого датчика, а можем напрямую с ним общаться и считывать данные. Всё это возможно благодаря команды SKIP ROM [CCh] — Пропуск ROM [CCh]. Обратите внимание, что команда ЧТЕНИЕ ПАМЯТИ [BEh] может следовать за командой Пропуска ROM, только если на шине присутствует одно подчиненное устройство. Команда Пропуска ROM, сопровождаемая командой ЧТЕНИЕ ПАМЯТИ вызовет конфликт на уровне данных на шине, если на шине более одного подчиненного устройства, так как все устройства будут пытаться одновременно передавать данные.
main.cpp
#include "config.h" #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "OneWire.h" #include "LCD.h" // 123.4 // numbers[0] = 123 // numbers[1] = 4 inline void explodeDoubleNumber(int* numbers, double flt) { numbers[0] = abs((int) flt); numbers[1] = abs((int) ((flt - ((int) flt)) * 10)); } inline void printTemp(double d) { char text[17] = "T = "; int fs[2]; char num[5]; explodeDoubleNumber(fs, d); if (d < 0) { strcat(text, "-"); } itoa(fs[0], num, 10); strcat(text, num); strcat(text, "."); itoa(fs[1], num, 10); strcat(text, num); strcat(text, "'C"); lcdClear(); lcdGotoXY(0, 0); lcdPuts(text); } double getTemp(void) { uint8_t temperatureL; uint8_t temperatureH; double retd = 0; skipRom(); writeByte(CMD_CONVERTTEMP); _delay_ms(750); skipRom(); writeByte(CMD_RSCRATCHPAD); temperatureL = readByte(); temperatureH = readByte(); retd = ((temperatureH << 8) + temperatureL) * 0.0625; return retd; } int main(void) { _delay_ms(100); lcdInit(); lcdClear(); lcdSetDisplay(LCD_DISPLAY_ON); lcdSetCursor(LCD_CURSOR_OFF); oneWireInit(PINB0); double temperature; while (1) { temperature = getTemp(); printTemp(temperature); _delay_ms(500); } } // site: http://micro-pi.ru
double getTemp(void)
— возвращает данные температуры в градусах Цельсия.
inline void printTemp(double d)
— отображает на экран температуру.
inline void explodeDoubleNumber(int* numbers, double flt)
— преобразует вещественное число flt в два целых, которые записываются в numbers.
Вместо функций inline void printTemp(double d)
и inline void explodeDoubleNumber(int* numbers, double flt)
можно использовать sprintf(), но она жрёт слишком много памяти.
Обычное питание
Результат
Паразитное питание
Результат
Подключение нескольких DS18B20 к ATmega8
Подключить несколько датчиков DS18B20 к ATmega8 или к другому микроконтроллеру, можно двумя способами. Первый способ — датчики можно подключить на разные выводы микроконтроллера, это самый простой способ, но в таком случае число подключенных датчиков зависит от числа выводов. Второй и самый лучший способ — это подключить все датчики на одну шину, в данном случае необходимо будет найти адреса всех подключённых датчиков.
Подключение нескольких DS18B20 к ATmega8 на разные выводы
main.cpp
#include "config.h" #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "OneWire.h" #include "LCD.h" // 123.4 // numbers[0] = 123 // numbers[1] = 4 inline void explodeDoubleNumber(int* numbers, double flt) { numbers[0] = abs((int) flt); numbers[1] = abs((int) ((flt - ((int) flt)) * 10)); } inline void printTemp(double d, uint8_t i) { char text[17] = "T["; int fs[2]; char num[5]; itoa(i, num, 10); strcat(text, num); strcat(text, "]="); explodeDoubleNumber(fs, d); if (d < 0) { strcat(text, "-"); } itoa(fs[0], num, 10); strcat(text, num); strcat(text, "."); itoa(fs[1], num, 10); strcat(text, num); strcat(text, "'C"); lcdClear(); lcdGotoXY(0, 0); lcdPuts(text); } double getTemp(uint8_t pin) { uint8_t temperatureL; uint8_t temperatureH; double retd = 0; oneWireInit(pin); skipRom(); writeByte(CMD_CONVERTTEMP); _delay_ms(750); skipRom(); writeByte(CMD_RSCRATCHPAD); temperatureL = readByte(); temperatureH = readByte(); retd = ((temperatureH << 8) + temperatureL) * 0.0625; return retd; } int main(void) { _delay_ms(100); lcdInit(); lcdClear(); lcdSetDisplay(LCD_DISPLAY_ON); lcdSetCursor(LCD_CURSOR_OFF); double temperature; uint8_t pin = 0; while (1) { temperature = getTemp(pin); printTemp(temperature, pin); if (pin == 4) { pin = 0; } else { pin++; } _delay_ms(500); } } // site: http://micro-pi.ru
Результат
Подключение нескольких DS18B20 к ATmega8 на одну шину
При подключение нескольких датчиков DS18B20 к ATmega8 на одну шину, главное устройство (микроконтроллер) должно определить коды ROM всех подчиненных устройств на шине. Команда SEARCH ROM [F0h] — (ПОИСК ROM) позволяет устройству управления определять номера и типы подчиненных устройств. Устройство управления изучает коды ROM через процесс устранения, которое требует, чтобы Главное устройство исполнил цикл Поиска ROM (то есть, команда ROM Поиска, сопровождаемая обменом данных). Эту процедуру необходимо выполнить столько раз, сколько необходимо, чтобы идентифицировать все из подчиненных устройств. Если есть только одно подчиненное устройство на шине, более простая команда READ ROM [33h] (Чтения ROM) может использоваться место процесса Поиска ROM.
После каждого цикла Поиска ROM, устройство управления шиной должно возвратиться к Шагу 1 (Инициализация) в операционной последовательности.
Алгоритм поиска 1-Wire устройств с использованием команды Search ROM прекрасно описан в этом видео:
main.cpp
#include "config.h" #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "OneWire.h" #include "LCD.h" // 123.4 // numbers[0] = 123 // numbers[1] = 4 inline void explodeDoubleNumber(int* numbers, double flt) { numbers[0] = abs((int) flt); numbers[1] = abs((int) ((flt - ((int) flt)) * 10)); } inline void printTemp(double d, uint8_t i) { char text[17] = "T["; int fs[2]; char num[5]; itoa(i, num, 10); strcat(text, num); strcat(text, "]="); explodeDoubleNumber(fs, d); if (d < 0) { strcat(text, "-"); } itoa(fs[0], num, 10); strcat(text, num); strcat(text, "."); itoa(fs[1], num, 10); strcat(text, num); strcat(text, "'C"); lcdClear(); lcdGotoXY(0, 0); lcdPuts(text); } double getTemp(uint64_t ds18b20s) { uint8_t temperatureL; uint8_t temperatureH; double retd = 0; setDevice(ds18b20s); writeByte(CMD_CONVERTTEMP); _delay_ms(750); setDevice(ds18b20s); writeByte(CMD_RSCRATCHPAD); temperatureL = readByte(); temperatureH = readByte(); retd = ((temperatureH << 8) + temperatureL) * 0.0625; return retd; } int main(void) { _delay_ms(100); lcdInit(); lcdClear(); lcdSetDisplay(LCD_DISPLAY_ON); lcdSetCursor(LCD_CURSOR_OFF); oneWireInit(PIND7); double temperature; uint8_t n = 8; uint64_t roms[n]; searchRom(roms, n); char txt[17] = "devices ["; char num[5]; itoa(n, num, 10); strcat(txt, num); strcat(txt, "]"); lcdClear(); lcdGotoXY(0, 0); lcdPuts(txt); _delay_ms(2000); while (1) { for (uint8_t i = 0; i < n; i++) { temperature = getTemp(roms[i]); printTemp(temperature, i + 1); _delay_ms(500); } } } // site: http://micro-pi.ru
Обычное питание
Результат
Паразитное питание
Результат
Внимание! При использовании паразитного питания не рекомендуется использовать датчики для температуры выше +100ºC, а также при операциях преобразования температуры и копирования данных из Scratchpad в один из регистров EEPROM, потребляемый ток может достигать 1.5 мА, что непосильно внутреннему конденсатору, а на резисторе подтяжки (R1 4.7k) будет большое падение напряжения, что недопустимо скажется на работе устройства в целом. Для этого необходимо организовать линии DQ схему мощной подтяжки, реализуемой по такой схеме:
После выдачи команды конвертирования температуры [44h] или копирования ОЗУ В ПЗУ (Copy Scratchpad) [48h] необходимо включить мощную подтяжку MOSFET-транзистором линии DQ на 10 мкс (макс.), как указанно в даташите датчика, после чего выждать время преобразования или время передачи данных, причем в это время никаких действий при включенной мощной подтяжке на линии DQ быть не должно!
Скачать Atmel Studio 7 проекты и схемы в ISIS Professional (Proteus):
DS18B20 + LCD 16×2 + ATmega8 — ISIS Professional (Proteus)
DS18B20 + LCD 16×2 + ATmega8 — Atmel Studio 7
Собрал пример с одним датчиком, LCD только двухстрочны. На экране «Т = -0,0 С». Почему так???
Привет, попробуйте вариант с подключением нескольких датчиков на одну шину, помоему это вторая папка из архива, там подключается на PIND7. Обычно то, что работает в протеусе, работает и на реальных мк. Если и этот не пойдёт, тогда я протестирую у себя и отпишусь
вариант с подключением нескольких датчиков на одну шину универсальный, вы сможете увидеть сколько устройств подключены и подключены ли вообще, также резистор обязателен, без него датчик и выдаст -0,0, что означает что датчик не подключён
Все заработало, разобрался.Дело в конфигурации фьюзов, по умолчанию частота стоит 1мгц , а по коду надо 8мгц. Я новичок по этому не сразу вник в детали. А какая конфигурация фьюзов используется вами в данном проекте? На примере khazama AVR.
В данном проекте — 8мгц, CKSEL Fuses: (0100) Int.RC 8MHz, т.е. внутренний RC генератор, но для конкретного проекта я всегда использую внешний кварц на 11.0592МГц или больше.
И да, почти у всех AVR микроконтроллеров по умолчанию стоит 1мгц, я всегда первым делом меняю фьюзы на (1111) Ext. Crystal High Freq или в khazama avr programmer Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET: 16K CK/14 CK + 65 ms; , а на ATtiny2313 ещё и делитель частоты на 8 отключаю.
Спасибо за интересную статью!!! А аналогичные примеры есть с применением I2C подключения к LCD в Atmel Studio???
У меня два LCD и оба без I2C, хотя можно купить отдельно адаптер и подключить без проблем.
А по поводу примеров, пока нет, но планирую что-то сделать именно на ATmega8, просто времени не хватает, идей то много.
Я эту статью сделал, так как ничего толком не нашёл в интернете и решил сам сделать все примеры подключения датчика DS18B20.
И ещё, я уже отошёл от Atmel Studio, теперь использую Eclipse, так как кроме дебагинга меня там ничего не устраивало и решил сменить среду разработки на более удобную.
Ссылка на статью как настроить Eclipse под AVR.
Жаль, а я только пытаюсь изучить студию…..
Тогда я постараюсь сделать аналогичный проект и в Atmel Studio, чтобы были два варианта
Здравствуйте! Пытаюсь внедрить Ваш код по подключению двух датчиков на одну шину в Atmel Studio 6.2. Дело в том, что основной проект у меня написан на СИ (не СИ++), и почему-то компилятор ругается на два определения в OneWire.h и соответственно OneWire.cpp:
void searchRom(uint64_t*, uint8_t&);
и
uint64_t searchNextAddress(uint64_t, uint8_t&);
а именно на знак «&». Честно сказать не понимаю зачем он нужен, но после того как его убрал, проект успешно скомпилировался, но возникла проблема — в массиве rom после выполнения функции searchRom(roms, n), определяется только один серийный номер датчика (второй равен нулю) и соответственно выводится температура только его одно. Помогите разобраться в чем дело. Заранее спасибо.
Здравствуйте! Если у вас C проект, значит вам нужно переименовать OneWire.cpp в OneWire.c или создать C++ проект. Кстати, можете импортировать прикреплённый к посту проект DS18B20 + LCD 16×2 + ATmega8 — Atmel Studio 7 или создать C++ проект и туда импортировать все файлы переименовав с .c на .cpp.
По поводу ошибки, можете сюда вставить полное сообщение ошибки/ошибок и я смогу вам помочь.
Теперь по поводу знака «&», без него, к сожалению, будет работать только один датчик, данная переменная помогает искать все подключённые устройства.
Ссылки (&) – особый тип данных, являющийся скрытой формой указателя, который при использовании автоматически разименовывается. Ссылка может быть объявлена как другим именем, так и как псевдоним переменной, на которую ссылается.
подробнее здесь: http://cppstudio.com/post/429/
Можете скачать вот этот проект, тут я его переделал в C: DS18B20_ATmega8_LCD.zip. Исправил void searchRom(uint64_t*, uint8_t&); и uint64_t searchNextAddress(uint64_t, uint8_t&);, в C «&» не работает.
Также исправил несколько Warning-ов, когда будет время переделаю всё для C. Удачи!
admin, большое спасибо!
Спасибо вам за статью, вы мне значительно облегчили работу с курсовым проектом
скомпилировал версию c одним датчиком «1xDS18B20+LCD 16×2+ATmega8» в AtmelStudio7 — успешно под atmega8, получил hex, пошел в протеус 8.2 sp3 — перерисовал схему, загрузил ранее полученную прошивку — в результате экран показывает «T= -0.0C» скриншот
было тожесамое как и Евгения «Все заработало, разобрался.Дело в конфигурации фьюзов, по умолчанию частота стоит 1мгц , а по коду надо 8мгц. »
переключил в протеусе фьюз на 8мгц внутренний и заработало
Hi! В OneWire.cpp cтрока 7:
uint8_t ONE_WIRE_DQ = PINB0;
что это значит, ведь датчики подключены к порту D пин 7???
Ну, как бы вот, тут идёт инициализация на другой ПИН:
а это типа значение по умолчанию:
но можно убрать это присваивание:
Автору огромное спасибо! Всё работает (прилагая свои мозги и прямые руки ;). Пытаясь подружить Atmel и MPLAB-X v5.2, адаптировал код автора под тулчайн WinAVR — работает так как надо!!!
Здравствуйте, запустил в протеусе схему с одним датчиком, и загрузил программу туда — все работало.
Решил сделать термометр, когда собрал, программу залил в Atmega8 через SinaProg, термометр запитываю с ArduinoUno — все выключается. Вытаскиваю датчик, подключаю питание экран показывает » t=-9999*C «.
Получается что с датчиком схема выключается из-за короткого замыкания, без датчика вроде все работает, но температуру не показывает, схему проверял мультиметром замыканий ни где нет, проверил контакт PB2 включенным без датчика он выдает 5 Вольт, хотя если PB2 настроен на считывание то там не должно быть этих 5-ти Вольт.
Подскажите что можно сделать
Здравствуйте, попробуйте вариант с подключением нескольких датчиков на одну шину, по моему это вторая папка из архива, там подключается на PIND7. Обычно то, что работает в протеусе, работает и на реальных микроконтроллерах. А ещё дело может быть и в конфигурации фьюзов, по умолчанию частота стоит 1мгц , а по коду надо 8мгц.
А можно туже самую задачу, только на «С»?И еще превратить простой термометр в многоканальный терморегулятор?
Но как опрашивать датчики по порядку, по адресам, если они на одном проводе?
Здравствуйте. Кто занимается программированием на МК? Меня интересует схема 2-х канального термометра на МК. Я ищу любителя-программиста, с которым я бы смог воплотить в жизнь свою задумку. Немного расширить функционал термометра, использовать более крупный ЖК дисплей, добавить некоторые модуля. Если кто в принципе согласен, то можно продолжить общаться далее. А заодно скажите пожалуйста регион вашего проживания и почту для общения.
Добрый день!
Сейчас работаю над аналогичным проектом, вернее над двумя.
Первый — схема с динамической индикацией на MAX7219, МК Atmega1284, часы реального времени DS1307, датчик давления воздуха (атмосферы), датчик относительной влажности воздуха, два датчика температуры DS18B20. Индикаторы -светодиодные. Часы-двухдюймовые, а остальная индикация 10мм. Ранее собрал, но так как не имел опыта программирования, плата одна, а часы, термометр, барометр и измеритель влажности — каждый имел свой контроллер. Конструкцию собирал лет 10 назад. Плюс имеются два будильника с музыкальными мелодиями, можно по заданному времени что-то включать -выключать. Могу поделиться информацией и опытом. Мой e-mail: vigavic07@mail.ru
С уважением, Виктор
Доброго времени суток!!!
Спасибо за проделанную работ!!!
Особенно понравилась написанная работа, над поиском rom code с помощью регистров lastDiscrepancy и lastZero.
Подскажите как обойтись без цикла for и без задержки, а сделать все по прерыванию таймера? Что бы не занимать в пустую тактовое время?
for (uint8_t i = 0; i < n; i++) {
temperature = getTemp(roms[i]);
printTemp(temperature, i + 1);
_delay_ms(1000);
}
Здравствуйте!
Использовать таймеры-счетчики и прерывания можно и будет намного интереснее, но есть нюансы, а именно нужно менять логику почти всей программы, что не всегда оправдывается и будет труднее понять, как всё работает. Тут уже идет речь о многозадачности.
Нашел статью:
https://narodstream.ru/avr-urok-10-tajmery-schetchiki-preryvaniya/
но в интернете есть много статей на эту теме.
У Вас Функция itoa() конвертирует целое число num в строчный эквивалент и помещает результат в строку?
Именно, тут описание функции:
http://www.c-cpp.ru/content/itoa
Спасибо! Почитаем.
Функция itoa() очень много памяти съедает. Без нее, размер скомпилированного хекс файла примерно на пол килобайта меньше.
Это правда, если хотите сэкономить память контроллера, тогда нужно обойти стороной встроенные функции.
Решил с ассемблера перейти на си, все вроде как бы понятно, но не очень, пока путаюсь в самом синтаксисе языка си.
Писать на Си намного удобнее ассемблера, вы быстро привыкните. А вот обратно не так-то просто.
Доброго времени суток!!!
Подскажите название переменных, где лежит окончательная преобразованная температура двух DS в десятичном виде, после считывания с DS? Что бы была возможность оперировать условиями при изменении температуры.
Я в отладчике смотрел изменение переменных так и не понял какие.
Здравствуйте!
Всё происходит тут:
а температура текущего датчика сохраняется в переменной
temperature
.Спасибо большое, все понятно.
Добрый вечер!
Вопрос переменная temperature для обоих датчиков? После какого текущего параметра для каждого из датчиков меняется temperature?
Здравствуйте!
Да, для данного примера используется только одна переменная, но можете использовать массив, если нужно сохранить значение каждого датчика.
Просто написал условие для temperature, а фактически условие срабатывает только по первому датчику.
Добавил в Ваш код по таймеру 1 атмега128. Без задержки.
for (uint8_t i = 0; i < n; i++){
temperature = getTemp(roms[i]);
if (BIT_state ==1){
printTemp(temperature, i + 1);
// _delay_ms(1000);
}
}
Да, но есть нюансы вот тут:
Тут есть задержка в 750 миллисекунд, что не совсем хорошо использовать в функции прерывания. Можете использовать таймер вместо цикла, так будет лучше.
Доброго времени суток!!!
Если есть время подскажите как на языке С, с переменной uint64_t — byte_data_rom конвертировать в удобочитаемый вид, для вывода посимвольно считанного romcode на LCD?
В
uint64_t roms[n];
сохранены все найденные адреса. А преобразовать можно примерно так:Онлайн компилятор тут:
https://www.onlinegdb.com/online_c++_compiler
Спасибо огромное!
Я таким макаром, вывожу на дисплей.
Пока есть свободное время, недельки две, хочу позаниматься языком Си.
Всё-таки не работает ни один код. Пробовал с разными датчиками: в корпусе ТО-92 и в герметичном. Показывает -0.0 или без минуса 0.0.
Автор самозванец, никакой он не препод в универе. Код передран отсюда: https://narodstream.ru/stm-urok-94-ds18b20-podklyuchaem-neskolko-datchikov-na-provod-chast-1/ и переделан под ATmega8.
Возможно, но после его видео я понял, как написать библиотеку
Здравствуйте! Пытаюсь внедрить Ваш код по подключению двух датчиков на одну шину в Atmel Studio 6.2. Дело в том, что основной проект у меня написан на СИ (не СИ++), и почему-то компилятор ругается на два определения в OneWire.h и соответственно OneWire.cpp:
void searchRom(uint64_t*, uint8_t&);
и
uint64_t searchNextAddress(uint64_t, uint8_t&);
а именно на знак «&». Честно сказать не понимаю зачем он нужен, но после того как его убрал, проект успешно скомпилировался, но возникла проблема — в массиве rom после выполнения функции searchRom(roms, n), определяется только один серийный номер датчика (второй равен нулю) и соответственно выводится температура только его одно. Помогите разобраться в чем дело. Заранее спасибо
Меняйте эти две функции:
и обновите сам вызов:
доброго времени суток почему то не компилируется ругается на #include «config.h»
1 раз отработал и все. Больше в протеусе не работает. на табло -0.0. Частота 8мГц. Все коды по 1 разу отработали …
Здравствуйте. Вопрос : почему микрочип(atmelstudio) не компилирует вот эта #ifndef CONFIG_H_
#define CONFIG_H_
#define F_CPU 8000000UL
#define ONE_WIRE_PORT PORTB
#define ONE_WIRE_DDR DDRB
#define ONE_WIRE_PIN PINB
#endif /* CONFIG_H_ */
Главные новости мира https://ua-vestnik.com и страны: политика, экономика, спорт, культура, технологии. Оперативная информация, аналитика и эксклюзивные материалы для тех, кто следит за событиями в реальном времени.
prednisone 10 mg tablets: prednisoneraypharm — prednisone 80 mg daily
prednisone 20mg online without prescription: prednisone ray pharm — prednisone 50 mg tablet canada
generic amoxil 500 mg Com Pharm amoxicillin 500mg capsule cost
dapoxetine online: Priligy tablets — buy priligy
prednisone 10 mg price cheap prednisone prednisone for sale
canada pharmacy prednisone: cheap prednisone — apo prednisone
prednisone 50 mg tablet cost: generic Prednisone — prednisone 10mg tabs
clomid without prescription order generic clomid no prescription can i get clomid pill
purchase amoxicillin online: Com Pharm — amoxicillin 875 mg tablet
ampicillin amoxicillin: Amoxicillin for sale — order amoxicillin uk
buy dapoxetine online: Priligy tablets — priligy maxpharm
dapoxetine price priligy maxpharm Priligy tablets
amoxicillin over counter: amoxicillin medicine over the counter — amoxicillin 500 mg tablet price
can i buy prednisone online without prescription: prednisone 40mg — prednisone tablets canada
amoxicillin capsule 500mg price: Com Pharm — buy amoxicillin online cheap
buy amoxicillin 500mg usa: cheap amoxil — amoxicillin 30 capsules price
cost clomid price: rex pharm — can i get clomid pill
Top Apps to Make Money in Pakistan, Easy Money Making in Pakistan Through Apps, Secret Methods to Make Money in Pakistan, To Improve Your Financial Situation, With a User-Friendly Interface and High Profits, which have already been rated by thousands of users, Safe ways to earn money in Pakistan through applications, Innovative platforms for earning money in Pakistan, Convenient ways to make passive income in Pakistan, Reliable apps for making money in Pakistan: choose the best, for active participation in earnings, with minimal effort and maximum return, The most interesting apps for making money in Pakistan, Reliable apps for making money in Pakistan: a proven path to income, which will suit every user, for making money at home, Earnings in Pakistan using mobile apps: reality or fiction?, which will open up new opportunities for earning moneyhow to earn money online in pakistan for students free earning app in pakistan .
prednisone 10mg prices: raypharm — apo prednisone
buy dapoxetine online: priligy — buy dapoxetine online
dapoxetine price: Priligy tablets — buy priligy max pharm
buy dapoxetine online: dapoxetine price — buy priligy max pharm
prednisone 1 tablet: raypharm — prednisone pak
Top Money Making Apps in Pakistan, Money Earning Apps That Shape Your Financial Situation in Pakistan
pakistani earning app earning app pakistan .
http://plavixclo.com/# Plavix generic price
Most Popular Money Making Apps in Pakistan, Easy Ways to Process Using Apps in Pakistan
earning app pakistan easy earning app in pakistan .
medication from mexico pharmacy http://mexicanpharmgate.com/ mexican pharmaceuticals online
cheapest Lisinopril: cheapest Lisinopril — buy lisinopril online
prednisone: order Prednisone — apo prednisone
Lisinopril 1st: buy Lisinopril 1st — buy Lisinopril online
buy amoxicillin 250mg: amoxil — amoxicillin tablets in india
Best Earning App in Pakistan|Amazing Earning Opportunity in Pakistan|Earning in Pakistan: New Approach|Earning App in Pakistan: Benefits|Pakistan High Earning Apps|Economic Earning in Pakistan|Pakistan Right Choice for Processing|Pakistan High Paying App for earnings|Interesting opportunities for earning in Pakistan|Pakistan: best app for processing
apps for earning money in pakistan apps to earn money in pakistan .
Top Earning App in Pakistan|Easy Way to Earn in Pakistan|Innovative Earning Method in Pakistan|Earning App in Pakistan: Benefits|Profitable Earning App in Pakistan|Economic Earning in Pakistan|Pakistan Right Choice for Processing|Pakistan High Paying App for earnings|Pakistan: leader in earning|Pakistan: best app for processing
apps for earning money in pakistan apps to earn money in pakistan .
buy Clopidogrel over the counter buy clopidogrel online cheap plavix antiplatelet drug
how to buy clomid without rx: clomid purchase online rex pharm — where to buy generic clomid without prescription
cheapest Lisinopril: buy Lisinopril 1st — cheapest Lisinopril
order cytotec online: buy cytotec online fast delivery — cytotec buy online usa
purchase cytotec buy cytotec cytpremium cytotec online
Best Apps to Make Money in Pakistan, For Extra Income, Unusual Ways to Make Money in Pakistan, To Improve Your Financial Situation, Popular Apps to Make Money in Pakistan, which have already been rated by thousands of users, which you need to know, with a guarantee of payments, which change the idea of ????earning money, Simple ways to make money in Pakistan through mobile apps, for active participation in earnings, Updated platforms for making money in Pakistan, The most interesting apps for making money in Pakistan, with great potential for earning, Optimal platforms for making money in Pakistan, for making money at home, which bring real money, Top ways to earn money in Pakistan through apps: tips andonline earning app in pakistan real earning apps in pakistan .
http://cytpremium.com/# cytotec abortion pill
purchase prednisone no prescription: ray pharm — buy cheap prednisone
cytotec buy online usa: п»їcytotec pills online — buy cytotec
ivermectin where to buy ivermectin 1 topical cream order minocycline 50 mg
https://iverfast.com/# ivermectin 3 mg tablet dosage
clomid online: generic clomid — where can i buy cheap clomid without insurance
pin up казино: пин ап казино — pin up казино
вавада онлайн казино: вавада казино онлайн — казино вавада
Esim365 обеспечивает удобное решение для интернета за границей . С помощью esim365 вы получите доступ к интернету для заграницы . Интернет в Турции и Китае станет доступным благодаря есим365.
есим365 упрощает процесс подключения к интернету в путешествиях. Это лучшее решение для связи в Китае, где доступ к интернету может быть ограничен . Также, с esim для Турции вы получите стабильную связь в Турции .
Сервис есим 365 предоставляет удобный способ подключения к интернету за границей. Вы легко сможете настроить esim для путешествий . Удобство и скорость подключения с esim 365 обеспечат комфорт в путешествиях.
пин ап кз: пин ап кз — пинап казино
вавада онлайн казино: вавада казино — vavada-kazi.ru
казино вавада: vavada kazi — вавада
Most Popular Money Making Apps in Pakistan, Popular Money Earning Apps in Pakistan
best app for earning money in pakistan earn real money by playing games without investment pakistan .
vavada kazi: вавада казино — вавада казино онлайн
Best Apps to Make Money in Pakistan, Easy Money Making in Pakistan Through Apps, Unusual Ways to Make Money in Pakistan, For Quick Earnings, With a User-Friendly Interface and High Profits, with a high rating and positive reviews, for successful earnings, Promising applications for earning money in Pakistan, Passive income in Pakistan through applications: myth or reality?, which few people know about, Successful ways to make money in Pakistan, which bring a stable income, The most interesting apps for making money in Pakistan, Easy ways to make money in Pakistan through apps, Effective apps for making money in Pakistan: check it out yourself, for making money at home, which bring real money, to improve financial situationearning app in pakistan earning app in pakistan .
pinup-kazi.ru: pinup kazi — пин ап зеркало
http://pinup-kazi.ru/# пин ап зеркало
Финансовый маркетплейс помогает сэкономить время: вы выбираете финансовый продукт, а платформа делает всю работу за вас, подбирая лучшие варианты.
Микрокредиты банки Казахстана .
pinup-kazi.ru пин ап казино pinup-kazi.ru
казино вавада: vavada kazi — вавада казино
Ищете обмен валюты с минимальной комиссией? На сайте собрана информация об обменниках с лучшими курсами в Казахстане.
банки Казахстана Микрокредиты .
http://pinup-kazi.ru/# pinup-kazi.ru
пин ап казино: pinup-kazi.ru — пин ап зеркало
pin up казино: pinup-kazi.kz — пин ап кз
пин ап казино: пинап казино — пинап казино
pinup: пин ап казино официальный сайт — pinup-kazi.ru
https://allbusiness.kz/post-business/287-virtualnye-nomera-sovremennoe-reshenie-dlya-biznesa.html
проведение спецоценки условий труда организации в москве организации проводящие специальную оценку условий труда москва
world pharmacy india: indian pharm — world pharmacy india
indian pharmacies safe indian pharm star top online pharmacy india
compare ed drugs https://canadianpharm1st.com/# viagra without a doctor prescription
best online pharmacies in mexico: mexican pharmacy — buying prescription drugs in mexico
купить виртуальный номер для смс навсегда
online pharmacy india indian pharmacy reputable indian online pharmacy
over the counter ed medication: canadian pharm — what is the best ed drug
cheap cytotec There was a meta- analysis 9 of 1, 441 ovulation- disorders women showing that the use of acupuncture as a monotherapy significantly improved the rate of pregnancy compared with the use of Clomiphene Citrate CC alone
ed men: canada pharmacy online — canadian drugs online
is ed reversible: canadian pharmacy — ed treatments
mexican pharmaceuticals online MexicanPharmEasy mexican online pharmacies prescription drugs
mexican rx online: mexicanpharmeasy.com — mexican mail order pharmacies
ed vacuum pumps: canadian pharm 1st — ed drugs online from canada
generic ed pills https://mexicanpharmeasy.com/# п»їbest mexican online pharmacies
ed medications list canadian pharmacy canadian online drugs
injectable ed drugs http://canadianpharm1st.com/# pet antibiotics without vet prescription
п»їlegitimate online pharmacies india: indian pharm — Online medicine home delivery
best online pharmacies in mexico: mexican pharm easy — reputable mexican pharmacies online
Online medicine home delivery IndianPharmStar.com best india pharmacy
As expected, treatment with antisense oligonucleotides to clusterin represses the effect of dexamethasone on clusterin where to buy generic cytotec without a prescription 7 Unknown 20 90
how to treat ed: canadianpharm1st — ed therapy
natural help for ed http://indianpharmstar.com/# п»їlegitimate online pharmacies india
mexican drugstore online: mexican pharm easy — mexico drug stores pharmacies
best ed medications canadian pharm 1st ed and diabetes
Ivermectin Pharm Store: ivermectin medicine — Ivermectin Pharm Store
paxlovid india paxlovid buy paxlovid for sale
Ivermectin Pharm Store: Ivermectin Pharm — Ivermectin Pharm Store
https://gabapentinpharm.com/# neurontin 100mg tab
Buy compounded semaglutide online: rybelsus generic — buy semaglutide online
https://gabapentinpharm.com/# Gabapentin Pharm
Gabapentin Pharm Gabapentin Pharm Gabapentin Pharm
Gabapentin Pharm: Gabapentin Pharm — neurontin 300mg
Buy compounded semaglutide online: semaglutide pharm — semaglutide pharm
https://amoxilpharm.store/# amoxicillin 500mg no prescription
Получайте удовольствие от игры в казино онлайн, станьте победителем.
Ощутите азарт казино онлайн, достижение успеха рядом.
Находите лучшие игровые площадки, доверьтесь профессионалам.
Зарабатывайте большие деньги в интернет-казино, играя в популярные слоты.
Станьте частью мира казино онлайн, наслаждайтесь победами.
Достижения ждут вас в казино онлайн, трансформируйте свою жизнь.
Проявите себя как успешный игрок, получая максимум удовольствия.
Выберите свой идеальный вариант развлечения, погрузитесь в атмосферу азарта в любом месте.
Преуспейте в азартных играх вместе с нами, завоюйте вершину мира азарта.
Забудьте о скучных моментах, играя везде и всегда, выбирая любимые игры.
Сделайте свою жизнь более увлекательной с казино онлайн, удовлетворяя жажду азарта.
Станьте лидером в мире игр, получая щедрые бонусы.
Наслаждайтесь свободой и возможностью выигрывать, получайте удовольствие от игры в любое время дня и ночи.
Улучшайте свои навыки игры в казино онлайн, анализируя перемены.
онлайн казино беларусь онлайн казино .
Paxlovid.ink: Paxlovid.ink — buy paxlovid online
Получайте удовольствие от игры в казино онлайн, выигрывайте большие суммы.
Проникнитесь атмосферой казино онлайн, достижение успеха рядом.
Играйте только на проверенных сайтах, следуйте советам экспертов.
Зарабатывайте большие деньги в интернет-казино, делая ставки на спортивные события.
Станьте частью мира казино онлайн, получайте удовольствие от игры.
Достижения ждут вас в казино онлайн, достигайте финансовой независимости.
Проявите себя как успешный игрок, получая максимум удовольствия.
Выберите свой идеальный вариант развлечения, наслаждайтесь игрой в любое время суток.
Получайте удовольствие от игры в казино онлайн, играя в любимые игры.
Играйте в онлайн казино смартфоне, выбирая любимые игры.
Почувствуйте азарт от неожиданных побед, удовлетворяя жажду азарта.
Станьте лидером в мире игр, завоевывая новые вершины.
Наслаждайтесь свободой и возможностью выигрывать, соревнуйтесь с сильнейшими игроками.
Станьте частью крупных турниров и соревнований, изучая стратегии и тактики.
Казино онлайн казино беларусь .
Ivermectin Pharm Store: Ivermectin Pharm Store — Ivermectin Pharm
Получайте удовольствие от игры в казино онлайн, стремитесь к джекпоту.
Проникнитесь атмосферой казино онлайн, играйте как профессионал.
Выбирайте лучшие казино онлайн, следуйте советам экспертов.
Пополняйте свой счет с помощью казино онлайн, делая ставки на спортивные события.
Присоединяйтесь к сообществу азартных игроков, испытывайте азарт в полной мере.
Достижения ждут вас в казино онлайн, получайте призы и бонусы.
Проявите себя как успешный игрок, играя в абсолютно любимые игры.
Разнообразие игр ждет вас в онлайн казино, наслаждайтесь игрой в любое время суток.
Ощутите незабываемые ощущения от азартного времяпрепровождения, играя в любимые игры.
Превратите свой телефон в настоящее казино, выбирая любимые игры.
Разнообразные игры помогут вам насладиться моментом, получая яркие эмоции.
Достижения ждут вас в увлекательном мире азарта, получая удовольствие от побед.
Играйте в казино онлайн без ограничений, достижения ждут вас.
Улучшайте свои навыки игры в казино онлайн, практикуя различные подходы.
онлайн казино беларусь казино беларусь .
stromectol 6 mg dosage: Ivermectin Pharm Store — Ivermectin Pharm
http://semaglutidepharm.com/# Semaglutide pharmacy price
Ivermectin Pharm Store minocycline 100mg for acne stromectol prices
http://ivermectinpharm.store/# Ivermectin Pharm Store
buy rybelsus: rybelsus cost — semaglutide pharm