dimas5552

Алгоритм Обработки Потока Ds18B20 И Ds1820

65 сообщений в этой теме

dimas5552    2

Подскажите, где можно найти датащит на интегральный датчик температуры DS18B20 на русском языке. Или чем отличается DS18B20 от DS1820 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    355

Первый имеет разрешающую способность в 12 или 9 двоичных разрядов (выбирается пользователем), а второй только 9.

В результате у них несколько разный формат выходных данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dimas5552    2

В датащите про формат регистра термпературы написанно так:

+85°C* 0000010101010000 0550h

Число 0000 0101 0101 0000 это 0550h в hex системе но вот 1360 в десятичной... Как тут 85 получилось?

Изменено пользователем dimas5552

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    355

ну вооот..., а говорили что изрядный программист... :)

Как насчет двоичной дроби с фиксированной точкой?

Пример 00000000.0000

В приведенном случае: 01010101.0000 = 0х55 = 85

Изменено пользователем my504

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dimas5552    2

А допер :lol: 0000010101010000 - последнии 5 битов и первые 4 (для DS1820) отбрасываем и получаем 1010101 = 85 (3 бит - десятые)

Изменено пользователем dimas5552

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    355

Десятые - ЧЕТЫРЕ бита, а не три

Пример: 000000000000.1000 = +0,5 градусов

Изменено пользователем my504

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dimas5552    2

Применительно к DS1820 только 3-й бит указывает 0 = 0*С или 1 = +0,5*С. Первые 2 для 1820 всегда нули.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    355

Я предупреждал, что формат данных у них РАЗНЫЙ. У 1820-го формат 00000000 0000000.0 , т.е. только ОДИН бит дробный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dimas5552    2

Там так же написанно:

Для 11-битной разрешающей способности, бит 0 неопределен. Для 10-битной разрешающей способности, биты 1 и 0 неопределенны, и для 9 битной разрешающей способности 2, 1 и 0 неопределенны

А как Вы говорите 1820 - только 9-ти битный то первые 2 бита незадействованны

Изменено пользователем dimas5552

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    355

Так, еще раз.

По пунктам.

DS18B20.

Имеет изменяемое от 9 до 12 разрядов разрешение и при этом ФИКСИРОВАННЫЙ формат: ssss00000000.0000

DS1820 (он же DS18S20).

Имеет НЕИЗМЕННОЕ разрешение в 9 разрядов и ДРУГОЙ по сравнению с DS18B20 формат: ssssssss0000000.0

, где s - sign - знак 1 - минус, 0 - плюс , как водится...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dimas5552    2
DS1820 (он же DS18S20).

Имеет НЕИЗМЕННОЕ разрешение в 9 разрядов и ДРУГОЙ по сравнению с DS18B20 формат: ssssssss0000000.0

Полностью с этим согласен, ибо сейчас спаял термометр, где надо применять 18B20, но за неимением такого пришлось приобрести 1820. Так он всякую ерунду показывает :lol: Теперя нада прошивку под 1820 переписать... Спасибо за инфу, а то я думал что если в 9-и битном режиме (как в 1820) биты 0,1 и 2 незадействованны, а оно вот как на самом деле оказывается ;)

Изменено пользователем dimas5552

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    355

Ну наконец то....

Вы наверное удивитесь, но у меня есть пару собственных конструкций на этих термометрах. Причем в одной из них контроллер сам определяет тип подключенной микросхемы и соответственно изменяет формат обработки...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    556

dimas5552, переименуйте тему согласно правилам форума. Иначе мне её придётся удалить и Вас наказать. У Вас уже было предупреждение по данному пункту правил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dimas5552    2
Вы наверное удивитесь, но у меня есть пару собственных конструкций на этих термометрах. Причем в одной из них контроллер сам определяет тип подключенной микросхемы и соответственно изменяет формат обработки...

А исходник можете скинуть :rolleyes:

dimas5552, переименуйте тему согласно правилам форума

Замечания исправил ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    355

Занятное название у темы... Что Вы называете потоком с этой микросхемы? Типа два регистра прочесть? :lol:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dimas5552    2

А как работать с дробными числами в 18B20? На таблице дробному числу .125 соответствует код 0010 (у +10.125°C) и 1110 у -10.125°C... дроби одинаковые а значения разные :blink:

И как тогда будет выглядеть температура с дробью .625 ?

post-107048-053312400 1285299866_thumb.png

Изменено пользователем dimas5552

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    556
дроби одинаковые а значения разные
А что Вы хотите ? Это же минус. Числа разные :)

Возмите калькулятор виндовский, переведите его в hex, наберите 0 - A2 и нажмите равно. И у Вас получится ...FF5E , как раз то, что написано в таблице. Не понятно почему у Вас такие вопросы возникают.....

код 0010 (у +10.125°C) и 1110 у -10.125°C.
0010 это число 2, 1110 это -2. Всё сходится, числа одинаковые только знак разный :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dimas5552    2

В виндовском калькуляторе -2 получилось так: 1111111111111111111111111111111111111111111111111111111111111110.Да и вообще какие 2, там же значение .125 ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    355

Мдяяяя...

Давайте начнем с того, что Вы самостоятельно изучите дополнительный формат представления чисел.

Несмотря на Ваши "познания" в программировании на ЯВУ больших машин, к великому сожалению в теории чисел у Вас изрядные пробелы... Если не сказать хуже.

Представление двоичных дробей не требует никаких особых разъяснений. Если умножение на 2 дает сдвиг влево, то деление на 2 соответственно вправо.

Значит наличие точки в двоичной дроби собственно при вычислениях ничего не меняет:

00000000.1000= 0,5

00000000.0100=0,25

00000000.0010=0,125

00000000.0001=0,0625

Вычитаем столбиком 0,5-1 и получаем -0,5

00000000.1000

00000001.0000

---------------------

11111111.1000 = -0,5

И запомните, знаковые и беззнаковые числа в дополнительном двоичном коде ОТЛИЧАЮТСЯ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
dimas5552    2

Для того, что бы перевести отрицательную температуру в положительную в двоичном коде для определения числового значения в десятичном формате нужно инветрировать все биты мледшего байта (LS BYTE) и убрать нулевой байт со здвигом битов байта влево. Вот например часть кода из исходника:

comf LS,F ;Преобразование для правильного

incf LS,F ;отображения отрицательных температур

Загвоздку вызвала вторая строка инкремента инвертированной температуры. Все дело в том, что если например датчик пошлет нам значение, например 1100 1110 в младшем байте (полное значение двух байтов: 1111 1111 1100 1110) то это будет число -24.0 в десятичной системе и необходимость инкрементировать это число для правильного отображения неоспаривается (по датащиту этому значению соответствует температура -25 *С), но если датчик пошлет значение 1111 1111 1111 1111 то при инвертировании мы уже получим значение -0.5 (как и есть по датащиту), а если мы его еще и инкрементируем, то получится ошибка в вычислении на целый градус :blink:

Это получается, что на отрицательных температурах около нуля всегда будет погрешность 1 *С (погрешность вычисления) + 0,5 *С (погрешность измерения) = 1.5 *С ..., то есть инкрементировать температуру с целым значением 0 нет необходимости. Да и собственно -1 (11111100) так и перешлется и его тоже выходит инкрементировать не нужно... До какой температуры не требуется инкремент для правильного отображения значений???

Изменено пользователем dimas5552

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    355

Давайте посчитаем вместе.

Пускай речь о DS1820, т.е. формат sssssss0 0000000.0

-0,5 = 11111111 1111111.1 для нахождения модуля из дополнительного представления инвертируем побитно это число и прибавляем 1 (sic!!!) к младшему значащему разряду . Таким образом:

000000000000000.0 + 000000000000000.1 = 000000000000000.1 = 0,5 (минус следует из знака исходного числа).

Повторим незамысловатые вычисления с иным отрицательным числом:

-25 = 11111111 1100111.0

00000000 0011000.1

00000000 0000000.1

------------------------------

00000000 0011001.0 = 0х19 = 25

Из всего этого следует один важный вывод. При дополнительной форме отрицательных чисел положение точки и разрядность МЕНЯТЬ НЕЛЬЗЯ. Т.е. без перерасчета нельзя, а так - можно...:rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    556
В виндовском калькуляторе -2 получилось так: 1111111111111111111111111111111111111111111111111111111111111110
А Вы посмотрите на младшие биты. Ничего они Вам не напоминают ? :) В калькуляторе разрядность чисел большая, по этому и битов много.
Да и вообще какие 2, там же значение .125 ?
Как какие ? Обычные 2. Это число 2, а датчик говорит Вам что температура .125 Т.к. его разрешение .0625 (т.е. цена одного бита = 0.0625 C'), умножаем на наше 2 и получаем .125

Всё просто :)

но если датчик пошлет значение 1111 1111 1111 1111 то при инвертировании мы уже получим значение -0.5 (как и есть по датащиту), а если мы его еще и инкрементируем, то получится ошибка в вычислении на целый градус
При нивертировании мы получим не -0.5 а 0 (00000000 00000000). А после инкремента получим как раз нужное значение (0.5 для 1820 и 0.0625 для 18B20).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: koko76bj
      Я хочу создать терморегулятор, который будет охлаждаться и должен работать с двумя двухскоростными вентиляторами. Целью терморегулятора является регулирование температуры T1 от 80 до 95 градусов, а T2 - от 95 до 110 градусов. Если температура превышает установленное значение T1, реле RL1 включается. Когда температура поднимается выше T1 до заданного значения T2, реле RL1 остается включенным и включается RL2. На дисплее отображается температура реальный Tr и степень, в которой вентиляторы Sp.
      Я пытался что-то сделать, но я начинаю программировать, и я не могу справиться с написанием этой логики.
      Если кто-то может помочь, я буду очень благодарен.
      Это то, что я сделал сейчас.
      Termo2ch.zip
    • Автор: Rinfa
      Здравствуйте. Очень нужна Ваша помощь. 
      Для  работы нужен инфракрасный датчик, который будет работать в диапазоне температур от 30 до 45 градусов ( измерение температуры тела человека), и выдавать результат в mV в аналоговом виде. Причем как можно больше значений в этом диапазоне температур. Еще важно чтобы он был достаточно маленьким. 
      Посоветуйте пожалуйста конкретные модели. 
      Прошу помощи так как сам плохо разбираюсь в теме. Заранее спасибо!
    • Автор: volt968
      вопрос от нуба 
      Хочу бросить в землю пару датчиков, возле трубы с холодной водой,  чтобы контролировать возможное промерзание, но возникло пару вопросов 
      Пока не решил на что буду выводить данные с датчика, просто сейчас стоит задача спаять с ftp + засиликонить в крышку из под бутылки, чтобы только голова торчала и зарыть.  
      Вопрос заключается в сопротивлении, где лучше его ставить ? возле датчика ? по середине трассы или можно возле прибора если оно понадобится ? 
      Максимальная длина витой если что - 25 метров 
      Просто нужно в течении нескольких дней зарыть траншею и переделывать уже не будет возможности   
    • Автор: balistik
      Всем доброго времени суток. Я реальный нуб в ATMEGA. Могу более-менее понять чужой код и из кусков сделать целое. Вопрос такой: реально ли на ATMEGA8 сделать 2 ШИМ (таймер 1 и2) и внутреннее прерывание (по таймеру 0) для чтения данных с DS18B20 на 8Мгц чтобы еще осталось на опрос кнопок и небольшую логику? Я выложу пример кода. По отдельность: ШИМ, прерывания, логика, запись в ЕПРОМ работает. Собираю все вместе - не работает. Пробовал в Протеусе, тоже глючит, да и протеус тормозит. Может кто чего подскажет.
      //#define F_CPU 8000000UL // устанавливаем рабочую частоту контроллера #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/eeprom.h> #include "ds18x20.h" #include "onewire.h" #define MAXSENSORS 1 unsigned int tempint = 0; // переменная для целого значения температуры unsigned int subzero = 0; // переменная отрицательных значений температуры unsigned int clock = 0; //задержка для опроса датчика температуры unsigned int termo_error = 0; //флаг ошибки термодатчика unsigned char regim, R1_SHIBER, R1_VENT, R2_SHIBER, R2_VENT, R3_SHIBER, R3_VENT; //переменные режимов работы volatile char press = 0, pr = 0, pr1 = 0, set = 0; //дополнительные переменные для кнопок #define SHIBER_PB 1 //шибер подачи топлива #define SHIBER_PWM OCR1A #define VENT_PB 2 //вентилятор подачи воздуха #define VENT_PWM OCR1B #define LED1_ON PORTD |= _BV(PD3) // светодиод режим 1 #define LED1_OFF PORTD &= ~_BV(PD3) #define LED2_ON PORTD |= _BV(PD4) // светодиод режим 2 #define LED2_OFF PORTD &= ~_BV(PD4) #define LED3_ON PORTD |= _BV(PD6) // светодиод режим 3 #define LED3_OFF PORTD &= ~_BV(PD6) #define LED4_ON PORTD |= _BV(PD7) // светодиод 4 программирование #define LED4_OFF PORTD &= ~_BV(PD7) #define BUT_M PIND & (1 << PD1) // кнопка MENU #define BUT_U PIND & (1 << PD2) // кнопка UP #define BUT_D PIND & (1 << PD0) // кнопка DOWN unsigned char eep1 EEMEM; // режим работы unsigned char eep2 EEMEM; // режим 1 ШИМ вентилятор unsigned char eep3 EEMEM; //режим 1 ШИМ шибер unsigned char eep4 EEMEM; // режим 2 ШИМ вентилятор unsigned char eep5 EEMEM; // режим 2 ШИМ шибер unsigned char eep6 EEMEM; // режим 3 ШИМ вентилятор unsigned char eep7 EEMEM; // режим 3 ШИМ шибер unsigned char eep8 EEMEM; // флаг первого запуска uint8_t Temperature, szero; //-255 uint8_t nSensors, j; uint8_t cel_frac_bits; uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; uint8_t search_sensors(void) // поиск DS18B20 { uint8_t i; uint8_t id[OW_ROMCODE_SIZE]; uint8_t diff, nSensors; nSensors = 0; for( diff = OW_SEARCH_FIRST; diff != OW_LAST_DEVICE && nSensors < MAXSENSORS ; ) { DS18X20_find_sensor( &diff, &id[0] ); if( diff == OW_PRESENCE_ERR ) { Temperature = 255; szero = 1; break; } if( diff == OW_DATA_ERR ) { Temperature = 255; szero = 1; break; } for (i=0; i<OW_ROMCODE_SIZE; i++) gSensorIDs[nSensors][i]=id[i]; nSensors++; } return nSensors; } void get_temp(int sensor){ // получаем температуру с датчиков DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); j = gSensorIDs[0][sensor]; // family-code for conversion-routine if (DS18X20_read_meas_single(j, &szero, &Temperature, &cel_frac_bits) != DS18X20_OK) { //если не прочиталось то -255 Temperature = 255; szero = 1; } if (DS18X20_read_meas_single(j, &szero, &Temperature, &cel_frac_bits) != DS18X20_OK) { //если не прочиталось то -255 Temperature = 255; szero = 1; } tempint=(int)Temperature; subzero=(int)szero; } void pin_init(void) { //инициализация портов ШИМ DDRB |= (1<<SHIBER_PB) | (1<<VENT_PB); PORTB &= ~((1<<SHIBER_PB) | (1<<VENT_PB)); } void timer0_init(void) { //инициализация таймера для термодатчика TCCR0 |= (1<<CS00); TIMSK |= ( 1 << TOIE0); TCNT0 = 0xFF; } void timer1_init(void) { //инициализация таймера ШИМ шибера TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10); TCNT1 = 0x00; ICR1 = 0xFF; OCR1A = 0x00; OCR1B = 0x00; } void timer2_init(void) { //инициализация таймера ШИМ вентилятора TCCR2 |= (1 << COM21) | (1 << WGM21) | (1 << WGM20) | (1 << CS20); TCNT2 = 0x00; OCR2 = 0x00; } ISR(TIMER0_OVF_vect){ //прерывание таймера 0 для термодатчика if (clock != 4294967295){_delay_us(50);clock++;}else{get_temp(0);clock=0;} } //***************** обработка нажатия кнопок ********************** void buttons(){ if(~BUT_U){if(set == 0)pr++; // кнопка UP if(pr == 10){ // долгое нажатие } _delay_ms(100); }else{ if(pr >= 1 && pr < 10){ // короткое нажатие regim++; if (regim>3){regim=0;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom set = 0; pr = 0; } pr = 0; } if(~BUT_D){if(set == 0)pr1++; // кнопка DOWN if(pr1 == 10){ // длинное нажатие } _delay_ms(100); }else{ if(pr1 >= 1 && pr1 < 10){ // короткое нажатие. //set = 20; regim--; if (regim<0){regim=3;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom _delay_ms(100); set = 0; pr1 = 0; } pr1 = 0; } if(~BUT_M){ // кнопка MENU press++; if(press == 1 && set != 0){set++;} // переход по настройкам if(press >= 100 && set == 0){set = 1; _delay_ms(200);} // ход в настройки if(set == 1) eeprom_write_byte(&eep2, R1_VENT); if(set == 2) eeprom_write_byte(&eep3, R1_SHIBER); if(set == 3) eeprom_write_byte(&eep4, R2_VENT); if(set == 4) eeprom_write_byte(&eep5, R2_SHIBER); if(set == 5) eeprom_write_byte(&eep6, R3_VENT); if(set == 6) eeprom_write_byte(&eep7, R3_SHIBER); if(set > 6){ _delay_ms(100); set = 0; press = 0;} // если включена настройка даты, }else{ if(set == 0 && press >= 1){ // если не вошли в настройки regim++; if (regim>3){regim=0;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom } press = 0; } } //*****************режим настроек******************** void settings(){ //визуальное подтверждение настроек if(press >= 1 && set == 1) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; SHIBER_PWM = R1_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 2) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; VENT_PWM = R1_SHIBER;} //ШИМ вентилятор 0-255 if(press >= 1 && set == 3) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; SHIBER_PWM = R2_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 4) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; VENT_PWM = R2_SHIBER;} //ШИМ вентилятор 0-255 if(press >= 1 && set == 5) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; SHIBER_PWM = R3_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 6) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; VENT_PWM = R3_SHIBER;} //ШИМ вентилятор 0-255 switch(set) // включена настройка { case 1: // настройка R1_VENT if(~BUT_U){R1_VENT++; if(R1_VENT > 254) R1_VENT = 0; _delay_ms(100);} if(~BUT_D){R1_VENT--; if((~BUT_D) && R1_VENT == 0) R1_VENT = 254; _delay_ms(100);} break; case 2: // настройка R1_SHIBER if(~BUT_U){R1_SHIBER++; if(R1_SHIBER > 254) R1_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R1_SHIBER--; if((~BUT_D) && R1_SHIBER == 0) R1_SHIBER = 254; _delay_ms(100);} break; case 3: // настройка R2_VENT if(~BUT_U){R2_VENT++; if(R2_VENT > 254) R2_VENT = 0; _delay_ms(100);} if(~BUT_D){R2_VENT--; if((~BUT_D) && R2_VENT == 0) R2_VENT = 254; _delay_ms(100);} break; case 4: // настройка R2_SHIBER if(~BUT_U){R2_SHIBER++; if(R2_SHIBER > 254) R2_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R2_SHIBER--; if((~BUT_D) && R2_SHIBER == 0) R2_SHIBER = 254; _delay_ms(100);} break; case 5: // настройка R3_VENT if(~BUT_U){R3_VENT++; if(R3_VENT > 254) R3_VENT = 0; _delay_ms(100);} if(~BUT_D){R3_VENT--; if((~BUT_D) && R3_VENT == 0) R3_VENT = 254; _delay_ms(100);} break; case 6: // настройка R3_SHIBER if(~BUT_U){R3_SHIBER++; if(R3_SHIBER > 254) R3_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R3_SHIBER--; if((~BUT_D) && R3_SHIBER == 0) R3_SHIBER = 254; _delay_ms(100);} break; } } int main(){ /*******************************настройка переферии******************************/ cli(); ow_set_bus(&PIND, &PORTD, &DDRD, PD5); // иництализация протокола 1-wire nSensors = search_sensors(); // поиск датчиков DS18B20 DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); //включаем преобразование температуры pin_init(); //timer0_init(); timer1_init(); timer2_init(); _delay_ms(5); if(eeprom_read_byte(&eep8) != 1){ // читаем eeprom, если там мусор (первый запуск), пишем свои данные eeprom_write_byte(&eep1, 0); // режим работы eeprom_write_byte(&eep2, 150); // режим 1 ШИМ вентилятор eeprom_write_byte(&eep3, 100); //режим 1 ШИМ шибер eeprom_write_byte(&eep4, 200); //режим 2 ШИМ вентилятор eeprom_write_byte(&eep5, 150); //режим 2 ШИМ шибер eeprom_write_byte(&eep6, 230); //режим 3 ШИМ вентилятор eeprom_write_byte(&eep7, 200); //режим 3 ШИМ шибер eeprom_write_byte(&eep8, 1); // флаг первого запуска } //читаем настройки из памяти regim = eeprom_read_byte(&eep1); // читаем режим работы из eeprom R1_VENT = eeprom_read_byte(&eep2); // читаем режим 1 ШИМ вентилятор из eeprom R1_SHIBER = eeprom_read_byte(&eep3); //читаем режим 1 ШИМ шибер R2_VENT = eeprom_read_byte(&eep4); //читаем режим 2 ШИМ вентилятор R1_SHIBER = eeprom_read_byte(&eep5); //читаем режим 2 ШИМ шибер R3_VENT = eeprom_read_byte(&eep6); //читаем режим 3 ШИМ вентилятор R1_SHIBER = eeprom_read_byte(&eep7); //читаем режим 3 ШИМ шибер sei(); _delay_ms(5); /**********************************инициализация ШИМ*************************************/ while(1){ //if (tempint=255) {LED1_ON;LED2_OFF;LED3_ON;termo_error=1;} else {termo_error=0;}//выводим код ошибки датчика темппературы buttons();//обработик нажатия кнопок if (termo_error == 0){//блокировка по термодатчику if(set == 0) { //нормальный режим работы if (regim == 0){ //режим работы 0 LED1_OFF; LED2_OFF; LED3_OFF; LED4_OFF; SHIBER_PWM = 0; //ШИМ шибер 0-255 VENT_PWM = 0; //ШИМ вентилятор 0-255 } if (regim == 1){ //режим работы 1 LED1_ON; LED2_OFF; LED3_OFF; LED4_OFF; VENT_PWM = R1_VENT; //ШИМ вентилятор 0-255 if (tempint >=40) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R1_SHIBER; //ШИМ шибер 0-255 } } if (regim == 2){ //режим работы 2 LED1_OFF; LED2_ON; LED3_OFF; LED4_OFF; VENT_PWM = R2_VENT; //ШИМ вентилятор 0-255 if (tempint >=60) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R2_SHIBER; //ШИМ шибер 0-255 } } if (regim == 3){ //режим работы 3 LED1_OFF; LED2_OFF; LED3_ON; LED4_OFF; VENT_PWM = R3_VENT; //ШИМ вентилятор 0-255 if (tempint >=80) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R3_SHIBER; //ШИМ шибер 0-255 } } } }else{ SHIBER_PWM=0; VENT_PWM=0; } if(set != 0) settings();//вход в настройки } //return 0; }  
    • Автор: ximik_se
      Всем привет.

      Решил сделать небольшую домашнюю метеостанцию.

      Есть приемник с экраном, куда выводится инфа (построено на ATMEGA 328P) и есть передатчик, который посылает инфу по возудху (построено на ATtiny85).

      В передатчике использую обычные DHT22. В принципе качество чуть ниже среднего. Но главный недостаток - порой сбоит, присылая данные в 2 раза больше предидущих, потом опять приходит в себя. и так повторяется постоянно.

      При этом время между измерениями не меньше 20 сек.

      В общем заказал я себе с Китаюшки более точные датчики - 

      CJMCU-1080 HDC1080
      Вещица прекрасная, но общается по I2C.

      А библиотеку рабочую под нее я смог найти только одну "ClosedCube_HDC1080.h" и никаких модификаций под ATtiny я найти не смог.

      Для ее работы соответственно нужен Wire.h

      В общем решил я его поковырять самостоятельно, хоть и не прогер. Забрался во внутренности ClosedCube_HDC1080.cpp и везде заменил Wire на TinyWireM (некий аналог Wire для ATtiny).

      И у меня даже получилось считывать валжность, но вот вместо температуры приходит гадость. Ибо при компиляции Arduino IDE ругалась на строку (я ее ниже в коде закомментировал)
      uint8_t buf[4]; for (int i = 1; i < (seconds*66); i++) { TinyWireM.beginTransmission(_address); TinyWireM.write(0x00); TinyWireM.endTransmission(); delay(20); TinyWireM.requestFrom(_address, (uint8_t)4); // TinyWireM.readBytes(buf, (size_t)4); } Ошибку пишет следующую:

      \ClosedCube_HDC1080.cpp: In member function 'void ClosedCube_HDC1080::heatUp(uint8_t)':

      \ClosedCube_HDC1080.cpp:81:13: error: 'class USI_TWI' has no member named 'readBytes'

      TinyWireM.readBytes(buf, (size_t)4);
      Может есть ребята более понимающие в коде и сумеющие победить эту проблему, чтобы и температуру этот датчик смог передавать через ATtiny85.

      Вот полный текст файла ClosedCube_HDC1080.cpp (уже замененный ну и строчка закоментирована):
      #include <TinyWireM.h> #include "ClosedCube_HDC1080.h" ClosedCube_HDC1080::ClosedCube_HDC1080() { } void ClosedCube_HDC1080::begin(uint8_t address) { _address = address; TinyWireM.begin(); // Heater off, 14 bit Temperature and Humidity Measurement Resolution TinyWireM.beginTransmission(_address); TinyWireM.write(CONFIGURATION); TinyWireM.write(0x0); TinyWireM.write(0x0); TinyWireM.endTransmission(); } HDC1080_Registers ClosedCube_HDC1080::readRegister() { HDC1080_Registers reg; reg.rawData = (readData(CONFIGURATION) >> 8); return reg; } void ClosedCube_HDC1080::writeRegister(HDC1080_Registers reg) { TinyWireM.beginTransmission(_address); TinyWireM.write(CONFIGURATION); TinyWireM.write(reg.rawData); TinyWireM.write(0x00); TinyWireM.endTransmission(); delay(10); } void ClosedCube_HDC1080::heatUp(uint8_t seconds) { HDC1080_Registers reg = readRegister(); reg.Heater = 1; reg.ModeOfAcquisition = 1; writeRegister(reg); uint8_t buf[4]; for (int i = 1; i < (seconds*66); i++) { TinyWireM.beginTransmission(_address); TinyWireM.write(0x00); TinyWireM.endTransmission(); delay(20); TinyWireM.requestFrom(_address, (uint8_t)4); // TinyWireM.readBytes(buf, (size_t)4); } reg.Heater = 0; reg.ModeOfAcquisition = 0; writeRegister(reg); } float ClosedCube_HDC1080::readT() { return readTemperature(); } float ClosedCube_HDC1080::readTemperature() { uint16_t rawT = readData(TEMPERATURE); return (rawT / pow(2, 16)) * 165 - 40; } float ClosedCube_HDC1080::readH() { return readHumidity(); } float ClosedCube_HDC1080::readHumidity() { uint16_t rawH = readData(HUMIDITY); return (rawH / pow(2, 16)) * 100; } uint16_t ClosedCube_HDC1080::readManufacturerId() { return readData(MANUFACTURER_ID); } uint16_t ClosedCube_HDC1080::readDeviceId() { return readData(DEVICE_ID); } uint16_t ClosedCube_HDC1080::readData(uint8_t pointer) { TinyWireM.beginTransmission(_address); TinyWireM.write(pointer); TinyWireM.endTransmission(); delay(9); TinyWireM.requestFrom(_address, (uint8_t)2); byte msb = TinyWireM.read(); byte lsb = TinyWireM.read(); return msb << 8 | lsb; }  
  • Сообщения

    • Мне не понравились ни первый,ни второй,ни третий
    • Мне довелось ремонтировать 3 модели класса А. Dual CV-1260, Yamaha-A700 и Yamaha-A1000. Так что погонял я их от души с генератором и нагрузкой! Dual, несмотря, что немецкая разработка, сборка японская. Yamaha, как 700, так и 1000 имела переключатель в виде клавиши с фиксацией класс А <----> АВ. Тысячная - довольно серьёзная машина! В выпрямиловке банки по 33000 микрофарад. А на выхлопе 2 комплиментарных пары Toshiba 2SA1333 ---2SC3370. Достать смог только через пол года! Радиатор сделан буквой П. В классе А нагревается довольно сильно! Когда подаёшь сигнал на вход температура падает. С 4 Ом колонками звук не порадовал! А 8 Ом Магнатами очень даже неплохо! У Dual в классе А звук с "германским акцентом", специфический. Мне он больше понравился. Хорошая сцена. Прозрачность без каких либо недостатков! Но диск электросчётчика крутился, как мотор электродвигателя. Уж очень он суровый этот класс А!
    • Так сделайте себе из говна и веток. Что вам мешает? 
    • Их ещё называю "яйца". Спасибо, поржал, когда представил, как это будет выглядеть. По теме: Корпус от вот такого разъёма выглядит довольно презентабельно. Внутрь можно залить клей или герметик. Можно ещё два корпуса склеить торцами.
      Стоят копейки, да и вообще в хозяйстве пригодятся.  
    • А синус-то кривенький... "Чистым" такой никак не назовешь...
    • Подскажите можно ли купить импульсный двухполярный БП на +\-20 В и 2.5 А? Или 2 БП по 15 В последовательно соединить и получить среднюю точку?
    • Да, только интересно другое, чтобы оно стекало все в трубу, а то я помню как весной оно лило прямо из стыков и даже просто по стене, а потом через козырек и вниз к тому же самому соседу прямо на его незастекленный балкон на 1 этаже. А он приходил ко мне наверх и говорил что я газовой горелкой грею жолоб.  Ну тогда уже легче включать потихоньку и по выходным. Либо периодически, чтобы сильно не намерзало. Просто если дождаться весны, там и без провода будет дикий поток воды. Все равно все в уклон и качество стыков упирается. Иначе оно будет лить куда угодно только не в трубу.