Официальный сайт компании Arduino по адресу arduino.cc
Датчик температуры/влажности MTH02
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Всем привет. Я тут новичек и с ардуино не так долго общаюсь. Пока успел только разобрать ИК протокол и написать библиотеку под своей кондей, больше пока ни с чем плотно не работал. Я не электроньщик, я скорее программер. (хотя по специальности сетевой/системный инженер)
Сейчас возникла проблема - купил датчик температуры/влажности MHT02, только потом, когда он пришел, уведел, что по нему никакой информации в интернете нету, кроме даташита и тот кажется кривым.. =( (вот тут даташит: http://www.amatek.com/documents/MTH02.pdf ).
Не получается собрать с него никакой инфы. Пока хочу собрать хотя бы длительности имульсов, дальше уже в 0/1 их преобразовать, думаю не будет проблем, ну и дальнешие манипуляции с данными - уже другая задача.
Как я его подключил к ардуине (у меня ардуино уно): по даташиту
1 котнакт слева (если смотреть на него так, как показано в даташите) подключил к +5 ардуины
2 контакт слева подключил к земле ардуины
3 контакт слева подключил к 8му порту ардуины (как я понял подача на него LOW запускает передачу данных с дата-пина датчика)
4 контакт (дата-пин датчика) подключил к 7му порту ардуины (на инпут, естественно)
Пытаюсь получить данные вот таким скетчем (пока по возможности наипростейший)
#define dataPin 7 #define rstPin 8 unsigned long pulseTime; void setup() { Serial.begin(9600); Serial.println("Begin: "); pinMode (rstPin, OUTPUT); pinMode (dataPin, INPUT); digitalWrite (rstPin, HIGH); } void loop() { digitalWrite(rstPin, LOW); delay(10); if (digitalRead(dataPin) == HIGH) { Serial.println("High!"); } else { Serial.println("LOW!"); } for (int i = 0; i < 30; i++) { if (digitalRead(dataPin) == HIGH) { Serial.println("High!"); } else { Serial.println("LOW!"); } pulseTime = pulseIn(dataPin, HIGH); Serial.print(pulseTime); Serial.print(" "); delay(1); } digitalWrite(rstPin, HIGH); Serial.println(""); delay(5000); }
Но в итоге на дата-пине датчика всегда, постоянно HIGH...... что самое интересное.., даже когда датчик вообще отключен - на 7 пине ардуино всегда HIGH.
Что я делаю не так, помогите плиз....
Посмотрите даташит на его измерительный элемент - https://www.hdk.co.jp/pdf/eng/e1321aa.pdf
Может, поможет.
Не это чисто даташит на датчик влажности - мне до разбора влажность/температура еще далеко, мне хотя бы сейчас вообще данные получить. Это же не правильно что на дата-пине всегда High - как данные то передаются?!
На его упаковке в скобках еще указано SHT10 - но библиотека от SHT10 категорически не подходит, пробовал и в ардуино заливать (выдает всегда -40.1 и 6.9) да и просто читая код библиотеки - понятно, что под даташит моего модуля он не подходит.
ЗЫ: какие-то подвижки вроде появились заменил дата-пин в ардуине на 4й, теперь при отключении провода, он хотя бы пишет - LOW, а если провод пошевилить (он отключен от датчика, но все еще торчит в ардуине) то иногда и HIGH проскакивают, особенно если докаснуться до контакта провода пальцем. (наводки от пальцев и ардуина считает это как потенциал на контакте? )
(он отключен от датчика, но все еще торчит в ардуине) то иногда и HIGH проскакивают, особенно если докаснуться до контакта провода пальцем. (наводки от пальцев и ардуина считает это как потенциал на контакте? )
Это не особенность ардуино, а общее правило электроники - любой никуда не подключённый высокоимпедансный вход является просто антенной для помех.
Высокоимпедансный вход всегда должен иметь какое-то значение. Например, если Вы ему скажете не INPUT, а INPUT_PULLUP - он всегда будет иметь значение HIGH пока на него кто-нибудь явно LOW не подаст. А если Вы соедините его резистором с землёй - на нём всегда будет LOW пока кто-нибудь не подаст HIGH.
Кстати, в INPUT_PULLUP нет никакой магии. Там просто внутри микросхемы есть резистор, соединяющий пин с питанием, и таким режимом Вы его включаете. Можете внешним резистором с питанием соединить. Разницы никакой.
Если же он никуда не притянут, на нём по сути случайное значение.
Еще добавилась инфа - если порт на инпут подключать через подтягивающий резистор (насколько я помню это так для ардуины) используя константу INPUT_PULLUP, то шевелние провода и прикасновения к нему мальцами нечего не дают - т.е. всегда HIGH.
Про это Мы с Вами параллельно писали :)
Так что же получается.... датчик - труп?! =(
Не знаю. А что там за ещё два входа?
Можете сделать крупное фото так. чтобы дорожки были видны с обеих сторон? Посмотреть бы на него и понять к каким ногам измерительного элемента там всё подключено. На сам элемент даташит я Вам давал.
Дорожек не видно даже держа его перед глазами (почти не видно) =( Но фото попробую сделать.
Еще 2 входа там на дополнительные датчики температуры (так в даташите написано)
Вы мне давали даташит на датчик влажности, с другой стороны на этой платке еще микросхемка - видимо это и есть датчик температуры совмещеный с небольшим процессором... но он NONAME, на нем вообще никаких опознавательных знаков.
Что самое интересное, есть еще китайский даташит на этот модуль, так там 3й пин вообще NC.... (вот даташит http://www.elecrow.com/download/MTH02A%20DATASHEET.pdf )
Не понимаю, как их смотреть. Картинки мелкие, а при нажатии на них реклама лезет и ничего не увеличивается.
Там достаточно на картинку нажать - она увеличится. Куда посоветуете залить? Я как-то не пользуюсь хостингами картинок....
Так нажимал - сплошная реклама лезла.
хостинг, ну зарегистрируйтесь на drive.google.com - заодно получите 15 гигов бесплатного облака с автоматической синхронизацией на все Ваши компьютеры (работаете с файлами локально, а синхронизируются они в фоновом режиме).
Там как файл выложите, просто в "проводнике" правую кнопку, выберете Google Drive и скажите хочу поделиться, а там выберете "по ссылке" - он сгенерит публичную сылку.
Ну ок. Тогда вот:
https://yadi.sk/i/torS_mbIwBxJi
https://yadi.sk/i/Q-V2eHL1wBxJx
https://yadi.sk/i/0ax1cBCnwBxJz
https://yadi.sk/i/5w3oTLSjwBxK9
ЗЫ: А вообще, походу, тот даташит, который я в начале дал - реально бред - вот этот больше похож на правду http://iw.suntekstore.com/attach.php?id=14001923&img=14001923.doc
Хрена се, так это совсем другой интерфейс - здесь описан обычный SPI. Если так, то понятно. почему у Вас там HIGH всегда. Тактрировать его надо. В общем, почитайте и попробйте написать так, как здесь описано.
И ещё, обычно, такие модули - лишь минимальная обвязка к микросхеме. Вы не обрасывайте даташит на микросхему - сравните и делайте лучше как там написано.
Хрена се, так это совсем другой интерфейс - здесь описан обычный SPI. Если так, то понятно. почему у Вас там HIGH всегда. Тактрировать его надо. В общем, почитайте и попробйте написать так, как здесь описано.
Я тоже начал это подозревать =)) Надеюсь я не спалил датчик - подключая его по другому даташиту... =( Попробовать сделать как написано где, в даташите? Или на этом сайте в статье про SPI?
И ещё, обычно, такие модули - лишь минимальная обвязка к микросхеме. Вы не обрасывайте даташит на микросхему - сравните и делайте лучше как там написано.
Ну судя по даташиту и модулю - на модуле какраз все распаяно так, как написано в даташите и резисторы есть и конденсаторы.
Ладно... попробую изучить SPI и получить инфу так..... Хотя как подключать датчик все равно не понятно... не понятно с какой стороны на плате идет отсчет 1-6.
ЗЫ: кстати заказывал датчик вот тут , тут никакой инфы о нем нету и про то что он SPI тем более, а сейчас нашел его на АлиЭкспресе и выглядит платка в точности как моя и вот тут какраз написано, что она SPI.
Ладно... попробую изучить SPI и получить инфу так..... Хотя как подключать датчик все равно не понятно... не понятно с какой стороны на плате идет отсчет 1-6.
Ну, это как раз проще простого.
Там у Вас судя по фото к ногам микосхемы вполне можно подобраться щупом мультиметра.
Так прозвоните на какую ногу модуля звонитя нога GND микросхемы. ТАкже поступите с питанием. И уже поймёте порядок.
В даташите про микросхему не слова.... Знать бы на какой ноге у нее должна быть земля и на какой плюс... =(
Вот на этом фото видите вся плата залита полигоном. Обычно так делают GND. Т.е. GND - вторая нога снизу на этом фото. Подходит под описание?
Во блин... так и не разглядишь этот квадратик (который под первым контактом снизу)... А на фото четко видно. Да в даташите есть такой же квадратик и он VDD, т.е. плюс, след. от него VSS - земля.
В общем, походу, датчик бракованый ибо с него так и не получилось никаким способом получить хоть какие-то данные.
ЗЫ: Еще есть датчик DHT11 с ним по даташиту (для начала без библиотек, знаю что есть) - сразу получилось получить данные без проблем, хотя принцип у них один и тот же. (как оказалось первый датчик все же не SPI)
Купил такой же датчик, вообщем он рабочий.
Работает (проверил осциллографом), как сказано в китайском даташите (1 - VDD, 2 - GND, 4 - DATA).
Выставляете контроллером на линии DATA (4 контакт датчика) низкий уровень на время >= 100мкс, после этого датчик начинает передавать по этой же линии данные: импульсы (высокий уровень сигнала) 25мкс это 0,60мкс это 1, которые чередуются низким уровнем с длительностью 40мкс.
Да. Действительно, по такому принципу получилось получить с датчика импульсы данных.... "Супер", что официальный даташит - полная брехня......
Теперь у меня другая проблема.. не могу записать данные имульсов в массив =(, на стадии цикла записи импульсов в массив, ардуина наглухо зависает =( Что не так? (скетч минимальный - продвигаюсь вперед потихоньку, тестируя каждый этап. Сейчас хочу, хотя бы, получить все импульсы с датчика и записать их длины в массив, а потом вывести этот массив в терминал).
Если закоментировать запись в массив и раскоментировать непосредсвенный вывод длины импульса в терминал - все норм.
ЗЫ: длина массива задана специально бОльшей, потому как неизвестно сколько импульсов передает датчик... а даташиту с его 48ю битами я уже не верю.
Купил такой же датчик, вообщем он рабочий.
Работает (проверил осциллографом), как сказано в китайском даташите (1 - VDD, 2 - GND, 4 - DATA).
Выставляете контроллером на линии DATA (4 контакт датчика) низкий уровень на время >= 100мкс, после этого датчик начинает передавать по этой же линии данные: импульсы (высокий уровень сигнала) 25мкс это 0,60мкс это 1, которые чередуются низким уровнем с длительностью 40мкс.
Большое спасибо за небольшой даташит. Теперь данные снять получается. А Вы, случаем не разбирались дальше? Т.е. по каким формулам дальше разбирать данные? Я вот что то пока не могу допереть как из битовых данных получить, собственно, температуру с влажностью.
На данный момент получаю вот такие данные:
Левый столбец - RAW данные (биты, всего 40), % - просто разделитель, правый столбец RAW данные в десятичном виде.
Нижняя строка с температурой и влажностью - это данные для сверки с датчика DHT11, подключенного к той же ардуине с библиотекой для этого датчика.
Руководствуясь даташитами к разным датчикам (DHT11, DHT21, SHT10, SHT15, SHT21.....) я думаю, что первые 2 байта - это влажность, следующие 2 байта - это температура, последний байт - CRC.
Но вот по какой формуле их высчитывать, так и не пойму... пробовал формулы отсюда:
1. http://akizukidenshi.com/download/ds/aosong/AM2302.pdf
2. https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/Humidity_Sensors/Sensirion_Humidity_Sensors_SHT25_Datasheet_V3.pdf
3. https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/Humidity_Sensors/Sensirion_Humidity_Sensors_SHT21S_Datasheet_V4.pdf
В любом случае получается какая-то ерунда.... =(
Еще нашел вот такой код на С для датчика MTH02... если, конечно, это тот датчик..... Хотя в любом случае, после прочтения данного кода и взяв оттуда логику вычисления - все равно получается ерунда...
Скажите, у Вас получилось получить вменяемые данные? И, если да, то какой формулой или даташитом Вы руководствовались?
Все. Разобрался, похоже =)) Ошибочка в коде у меня была, данные были некорректны.
Подходит формула рассчета, которая выше в коде на С, или отсюда: http://www.elecrow.com/download/MYH02.pdf
Пока не разбирался с этим датчиком.
Но насколько я понял в ответе должно содержаться 5 байт: два байта влажности + два байта температуры + 1 байт CRC.
итого первые ваши данные:
0000001100110100 0000010101000110 10000000 или в hex: 0334 0546 80, в десятичном виде: 820(82.0% влажности) 1350 ((1350-400)/10=95*), а вот CRC не сошелся, он должен быть равен младшему байту из суммы первых четырех байтов ответа (03h+34h+05h+46h=82h а получили 80h).
Все норм. Я разобрался, у меня была ошибочка в коде, теперь все гуд.
Да, там первые 2 байта - влажность (по формуле: полученные данные/10), следующие 2 байта - температура (по формуле: (полученные данные - 400)/10)), последний байт CRC (по формуле (байт 1 + байт 2 + байт 3+ байт 4) & 0xFF = байт 5)
Поделитесь, пожалуйста кодом, которым удалось читать данные - по глупости купил такой, теперь не знаю как подключить, чтоб им воспользоваться... И как, в результате, его правильно подключить к ардуине?
Вот выложил на ЯДиск свою библиотеку. Там и пример есть и в начале файла скетча есть как подключать датчик.
https://yadi.sk/d/Jh93yz2O3KbAsk
Спасибо огромное! Постараюсь победить, с Вашей помощью)