Sht21 Не корректное отображение влажности

Обсуждаем цифровые устройства...
Ответить
Аватара пользователя
Reasta
Родился
Сообщения: 9
Зарегистрирован: Вт окт 29, 2019 11:28:49
Откуда: Увельский

Sht21 Не корректное отображение влажности

Сообщение Reasta »

Здравствуйте.Я Начинающий.Цель - изготовить ТермоГигроСтат с десятыми долями на семисегменте с применением датчика SHT21.Собрал схему в протеусе 7.10.Температуру отображает коректно(в некоторых диапазонах погрешность 0.1). Влажность отстает на 1 %... Без десятых долей это еще приемлемо. С десятыми долями это ужасно. На датчике 51.8 на семисегментах 51.1 Затем на датчике 51.9 на семисег сразу 52.6. Сделал ЛСД для отлатки. На нем такой же скачек. В некоторых диапазонах погрещность менше . Как с этим бороться? Искал решение,с бубном плясал.
Составлять таблицу Погрешностей ? Может есть другой метод?
Спасибо.Код Фото протеуса во вложении .
I2cstart
I2cwbyte &H80 'адрес микросхемы-датчика SHT21
I2cwbyte &HE5 'выбор измерения влажности в нормальном режиме
Waitms 100 'измерение
I2cstart
I2cwbyte &H81 'чтение результата измерения
I2crbyte Data1 , Ack 'прием старшего байта, ждем слудующий байт
I2crbyte Data2 , Ack 'прием младшего байта
I2crbyte Crc , Nack 'прием байта контрольной суммы (можно на него забить)
I2cstop 'конец общения
' C Даташита
Dataw = Data1
Shift Dataw , Left , 10
Dataw = Dataw + Data2
H = Dataw * 125
H = H / 65536
H = H - 6

T = T * 10 ' T Single Из Т=36,7ххххххх получаем Т=367,хххххх
Cb = Round(t) ' Cb Integer Получаем 367 ровно
Cifri(1) = Cb \ 100 ' Выводим на первую цифру (десятки) тройку Cifri(x)integer
Cifri(5) = cb mod 10 ' Выводим десятую часть Семерку (после точки)
t3 = Cifri(1)* 100 ' t3 integer получаем сотни 300 без 67
cb = cb - t3 ' получаем 67 без 300
Cifri(2) = Cb \ 10 ' Выводим еденици шестерку из 67
' Т выводит хорошо с Н, ниже проблема
H = H * 10
Cb = Round(h)
Cifri(3) = Cb \ 100
Cifri(6) = Cb mod 10
h3 = Cifri(3)* 100
cb = cb - h3

Cifri(4) = Cb \ 10
Cls 'LCD Для отладки
Locate 1 , 1
Lcd h
Wait 1
Вложения
Sht21.png
(21.19 КБ) 213 скачиваний
SHT21_Proteus.png
(34.18 КБ) 226 скачиваний
Господь дает трудный путь тому, кого наделяет талантом.
Аватара пользователя
Reasta
Родился
Сообщения: 9
Зарегистрирован: Вт окт 29, 2019 11:28:49
Откуда: Увельский

Re: Sht21 Не корректное отображение влажности

Сообщение Reasta »

Доброго времени суток.Думаю, что Bascom при таких вычислениях глючит. Интерпретатор он и в Африке интерпретатор.Придется юзать СИ. Нашел проект с SHT21, часами , датчиком давления и матричным дисплеем. Попробую выдернуть нужные фрагменты кода имея поверхностные знания Си и АСМа. Тяжело будет.Более простого проекта не нашел.
Господь дает трудный путь тому, кого наделяет талантом.
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Re: Sht21 Не корректное отображение влажности

Сообщение BlackKilkennyCat »

Честно говоря, ничего не понял. Датчик выдает уже готовый результат по и2ц, какие там погрешности при обработке?
Что значит "а датчике 51.8 на семисегментах 51.1 Затем на датчике 51.9 на семисег сразу 52.6" как получено на датчике?
Или это обсуждается сферический протеус, а железа нету?

И кстати, типовая погрешность влажности 2% у этого датчика, а может быть и поболее.
Меня здесь больше нет
Аватара пользователя
Reasta
Родился
Сообщения: 9
Зарегистрирован: Вт окт 29, 2019 11:28:49
Откуда: Увельский

Re: Sht21 Не корректное отображение влажности

Сообщение Reasta »

Что значит "а датчике 51.8 на семисегментах 51.1 Затем на датчике 51.9 на семисег сразу 52.6" как получено на датчике?
Или это обсуждается сферический протеус, а железа нету?

И кстати, типовая погрешность влажности 2% у этого датчика, а может быть и поболее.

Да, Железа нет. На Датчике прибавляешь 0.1 на семисегметах (ЛСД) прибавляется сразу 1.5. Нет значений 51.2, 51.3 , 51.4. итд . Про погрешность знаю. Дело в Выводе скачками.Пусть бы с погрешностью ,но без скачков. Или Это глюк Протеуса? Температуру же Выводит. Спасибо
Господь дает трудный путь тому, кого наделяет талантом.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Sht21 Не корректное отображение влажности

Сообщение Ivanoff-iv »

гдето теряешь точность при вычислениях
например, при умножении или делении на дробь нужнг сначала умножать, а затем делить (и нужно позаботиться об недопущении переполнения регистров, хранящих промежуточные результаты)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Re: Sht21 Не корректное отображение влажности

Сообщение BlackKilkennyCat »

H = H / 65536
это деление на 2^16? замените сдвигом вправо 16

И ещё, может, явно указать Н тип long? (не знаю этого языка, можно так или нет).
Меня здесь больше нет
Аватара пользователя
Reasta
Родился
Сообщения: 9
Зарегистрирован: Вт окт 29, 2019 11:28:49
Откуда: Увельский

Re: Sht21 Не корректное отображение влажности

Сообщение Reasta »

Лонг Выдал ошбку Error : 63 Line : 85 Integer or Long expected for ABS() .Может С какими то переменными
не дружит я потом по эксперементирую.
Сдвинул на 16 .
Dataw = Data1
Shift Dataw , Left ,10'
Dataw = Dataw + Data2
H = Dataw * 125
''''''H = H / 65536
Shift H, right ,16
H = H - 6 Погрешность и скачки увеличились.
Двигал на 12 13 14 15 17 на всякий случай Влево двигал То же на всякий случай. Сделать железо, а как потом 0.1 проверить.
Господь дает трудный путь тому, кого наделяет талантом.
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Re: Sht21 Не корректное отображение влажности

Сообщение BlackKilkennyCat »

если после сдвига погрешности-скачки изменились - ну, значит тут что-то не так, и скорее всего, в железе будет нормально.
влево а так же на разное кол-во двигать не надо...
сдвиг вправо - эквивалент делению на 2. соответственно, два сдвига - деление на 4, а 4 - это 2² и т.д. в даташите сказано 2^16, значит сдвиг вправо 16 раз.
сдвиг влево - противоположная операция, т.е. умножение.
При делении/умножении на степени двойки сдвиг предпочтительнее.
а как потом 0.1 проверить
Очень просто. Вместо опроса по и2ц подставите два байта результата, как будто они пришли по шине. Возможно, это получится сразу в дебаггере
Меня здесь больше нет
Аватара пользователя
Reasta
Родился
Сообщения: 9
Зарегистрирован: Вт окт 29, 2019 11:28:49
Откуда: Увельский

Re: Sht21 Не корректное отображение влажности

Сообщение Reasta »

Спасибо за исчерпывающий ответ.С битовой арифметикой в какой то степени я знаком, но придется углубить знания. Что от сдвига меняется я давно заметил(двигал в другом месте) ,только пока знатоки не пнут не решался на железо.
Я имел в виду изготовил железо, ""дыхнул"" на датчик, О влажность показывает.Эталон конечно есть (Повереный, Госреестер), но я же не смогу ""дышать "" с шагом 0.1, чтобы проверить скачки.
За Вашу Фразу (Очень просто. Вместо опроса по и2ц подставите два байта результата, как будто они пришли по шине. Возможно, это получится сразу в дебаггере) я зацеплюсь и буду изучать. Хотя с Басиком навряд ли это получиться. Басик из за отсутствия времени и если честно не глубоких знаний. Построил Сушилку с регулятором на ДТШ 22 он врет аж на 12%. В общем это другая тема.
Господь дает трудный путь тому, кого наделяет талантом.
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

Re: Sht21 Не корректное отображение влажности

Сообщение BlackKilkennyCat »

Это получится с любым языком. Разница лишь в сложности отладки, что уже может зависеть от языка/средств.
То есть, Вам либо придется делать так:
перед
Dataw = Data1
Shift Dataw , Left , 10
Dataw = Dataw + Data2

выполнить присвоение
Data1 = 12
Data2 = 13
скомпилировать-прошить-посмотреть, затем
Data1 = 12
Data2 = 14 (ну или что там, чтоб 0.1 вышло)
снова скомпилировать-прошить-посмотреть
Это в худшем случае.
Либо, в лучшем случае, Вы эти значения поменяете в режиме отладки, на лету, и пошагово просмотрите, где что и как считается.
Меня здесь больше нет
Аватара пользователя
Reasta
Родился
Сообщения: 9
Зарегистрирован: Вт окт 29, 2019 11:28:49
Откуда: Увельский

Re: Sht21 Не корректное отображение влажности

Сообщение Reasta »

Все доходчиво и ясно. в чип и дип SHT21 300р
Господь дает трудный путь тому, кого наделяет талантом.
Аватара пользователя
Reasta
Родился
Сообщения: 9
Зарегистрирован: Вт окт 29, 2019 11:28:49
Откуда: Увельский

Re: Sht21 Не корректное отображение влажности

Сообщение Reasta »

Изображение
Доброго времени суток. Пока нет железяк, промниторил в протеусе считывание Младшего и Старшего байтов Влажности. Как видно все дело в них. Дата2 это и есть десятые и никакой последовательности,то 12 прибавляет, то 16, потом переполняется .Как я понимаю при 50.0 Дата 2 должно быть 00000000.

Это все таки (имхо) глюк протеуса или басика. Попробую И2С и сшт21 написать на си и промониторить.
Вообще я так и не нашел проекта с данным датчиком ,где отображались бы десятые части.Может производитель и заявляет погрешность 2%.Это погрешность не физическая ,т. е . самого измерительного элемента , А погрешность Цифровая.
Господь дает трудный путь тому, кого наделяет талантом.
Аватара пользователя
hosturik
Потрогал лапой паяльник
Сообщения: 354
Зарегистрирован: Чт июл 24, 2014 23:09:23
Откуда: Киев

Re: Sht21 Не корректное отображение влажности

Сообщение hosturik »

Посмотрите как это сделано в библиотеке там все просто и понятно. Сам ей уже давно пользуюсь, все прекрасно работает.
Естественно функции нужно будет переписать под ваше железо.
https://github.com/Csatacsibe/Si7021_dr ... ter/driver
Аватара пользователя
Reasta
Родился
Сообщения: 9
Зарегистрирован: Вт окт 29, 2019 11:28:49
Откуда: Увельский

Re: Sht21 Не корректное отображение влажности

Сообщение Reasta »

Доьрого времени суток.
Посмотрите как это сделано в библиотеке там все просто и понятно. Сам ей уже давно пользуюсь, все прекрасно работает.
Естественно функции нужно будет переписать под ваше железо.
https://github.com/Csatacsibe/Si7021_dr ... ter/driver

Спасибо
Железа пока все еще нет.
Написал ТВИ(И2С) на си. Пока,что Протеус. На шину повесил часы(ds1307) и SHT21.Часы идут,значит протокол работает.SHT21 не считывает данные. Протеус выдает Message ,естественно бесконечно. [SHTX] Command hot implemented or reserved(команда не реализована или зарезервирована)Все вроде по даташиту.
Изображение
Я где то рядом , а догнать не могу.

    Ds1307_Sht21.c
    while(1)
    {
    //DS1307
    I2C_StartCondition();//START
    I2C_SendByte(0b11010000); // Отправим в шину адрес устройства + бит записи 0
    I2C_SendByte(0);// Отправим байт данных, где расположен самый первый регистр
    I2C_StopCondition();//STOP
    _delay_ms(300);
    I2C_StartCondition(); //START
    I2C_SendByte(0b11010001); //Отправим в шину адрес устройства + бит чтения 1
    sec = I2C_ReadByte();//ask
    min = I2C_ReadByte();
    hour = I2C_ReadByte();
    day = I2C_ReadByte();
    date = I2C_ReadByte();
    month = I2C_ReadByte();
    year = I2C_ReadLastByte();//nask
    I2C_StopCondition(); //STOP
    // SHT21
    I2C_StartCondition();//START
    I2C_SendByte(0x80); // Отправим в шину адрес устройства + бит записи 0
    I2C_SendByte(0xE3); // выбор измерения T в нормальном режиме
    _delay_ms (300);
    I2C_StartCondition();// START
    I2C_SendByte(0x81); //Отправим в шину адрес устройства + бит чтения 1
    _delay_ms(300);
    Data1 = I2C_ReadByte();//ask
    Data2 = I2C_ReadByte();
    crc = I2C_ReadLastByte();//nask контрольная сумма
    I2C_StopCondition();//STOP
    //Вывод LCD
    sec = RTC_ConvertFromDec(sec);
    и так далее...

Twi.c
    #include "twi.h"

    void I2C_Init (void) // инициализ.тви
    {
    TWSR = 0;
    TWBR = 0x20;//при 8 мгц получактся 100 кгц
    TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);

    }


    void I2C_StartCondition(void)// старт
    {
    TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT)));// подождем пока установится TWIN
    }

    void I2C_StopCondition(void)//стоп
    {
    TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
    }

    void I2C_SendByte(unsigned char c) // передача
    {
    TWDR = c;//записываем байт в регистр данных
    TWCR = (1<<TWINT)|(1<<TWEN);//включаем передачу байта
    while (!(TWCR & (1<<TWINT)));//подождем пока установится TWIN
    }

    unsigned char I2C_ReadByte(void)// чтение ask
    {
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
    while (!(TWCR & (1<<TWINT)));//подождем пока установится TWIN
    return TWDR;//читаем данные
    }

    unsigned char I2C_ReadLastByte(void)//чтение nask
    {
    TWCR = (1<<TWINT)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT)));//подождем пока установится TWIN
    return TWDR;//читаем данные
    }
Где же не доделал.Спасибо
Господь дает трудный путь тому, кого наделяет талантом.
Аватара пользователя
Reasta
Родился
Сообщения: 9
Зарегистрирован: Вт окт 29, 2019 11:28:49
Откуда: Увельский

Re: Sht21 Не корректное отображение влажности

Сообщение Reasta »

Доброго времени суток. Пока , что опять протеус. Код заработал только в режиме НЕприжатия к земле SCL на время замера.Не в Этом суть.Опять скачками выводится Влажность из за корявого считывания младшего байта датчика(Дата2). ВЫВОД. Язык программирования здесь ни при чем, или протеус или САМ ДАТЧИК.
Делаю железо. Попробую гнать по Усарт в комп живую влажность.Повторюсь, не представляю ,как я буду"дышать" на датчик с шагом 0.1. Ведь цель вывести влагу без скачков с шагом 0.1 .Спасибо
Господь дает трудный путь тому, кого наделяет талантом.
Ответить

Вернуться в «Цифровая техника»