В данной статье пойдет речь о том, как подключить датчик температуры 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 С». Почему так???
Все заработало, разобрался.Дело в конфигурации фьюзов, по умолчанию частота стоит 1мгц , а по коду надо 8мгц. Я новичок по этому не сразу вник в детали. А какая конфигурация фьюзов используется вами в данном проекте? На примере khazama AVR.
Спасибо за интересную статью!!! А аналогичные примеры есть с применением I2C подключения к LCD в 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), определяется только один серийный номер датчика (второй равен нулю) и соответственно выводится температура только его одно. Помогите разобраться в чем дело. Заранее спасибо.
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-ти Вольт.
Подскажите что можно сделать
А можно туже самую задачу, только на «С»?И еще превратить простой термометр в многоканальный терморегулятор?
Но как опрашивать датчики по порядку, по адресам, если они на одном проводе?
Доброго времени суток!!!
Спасибо за проделанную работ!!!
Особенно понравилась написанная работа, над поиском rom code с помощью регистров lastDiscrepancy и lastZero.
Подскажите как обойтись без цикла for и без задержки, а сделать все по прерыванию таймера? Что бы не занимать в пустую тактовое время?
for (uint8_t i = 0; i < n; i++) {
temperature = getTemp(roms[i]);
printTemp(temperature, i + 1);
_delay_ms(1000);
}
У Вас Функция itoa() конвертирует целое число num в строчный эквивалент и помещает результат в строку?
Решил с ассемблера перейти на си, все вроде как бы понятно, но не очень, пока путаюсь в самом синтаксисе языка си.
Доброго времени суток!!!
Подскажите название переменных, где лежит окончательная преобразованная температура двух DS в десятичном виде, после считывания с DS? Что бы была возможность оперировать условиями при изменении температуры.
Я в отладчике смотрел изменение переменных так и не понял какие.
Добавил в Ваш код по таймеру 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);
}
}
Доброго времени суток!!!
Если есть время подскажите как на языке С, с переменной uint64_t — byte_data_rom конвертировать в удобочитаемый вид, для вывода посимвольно считанного romcode на LCD?
Я таким макаром, вывожу на дисплей.
Пока есть свободное время, недельки две, хочу позаниматься языком Си.
Всё-таки не работает ни один код. Пробовал с разными датчиками: в корпусе ТО-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_ */
iphone 16 256gb best iphone
1vin https://www.pboarders.borda.ru/?1-11-0-00000929-000-0-0-1742818701 .
mostbet chrono https://www.shorts.borda.ru/?1-18-0-00000397-000-0-0 .
1 win https://boardwars.forum24.ru/?1-10-0-00000406-000-0-0/ .
mostbet https://tagilshops.forum24.ru/?1-4-0-00000205-000-0-0 .
Банкротство является прекрасной возможностью списать долги и начать жизнь с чистого листа. Не откладывайте решение проблемы, прочитайте отзывы тех, кто уже прошел процедуру банкротства банкротство физических лиц .
mostbest https://kharkovbynight.forum24.ru/?1-15-0-00003047-000-0-0-1742814422 .
1вин бет официальный сайт 1вин бет официальный сайт .
мостбет скачать https://www.maksipolinovtsu.forum24.ru/?1-1-0-00000194-000-0-0-1742815870 .
зайти в 1вин dogzz.forum24.ru/?1-10-0-00000155-000-0-0-1742818537 .
1 вин вход http://zdorovie.forum24.ru/?1-7-0-00000231-000-0-0-1742818050/ .
1win личный кабинет https://knowledge.forum24.ru/?1-0-0-00000101-000-0-0-1742817704/ .
mostbet chrono https://mostbet6004.ru/ .
игра 1вин игра 1вин .
мостбет скачать http://girikms.forum24.ru/?1-1-0-00000361-000-0-0-1742819287/ .
мостбет казино https://www.hiend.borda.ru/?1-16-0-00000259-000-0-0-1743052953 .
motbet http://alfatraders.borda.ru/?1-0-0-00004917-000-0-0-1743053068 .
игра 1вин https://fanfiction.borda.ru/?1-0-0-00029708-000-0-0-1743051664 .
1win партнерка вход 1win партнерка вход .
mostbet kg скачать https://www.svstrazh.forum24.ru/?1-18-0-00000136-000-0-0-1743260517 .
Законное списание долгов по 127-ФЗ https://bankrotstvo-v-moskve95.ru .
мостбет кг мостбет кг .
1win скачать kg https://1win6054.ru .
1win bets http://www.1win13.com.ng .
1win 1win .
cazinouri online moldova cazinouri online moldova .
мосбет казино https://mostbet6011.ru .
ван вин https://www.1win6008.ru .
1win букмекер https://www.1win6045.ru .
1 вин https://www.1win6045.ru .
мойка окон после ремонта cleaning top24
клининговая компания цена cleaning-top24.ru/
1win ставки официальный сайт 1win5030.ru .
прокат машин во владивостоке без водителя взять в аренду автомобиль во владивостоке
аренда и прокат авто в санкт петербурге аренда автомобиля на неделю спб
мостбет авиатор https://www.mostbet5003.ru .
1 win сайт https://www.1win7004.ru .
скачать mostbet http://mostbet7001.ru/ .
mostbet kg скачать на андроид http://mostbet6038.ru/ .
1win https://1win7017.ru/ .
înregistrare 1win https://www.1win5027.ru .
1win betting 1win18.com.ng .
1win.pro http://www.1win5026.ru .
мостбет мостбет .
1win rossvya http://1win7006.ru/ .
1win,com 1win7018.ru .
mosbet 1win5028.ru .
1win online http://1win7007.ru/ .
поддержка мостбет https://www.mostbet5008.ru .
1win live https://www.1win7009.ru .
mostbets http://mostbet5010.ru/ .
1win uganda https://1win1005.top .
мостбет авиатор http://mostbet5009.ru/ .
Индивидуальный пошив штор
пошив штор на заказ пошив штор на заказ .
Сшить шторы на заказ по индивидуальному проекту, лучшие цены.
Качественные шторы на заказ, по выгодной цене.
Создание штор мечты, под любой стиль.
Лучшие ткани для штор на заказ, подчеркивающие ваш стиль.
Пошив штор на заказ для кухни, под ваш вкус.
Индивидуальный дизайн штор, под любой бюджет.
Пошив штор для нестандартных окон, с учетом особенностей помещения.
Эксклюзивные шторы на заказ, по вашему желанию.
Современные шторы на заказ, под любой интерьер.
Создание штор для любого типа окна, от ведущих мастеров.
Изготовление штор на заказ на любой вкус, с гарантией качества.
Изготовление штор на заказ быстро и недорого, с высоким качеством.
Модные шторы на заказ для вашего дома, от ведущих дизайнеров.
Дизайнерские шторы на заказ, по вашему проекту.
Пошив штор по индивидуальному дизайну, по мере необходимости.
Пошив штор на заказ с индивидуальным подходом, под любой стиль.
сшить шторы на заказ сшить шторы на заказ . Прокарниз
Лучшие шторы на заказ
пошив штор на заказ пошив штор на заказ .
мост бет https://www.mostbet7007.ru .
1 win официальный сайт https://1win7012.ru .
Закажите уникальные шторы на заказ, отличное качество.
Идеальные шторы по вашим размерам, с гарантией качества.
Пошив штор по индивидуальному дизайну, по вашим размерам.
Эксклюзивные шторы на заказ, высокое качество материалов.
Пошив штор на заказ для кухни, с индивидуальным подходом.
Профессиональный пошив штор по вашим размерам, по вашим желанием.
Создание штор на заказ из натуральных тканей, по желанию.
Эксклюзивные шторы на заказ, от профессионалов.
Классические шторы на заказ, с учетом светотени.
Шторы на заказ с учетом ваших пожеланий, с возможностью индивидуального дизайна.
Изготовление штор на заказ на любой вкус, под любой интерьер.
Доступные цены на шторы на заказ, с высоким качеством.
Элегантные шторы на заказ, под любой стиль интерьера.
Индивидуальный пошив штор на заказ, подчеркните стиль вашего помещения.
Шторы на заказ с доставкой и монтажом, по мере необходимости.
Эксклюзивные ткани для пошива штор, под любой стиль.
сшить шторы на заказ сшить шторы на заказ . Prokarniz
Шторы на лесных участках: особенности выбора
шторы в загородном доме шторы в загородном доме .+7 (499) 460-69-87
скачать mostbet https://mostbet6040.ru/ .
mostbet. com mostbet. com .
Закажите уникальные шторы на заказ по лучшим ценам
шторы на заказ шторы на заказ . Ткацкий
watch comics free graphic novels online
1win официальный 1win официальный .
Лучшие шторы для спокойствия и уюта, подчеркните дизайн, советы по выбору штор для дачи, теплота и уют, максимальная функциональность, натуральные ткани для штор, шторы для защиты от солнца, модные тренды в шторном дизайне, выбираем шторы для загородной гостиной, примеры оформления окон с шторами, шторы из натуральных материалов для уюта, автоматические шторы для загородного дома, стили штор для различных комнат, декор и оформление окон в загородном доме, обеспечьте комфорт с нашими шторами, выбор стильных штор для загородного дома, плюсы и минусы разных видов штор, используйте шторы для зонирования пространства, подбираем шторы под сезон
шторы в загородном доме шторы в загородном доме .
Создайте уют с эксклюзивными шторами на заказ
шторы на заказ шторы на заказ . «Ткацкий»
Закажите шторы на любую комнату
сшить шторы на заказ сшить шторы на заказ . Ткацкий
Электроуправляемые деревянные горизонтальные жалюзи
Деревянные горизонтальные жалюзи с электроприводом Деревянные горизонтальные жалюзи с электроприводом . прокарниз
Элегантные шторы для дома за городом
шторы для коттеджа шторы для коттеджа .
1win официальный https://www.1win8006.ru .
1wim 1wim .
lucky jet 1win telegram http://1win8003.ru .
выигрышные live ставки на мостбет http://mostbet5021.ru .
мостбет авиатор мостбет авиатор .
Деревянные горизонтальные жалюзи с электроприводом
Деревянные горизонтальные жалюзи с электроприводом Деревянные горизонтальные жалюзи с электроприводом . прокарниз
Энергосберегающие жалюзи с пультом — экономия и комфорт
жалюзи с пультом жалюзи с пультом . Prokarniz
промокод при регистрации 1win http://1win8007.ru .
Индивидуальный пошив штор, качественный пошив штор..
Создайте уникальный интерьер с пошивом штор, от профессионалов..
Пошив штор на заказ, с использованием лучших тканей..
Пошив штор по вашему дизайну, закажите онлайн..
Профессиональный пошив штор с монтажом, на любой вкус..
Пошив штор премиум-класса, гарантия качества..
Пошив штор по индивидуальному заказу, Позвольте нам помочь..
Шторы на любой вкус и цвет, от ведущих мастеров..
Пошив штор из эксклюзивных тканей, для элитных интерьеров..
Экспертный пошив штор в кратчайшие сроки, звоните прямо сейчас..
Мастера по пошиву штор, гарантия соответствия..
Премиум пошив штор для интерьера, с бесплатной доставкой..
Индивидуальный стиль ваших окон, от профессионалов..
Уникальные шторы с пошивом на заказ, по вашим требованиям..
Пошив штор для любого помещения, с современными технологиями..
Высокое качество и стиль, с гарантией долговечности..
Пошив штор по вашим пожеланиям, с бесплатной консультацией..
пошив штор пошив штор . Ткацкий
mel bet сайт https://melbet1004.ru .
1win.com http://1win5051.ru/ .
Лучшие электроприводы для горизонтальных жалюзи
электропривод для горизонтальных жалюзи электропривод для горизонтальных жалюзи .
1win pariuri http://1win5053.ru .
Моторизированные жалюзи: комфортный свет и приватность
моторизированные жалюзи моторизированные жалюзи . +7 (499) 638-25-37
Моторизированные жалюзи — решение для умного дома
моторизированные жалюзи моторизированные жалюзи . прокарниз
mostbet sikachat http://mostbet8006.ru .
Обновите интерьер с деревянными жалюзи с электроприводом
Деревянные горизонтальные жалюзи с электроприводом Деревянные горизонтальные жалюзи с электроприводом . Prokarniz
мостбет скачать бесплатно http://www.mostbet3024.ru .
mostbet uz haqida https://www.mostbet3025.ru .
металлические пины значки изготовление железных значков
1цшт официальный сайт войти https://1win8009.ru .
Обзоры шторных решений для загородных домов, используя шторы, подбираем шторы для загородного дома, стильный дизайн штор, максимальная функциональность, натуральные ткани для штор, эффективные шторы для загородного дома, стильные решения для штор, как подобрать шторы для спальни в доме за городом, примеры оформления окон с шторами, стильные шторы из льна и холста, удобные системы управления шторами, гармония штор и мебели, декор и оформление окон в загородном доме, сделайте выбор в пользу уютных штор, выбор стильных штор для загородного дома, сравнение видов штор для дачи, используйте шторы для зонирования пространства, идеи сезонного оформления окон
шторы в загородном доме шторы в загородном доме .
1win скачать с официального сайта https://www.1win8020.ru .
Выбираем шторы для дачи и загородного дома
шторы в загородном доме шторы в загородном доме .Ткацкий
Инструкции по уходу за шторами в загородном доме
шторы в загородном доме шторы в загородном доме .Ткацкий
регистрация в 1цшт 1win8010.ru .
как ввести промокод в 1win после регистрации http://1win8019.ru/ .
как зарегистрироваться в 1win как зарегистрироваться в 1win .
Другой глаз остался закрытым. недорого накрутка поведенческих факторов программа Тот вспыхнул от негодования.
Закажите уникальные шторы на заказ, лучшие цены.
Премиальные шторы на заказ, быстро.
Пошив штор по индивидуальному дизайну, под ваш интерьер.
Шторы на заказ с доставкой, по индивидуальному дизайну.
Идеальные шторы на заказ для гостиной, с учетом модных трендов.
Индивидуальный дизайн штор, под любой бюджет.
Пошив штор для нестандартных окон, по желанию.
Эксклюзивные шторы на заказ, от профессионалов.
Современные шторы на заказ, по вашему проекту.
Шторы на заказ с учетом ваших пожеланий, по вашему стилю.
Креативные шторы на заказ, под любой интерьер.
Доступные цены на шторы на заказ, с доставкой по Москве и регионам.
Элегантные шторы на заказ, под ваш бюджет.
Индивидуальный пошив штор на заказ, по вашему проекту.
Пошив штор по индивидуальному дизайну, под ваш вкус.
Высококачественные шторы на заказ, с гарантией долговечности.
сшить шторы на заказ сшить шторы на заказ . Prokarniz
промокод мостбет http://ugilas.com.kg .
Сшить шторы на заказ по индивидуальному проекту, для офиса.
Идеальные шторы по вашим размерам, с гарантией качества.
Создание штор мечты, по вашим размерам.
Эксклюзивные шторы на заказ, высокое качество материалов.
Заказать шторы на заказ для спальни, с индивидуальным подходом.
Надежное изготовление штор на заказ, быстро и качественно.
Создание штор на заказ из натуральных тканей, по желанию.
Эксклюзивные шторы на заказ, от профессионалов.
Современные шторы на заказ, по вашему проекту.
Шторы на заказ с учетом ваших пожеланий, от ведущих мастеров.
Премиальные ткани для штор на заказ, воплощая ваши идеи.
Доступные цены на шторы на заказ, с высоким качеством.
Модные шторы на заказ для вашего дома, под любой стиль интерьера.
Индивидуальный пошив штор на заказ, с использованием лучших тканей.
Создание уникальных штор для любой комнаты, по мере необходимости.
Высококачественные шторы на заказ, под любой стиль.
сшить шторы на заказ сшить шторы на заказ . Prokarniz
авиатор 1вин авиатор 1вин .
Далеко, далеко от Грибоедова, в громадном зале, освещенном тысячесвечовыми лампами, на трех цинковых столах лежало то, что еще недавно было Михаилом Александровичем. создание сайта цена Плохо то, что он иногда внезапно смертен, вот в чем фокус! И вообще не может сказать, что он будет делать в сегодняшний вечер.
– Правда? – Правда. Окна и двери – Вы… вы сколько времени в Москве? – дрогнувшим голосом спросил он.
продажа аккаунтов заработок на аккаунтах
1win bet aviator 1win bet aviator .
как перейти на бонусный счет в 1win https://www.1win10002.ru .
Элегантные жалюзи с пультом для вашего дизайнерского решения
жалюзи с пультом жалюзи с пультом . +7 (499) 638-25-37
прогнозы лаки джет http://www.1win10020.ru .
¡Hola seguidores del casino !
ObtГ©n giros gratis sin depГіsito EspaГ±a para tragamonedas populares. Solo crea tu cuenta y disfruta al instante. ВЎNada que perder!
CГіdigos actualizados tiradas gratis casino EspaГ±a — https://100girosgratissindepositoespana.guru/.
¡Que tengas magníficas resultados asombrosos !
1win online casino http://1win1016.top/ .
Первыми заволновались лихачи, дежурившие у ворот грибоедовского дома. нотариус Китай-город – Доктор, – шепотом спросил потрясенный Рюхин, – он, значит, действительно болен? – О да, – ответил врач.
Очертил Бездомный главное действующее лицо своей поэмы, то есть Иисуса, очень черными красками, и тем не менее всю поэму приходилось, по мнению редактора, писать заново. нотариус метро Сокол Машину.
продажа аккаунтов купить аккаунт
маркетплейс аккаунтов соцсетей аккаунт для рекламы
Нет, я категорически против «Колизея», – гремел на весь бульвар гастроном Амвросий. Балансиры подвески – Тесно мне, – вымолвил Пилат, – тесно мне! Он холодною влажной рукой рванул пряжку с ворота плаща, и та упала на песок.
Функциональные шторы для загородных коттеджей
шторы для коттеджа шторы для коттеджа .
1 вин. https://1win10004.ru .
купить аккаунт маркетплейс аккаунтов соцсетей
маркетплейс аккаунтов соцсетей маркетплейс аккаунтов
Сшить шторы на заказ легко и быстро
сшить шторы на заказ сшить шторы на заказ . «Ткацкий»
мосбет http://mostbet10009.ru .
Уникальные шторы, созданные по вашему желанию
сшить шторы на заказ сшить шторы на заказ . Ткацкий
Закажите уникальные шторы на заказ по лучшим ценам
шторы на заказ шторы на заказ . +7 (499) 460-69-87
Buy Account Account Exchange Service
Account trading platform Secure Account Purchasing Platform
скачать 1win официальный сайт бесплатно http://1win10027.ru .
Создайте уникальный стиль с римскими шторами на заказ
римские шторы на заказ римские шторы на заказ .
Стильные римские шторы для вашей квартиры
римские шторы на заказ римские шторы на заказ .
Пошив штор на заказ
пошив штор на заказ пошив штор на заказ .
бонусный счет 1win как использовать http://1win10028.ru/ .
Индивидуальный пошив штор
пошив штор на заказ пошив штор на заказ .
Secure Account Sales Account Trading
1вин зеркало http://1win10063.ru .
mostbet com login http://mostbet10010.ru/ .
account catalog account catalog
account trading platform account purchase
account selling platform purchase ready-made accounts
account store account catalog
мелбет kg https://www.mostbet10008.ru .
1вин официальный мобильная https://www.1win10066.ru .
buy pre-made account account catalog
purchase ready-made accounts account store
скачать 1win на телефон официальный сайт андроид http://1win10071.ru .
1win зеркало скачать ios http://1win10070.ru/ .
account selling service sell accounts
account sale buy and sell accounts
profitable account sales social media account marketplace
account store account buying service
1 вин ставки на спорт скачать https://1win10076.ru/ .
online account store marketplace for ready-made accounts
sell account account trading platform
melbet сайт http://melbet1012.ru/ .
verified accounts for sale https://accounts-for-sale.org
account market ready-made accounts for sale
secure account purchasing platform https://social-accounts-marketplace.org
топ матч вин https://www.1win10081.ru .
1win зеркало сейчас online http://1win10079.ru/ .
ready-made accounts for sale account buying platform
purchase ready-made accounts account market
account trading platform buy and sell accounts
social media account marketplace account selling platform
1win uganda 1win1031.top .
скачать mostbet https://www.mostbet10013.ru .
цена курсовой заказ курсовых
цены на курсовые kursovie24.ru/
¡Hola aventureros de la fortuna !
Las promociones con 25 giros gratis sin depГіsito estГЎn activas.
Puedes usar los giros en slots populares como Starburst y Book of Dead https://25girosgratissindeposito.xyz sin coste alguno.
¡Que tengas magníficas ganancias sorprendentes !
1win http://www.1win1017.top .
1 win http://1win10085.ru/ .
account buying platform account trading platform
find accounts for sale account market
online account store account sale
1win зеркало скачать ios http://1win10009.ru/ .
best price for Viagra: fast Viagra delivery — legit Viagra online
cheap Viagra online: order Viagra discreetly — buy generic Viagra online
https://modafinilmd.store/# modafinil legality
account store https://accounts-marketplace.xyz
fast Viagra delivery: safe online pharmacy — Viagra without prescription
Нужен номер для ТГ? Предлагаем https://techalpaka.online для одноразовой или постоянной активации. Регистрация аккаунта без SIM-карты, в любом регионе. Удобно, надёжно, без привязки к оператору.
buy generic Cialis online: generic tadalafil — buy generic Cialis online
1win что за контора https://1win10010.ru .