Sht21 Не корректное отображение влажности
Sht21 Не корректное отображение влажности
Здравствуйте.Я Начинающий.Цель - изготовить ТермоГигроСтат с десятыми долями на семисегменте с применением датчика 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
Составлять таблицу Погрешностей ? Может есть другой метод?
Спасибо.Код Фото протеуса во вложении .
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 скачиваний
Господь дает трудный путь тому, кого наделяет талантом.
Re: Sht21 Не корректное отображение влажности
Доброго времени суток.Думаю, что Bascom при таких вычислениях глючит. Интерпретатор он и в Африке интерпретатор.Придется юзать СИ. Нашел проект с SHT21, часами , датчиком давления и матричным дисплеем. Попробую выдернуть нужные фрагменты кода имея поверхностные знания Си и АСМа. Тяжело будет.Более простого проекта не нашел.
Господь дает трудный путь тому, кого наделяет талантом.
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: Sht21 Не корректное отображение влажности
Честно говоря, ничего не понял. Датчик выдает уже готовый результат по и2ц, какие там погрешности при обработке?
Что значит "а датчике 51.8 на семисегментах 51.1 Затем на датчике 51.9 на семисег сразу 52.6" как получено на датчике?
Или это обсуждается сферический протеус, а железа нету?
И кстати, типовая погрешность влажности 2% у этого датчика, а может быть и поболее.
Что значит "а датчике 51.8 на семисегментах 51.1 Затем на датчике 51.9 на семисег сразу 52.6" как получено на датчике?
Или это обсуждается сферический протеус, а железа нету?
И кстати, типовая погрешность влажности 2% у этого датчика, а может быть и поболее.
Меня здесь больше нет
Re: Sht21 Не корректное отображение влажности
Что значит "а датчике 51.8 на семисегментах 51.1 Затем на датчике 51.9 на семисег сразу 52.6" как получено на датчике?
Или это обсуждается сферический протеус, а железа нету?
И кстати, типовая погрешность влажности 2% у этого датчика, а может быть и поболее.
Или это обсуждается сферический протеус, а железа нету?
И кстати, типовая погрешность влажности 2% у этого датчика, а может быть и поболее.
Да, Железа нет. На Датчике прибавляешь 0.1 на семисегметах (ЛСД) прибавляется сразу 1.5. Нет значений 51.2, 51.3 , 51.4. итд . Про погрешность знаю. Дело в Выводе скачками.Пусть бы с погрешностью ,но без скачков. Или Это глюк Протеуса? Температуру же Выводит. Спасибо
Господь дает трудный путь тому, кого наделяет талантом.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Sht21 Не корректное отображение влажности
гдето теряешь точность при вычислениях
например, при умножении или делении на дробь нужнг сначала умножать, а затем делить (и нужно позаботиться об недопущении переполнения регистров, хранящих промежуточные результаты)
например, при умножении или делении на дробь нужнг сначала умножать, а затем делить (и нужно позаботиться об недопущении переполнения регистров, хранящих промежуточные результаты)
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: Sht21 Не корректное отображение влажности
H = H / 65536
это деление на 2^16? замените сдвигом вправо 16
И ещё, может, явно указать Н тип long? (не знаю этого языка, можно так или нет).
это деление на 2^16? замените сдвигом вправо 16
И ещё, может, явно указать Н тип long? (не знаю этого языка, можно так или нет).
Меня здесь больше нет
Re: Sht21 Не корректное отображение влажности
Лонг Выдал ошбку 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 проверить.
не дружит я потом по эксперементирую.
Сдвинул на 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 Не корректное отображение влажности
если после сдвига погрешности-скачки изменились - ну, значит тут что-то не так, и скорее всего, в железе будет нормально.
влево а так же на разное кол-во двигать не надо...
сдвиг вправо - эквивалент делению на 2. соответственно, два сдвига - деление на 4, а 4 - это 2² и т.д. в даташите сказано 2^16, значит сдвиг вправо 16 раз.
сдвиг влево - противоположная операция, т.е. умножение.
При делении/умножении на степени двойки сдвиг предпочтительнее.
влево а так же на разное кол-во двигать не надо...
сдвиг вправо - эквивалент делению на 2. соответственно, два сдвига - деление на 4, а 4 - это 2² и т.д. в даташите сказано 2^16, значит сдвиг вправо 16 раз.
сдвиг влево - противоположная операция, т.е. умножение.
При делении/умножении на степени двойки сдвиг предпочтительнее.
Очень просто. Вместо опроса по и2ц подставите два байта результата, как будто они пришли по шине. Возможно, это получится сразу в дебаггереа как потом 0.1 проверить
Меня здесь больше нет
Re: Sht21 Не корректное отображение влажности
Спасибо за исчерпывающий ответ.С битовой арифметикой в какой то степени я знаком, но придется углубить знания. Что от сдвига меняется я давно заметил(двигал в другом месте) ,только пока знатоки не пнут не решался на железо.
Я имел в виду изготовил железо, ""дыхнул"" на датчик, О влажность показывает.Эталон конечно есть (Повереный, Госреестер), но я же не смогу ""дышать "" с шагом 0.1, чтобы проверить скачки.
За Вашу Фразу (Очень просто. Вместо опроса по и2ц подставите два байта результата, как будто они пришли по шине. Возможно, это получится сразу в дебаггере) я зацеплюсь и буду изучать. Хотя с Басиком навряд ли это получиться. Басик из за отсутствия времени и если честно не глубоких знаний. Построил Сушилку с регулятором на ДТШ 22 он врет аж на 12%. В общем это другая тема.
Я имел в виду изготовил железо, ""дыхнул"" на датчик, О влажность показывает.Эталон конечно есть (Повереный, Госреестер), но я же не смогу ""дышать "" с шагом 0.1, чтобы проверить скачки.
За Вашу Фразу (Очень просто. Вместо опроса по и2ц подставите два байта результата, как будто они пришли по шине. Возможно, это получится сразу в дебаггере) я зацеплюсь и буду изучать. Хотя с Басиком навряд ли это получиться. Басик из за отсутствия времени и если честно не глубоких знаний. Построил Сушилку с регулятором на ДТШ 22 он врет аж на 12%. В общем это другая тема.
Господь дает трудный путь тому, кого наделяет талантом.
-
BlackKilkennyCat
- Собутыльник Кота
- Сообщения: 2905
- Зарегистрирован: Ср ноя 29, 2017 06:58:50
Re: Sht21 Не корректное отображение влажности
Это получится с любым языком. Разница лишь в сложности отладки, что уже может зависеть от языка/средств.
То есть, Вам либо придется делать так:
перед
Dataw = Data1
Shift Dataw , Left , 10
Dataw = Dataw + Data2
выполнить присвоение
Data1 = 12
Data2 = 13
скомпилировать-прошить-посмотреть, затем
Data1 = 12
Data2 = 14 (ну или что там, чтоб 0.1 вышло)
снова скомпилировать-прошить-посмотреть
Это в худшем случае.
Либо, в лучшем случае, Вы эти значения поменяете в режиме отладки, на лету, и пошагово просмотрите, где что и как считается.
То есть, Вам либо придется делать так:
перед
Dataw = Data1
Shift Dataw , Left , 10
Dataw = Dataw + Data2
выполнить присвоение
Data1 = 12
Data2 = 13
скомпилировать-прошить-посмотреть, затем
Data1 = 12
Data2 = 14 (ну или что там, чтоб 0.1 вышло)
снова скомпилировать-прошить-посмотреть
Это в худшем случае.
Либо, в лучшем случае, Вы эти значения поменяете в режиме отладки, на лету, и пошагово просмотрите, где что и как считается.
Меня здесь больше нет
Re: Sht21 Не корректное отображение влажности
Все доходчиво и ясно. в чип и дип SHT21 300р
Господь дает трудный путь тому, кого наделяет талантом.
Re: Sht21 Не корректное отображение влажности

Доброго времени суток. Пока нет железяк, промниторил в протеусе считывание Младшего и Старшего байтов Влажности. Как видно все дело в них. Дата2 это и есть десятые и никакой последовательности,то 12 прибавляет, то 16, потом переполняется .Как я понимаю при 50.0 Дата 2 должно быть 00000000.
Это все таки (имхо) глюк протеуса или басика. Попробую И2С и сшт21 написать на си и промониторить.
Вообще я так и не нашел проекта с данным датчиком ,где отображались бы десятые части.Может производитель и заявляет погрешность 2%.Это погрешность не физическая ,т. е . самого измерительного элемента , А погрешность Цифровая.
Господь дает трудный путь тому, кого наделяет талантом.
- hosturik
- Потрогал лапой паяльник
- Сообщения: 354
- Зарегистрирован: Чт июл 24, 2014 23:09:23
- Откуда: Киев
Re: Sht21 Не корректное отображение влажности
Посмотрите как это сделано в библиотеке там все просто и понятно. Сам ей уже давно пользуюсь, все прекрасно работает.
Естественно функции нужно будет переписать под ваше железо.
https://github.com/Csatacsibe/Si7021_dr ... ter/driver
Естественно функции нужно будет переписать под ваше железо.
https://github.com/Csatacsibe/Si7021_dr ... ter/driver
Re: Sht21 Не корректное отображение влажности
Доьрого времени суток.
Спасибо
Железа пока все еще нет.
Написал ТВИ(И2С) на си. Пока,что Протеус. На шину повесил часы(ds1307) и SHT21.Часы идут,значит протокол работает.SHT21 не считывает данные. Протеус выдает Message ,естественно бесконечно. [SHTX] Command hot implemented or reserved(команда не реализована или зарезервирована)Все вроде по даташиту.

Я где то рядом , а догнать не могу.
Twi.c
Посмотрите как это сделано в библиотеке там все просто и понятно. Сам ей уже давно пользуюсь, все прекрасно работает.
Естественно функции нужно будет переписать под ваше железо.
https://github.com/Csatacsibe/Si7021_dr ... ter/driver
Естественно функции нужно будет переписать под ваше железо.
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;//читаем данные
}
Господь дает трудный путь тому, кого наделяет талантом.
Re: Sht21 Не корректное отображение влажности
Доброго времени суток. Пока , что опять протеус. Код заработал только в режиме НЕприжатия к земле SCL на время замера.Не в Этом суть.Опять скачками выводится Влажность из за корявого считывания младшего байта датчика(Дата2). ВЫВОД. Язык программирования здесь ни при чем, или протеус или САМ ДАТЧИК.
Делаю железо. Попробую гнать по Усарт в комп живую влажность.Повторюсь, не представляю ,как я буду"дышать" на датчик с шагом 0.1. Ведь цель вывести влагу без скачков с шагом 0.1 .Спасибо
Делаю железо. Попробую гнать по Усарт в комп живую влажность.Повторюсь, не представляю ,как я буду"дышать" на датчик с шагом 0.1. Ведь цель вывести влагу без скачков с шагом 0.1 .Спасибо
Господь дает трудный путь тому, кого наделяет талантом.