Датчик температуры/влажности MTH02

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Всем привет. Я тут новичек и с ардуино не так долго общаюсь. Пока успел только разобрать ИК протокол и написать библиотеку под своей кондей, больше пока ни с чем плотно не работал. Я не электроньщик, я скорее программер. (хотя по специальности сетевой/системный инженер)

Сейчас возникла проблема - купил датчик температуры/влажности 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.

Что я делаю не так, помогите плиз....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Посмотрите  даташит на его измерительный элемент - https://www.hdk.co.jp/pdf/eng/e1321aa.pdf

Может, поможет.

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Не это чисто даташит на датчик влажности - мне до разбора влажность/температура еще далеко, мне хотя бы сейчас вообще данные получить. Это же не правильно что на дата-пине всегда High - как данные то передаются?!

На его упаковке в скобках еще указано SHT10 - но библиотека от SHT10 категорически не подходит, пробовал и в ардуино заливать (выдает всегда -40.1 и 6.9) да и просто читая код библиотеки - понятно, что под даташит моего модуля он не подходит.

 

ЗЫ: какие-то подвижки вроде появились заменил дата-пин в ардуине на 4й, теперь при отключении провода, он хотя бы пишет - LOW, а если провод пошевилить (он отключен от датчика, но все еще торчит в ардуине) то иногда и HIGH проскакивают, особенно если докаснуться до контакта провода пальцем. (наводки от пальцев и ардуина считает это как потенциал на контакте? )

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

LobsterOK пишет:

(он отключен от датчика, но все еще торчит в ардуине) то иногда и HIGH проскакивают, особенно если докаснуться до контакта провода пальцем. (наводки от пальцев и ардуина считает это как потенциал на контакте? )

Это не особенность ардуино, а общее правило электроники - любой никуда не подключённый высокоимпедансный вход является просто антенной для помех.

Высокоимпедансный вход всегда должен иметь какое-то значение. Например, если Вы ему скажете не INPUT, а INPUT_PULLUP - он всегда будет иметь значение HIGH пока на него кто-нибудь явно LOW не подаст. А если Вы соедините его резистором с землёй - на нём всегда будет LOW пока кто-нибудь не подаст HIGH.

Кстати, в INPUT_PULLUP нет никакой магии. Там просто внутри микросхемы есть резистор, соединяющий пин с питанием, и таким режимом Вы его включаете. Можете внешним резистором с питанием соединить. Разницы никакой.

Если же он никуда не притянут, на нём по сути случайное значение.

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Еще добавилась инфа - если порт на инпут подключать через подтягивающий резистор (насколько я помню это так для ардуины) используя константу INPUT_PULLUP, то шевелние провода и прикасновения к нему мальцами нечего не дают - т.е. всегда HIGH. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Про это Мы с Вами параллельно писали :)

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Так что же получается.... датчик - труп?! =(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю. А что там за ещё два входа? 

Можете сделать крупное фото так. чтобы дорожки были видны с обеих сторон? Посмотреть бы на него и понять к каким ногам измерительного элемента там всё подключено. На сам элемент даташит я Вам давал.

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Дорожек не видно даже держа его перед глазами (почти не видно) =( Но фото попробую сделать.

Еще 2 входа там на дополнительные датчики температуры (так в даташите написано)

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

 

LobsterOK
Offline
Зарегистрирован: 04.10.2016
LobsterOK
Offline
Зарегистрирован: 04.10.2016

Что самое интересное, есть еще китайский даташит на этот модуль, так там 3й пин вообще NC.... (вот даташит http://www.elecrow.com/download/MTH02A%20DATASHEET.pdf )

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не понимаю, как их смотреть. Картинки мелкие, а при нажатии на них реклама лезет и ничего не увеличивается.

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Там достаточно на картинку нажать - она увеличится. Куда посоветуете залить? Я как-то не пользуюсь хостингами картинок....

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так нажимал - сплошная реклама лезла.

хостинг, ну зарегистрируйтесь на drive.google.com - заодно получите 15 гигов бесплатного облака с автоматической синхронизацией на все Ваши компьютеры (работаете с файлами локально, а синхронизируются они в фоновом режиме).

Там как файл выложите, просто в "проводнике" правую кнопку, выберете Google Drive и скажите хочу поделиться, а там выберете "по ссылке" - он сгенерит публичную сылку.

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Ну ок. Тогда вот:

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Хрена се, так это совсем другой интерфейс - здесь описан обычный SPI. Если так, то понятно. почему у Вас там HIGH всегда. Тактрировать его надо. В общем, почитайте и попробйте написать так, как здесь описано.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И ещё, обычно, такие модули - лишь минимальная обвязка к микросхеме. Вы не обрасывайте даташит на микросхему - сравните и делайте лучше как там написано.

LobsterOK
Offline
Зарегистрирован: 04.10.2016

ЕвгенийП пишет:

Хрена се, так это совсем другой интерфейс - здесь описан обычный SPI. Если так, то понятно. почему у Вас там HIGH всегда. Тактрировать его надо. В общем, почитайте и попробйте написать так, как здесь описано.

Я тоже начал это подозревать =)) Надеюсь я не спалил датчик - подключая его по другому даташиту... =( Попробовать сделать как написано где, в даташите? Или на этом сайте в статье про SPI?

ЕвгенийП пишет:

И ещё, обычно, такие модули - лишь минимальная обвязка к микросхеме. Вы не обрасывайте даташит на микросхему - сравните и делайте лучше как там написано.

Ну судя по даташиту и модулю - на модуле какраз все распаяно так, как написано в даташите и резисторы есть и конденсаторы.

 

Ладно... попробую изучить SPI и получить инфу так..... Хотя как подключать датчик все равно не понятно... не понятно с какой стороны на плате идет отсчет 1-6.

ЗЫ: кстати заказывал датчик вот тут , тут никакой инфы о нем нету и про то что он SPI тем более, а сейчас нашел его на АлиЭкспресе и выглядит платка в точности как моя и вот тут какраз написано, что она SPI.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

LobsterOK пишет:

Ладно... попробую изучить SPI и получить инфу так..... Хотя как подключать датчик все равно не понятно... не понятно с какой стороны на плате идет отсчет 1-6.

Ну, это как раз проще простого.

Там у Вас судя по фото к ногам микосхемы вполне можно подобраться щупом мультиметра.

Так прозвоните на какую ногу модуля звонитя нога GND микросхемы. ТАкже поступите с питанием. И уже поймёте порядок.

LobsterOK
Offline
Зарегистрирован: 04.10.2016

В даташите про микросхему не слова.... Знать бы на какой ноге у нее должна быть земля и на какой плюс... =(

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вот на этом фото видите вся плата залита полигоном. Обычно так делают GND. Т.е. GND - вторая нога снизу на этом фото. Подходит под описание?

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Во блин... так и не разглядишь этот квадратик (который под первым контактом снизу)... А на фото четко видно. Да в даташите есть такой же квадратик и он VDD, т.е. плюс, след. от него VSS - земля.

LobsterOK
Offline
Зарегистрирован: 04.10.2016

В общем, походу, датчик бракованый ибо с него так и не получилось никаким способом получить хоть какие-то данные.

ЗЫ: Еще есть датчик DHT11 с ним по даташиту (для начала без библиотек, знаю что есть) - сразу получилось получить данные без проблем, хотя принцип у них один и тот же. (как оказалось первый датчик все же не SPI)

jarik
Offline
Зарегистрирован: 13.10.2016

Купил такой же датчик, вообщем он рабочий.

Работает (проверил осциллографом), как сказано в китайском даташите (1 - VDD, 2 - GND, 4 - DATA). 

Выставляете контроллером на линии DATA (4 контакт датчика) низкий уровень на время >= 100мкс, после этого датчик начинает передавать по этой же линии данные: импульсы (высокий уровень сигнала) 25мкс это 0,60мкс это 1, которые чередуются низким уровнем с длительностью 40мкс.   

 

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Да. Действительно, по такому принципу получилось получить с датчика импульсы данных.... "Супер", что официальный даташит - полная брехня......

Теперь у меня другая проблема.. не могу записать данные имульсов в массив =(, на стадии цикла записи импульсов в массив, ардуина наглухо зависает =( Что не так? (скетч минимальный - продвигаюсь вперед потихоньку, тестируя каждый этап. Сейчас хочу, хотя бы, получить все импульсы с датчика и записать их длины в массив, а потом вывести этот массив в терминал).

#define pin 12
int buf [60];

void setup (){
  Serial.begin(115200);  
  pinMode(pin, OUTPUT);
  digitalWrite(pin, HIGH);
}

void loop(){
  Serial.println("Hello!");
  digitalWrite(pin,LOW);
  delay(100);
  pinMode(pin, INPUT);
  //noInterrupts();
  for (int j = 0; j = 60; j++){
    buf[j] = pulseIn(pin,HIGH);
    //Serial.println(pulseIn(pin,HIGH));
  }
  //interrupts();
  
  //for (int j = 0; j = 60; j++){    
  //  Serial.println(buf[j]);
  //}
  delay(100);
  pinMode(pin,OUTPUT);
  digitalWrite(pin,HIGH);
  delay(5000);
}

Если закоментировать запись в массив и раскоментировать непосредсвенный вывод длины импульса в терминал - все норм.

ЗЫ: длина массива задана специально бОльшей, потому как неизвестно сколько импульсов передает датчик... а даташиту с его 48ю битами я уже не верю.

LobsterOK
Offline
Зарегистрирован: 04.10.2016

jarik пишет:

Купил такой же датчик, вообщем он рабочий.

Работает (проверил осциллографом), как сказано в китайском даташите (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... если, конечно, это тот датчик..... Хотя в любом случае, после прочтения данного кода и взяв оттуда логику вычисления - все равно получается ерунда...

/****************************************Copyright (c)****************************************************
**                            Jiangsu Acxion Electrical Co., LTD
**
**                                 http://www.acxion.cn
**
**--------------File Info---------------------------------------------------------------------------------
** File name:           MTH02.C
** Last modified Date:  2011-04-02
** Last Version:        V1.0
** Descriptions:        MTH02ґ«ёРЖч¶БИЎ
**
**--------------------------------------------------------------------------------------------------------
** Created by:         
** Created date:       
** Version:             
** Descriptions:        
**
**--------------------------------------------------------------------------------------------------------
** Modified by:         
** Modified date:       
** Version:             
** Descriptions:        
**
**--------------------------------------------------------------------------------------------------------
** Modified by:        
** Modified date:      
** Version:            
** Descriptions:       
**
** Rechecked by:
*********************************************************************************************************/
#include<reg51.h>
sbit P1_1=P1^1;//ґ«ёРЖчIO
uchar  FLAG;
uchar  U8count,U8temp;
uchar  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
uchar  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
uchar  U8comdata;
uint tmp1=0;
uint rh1=0;
bit TFLAG=0;
/******************************************************************************
** Function name:       delay
** Descriptions:        јтµҐСУК±
** input parameters:   ОЮ
** output parameters:   ОЮ
** Returned value:      
******************************************************************************/
void delay(uint t)
{
	uchar ms;
	for(t;t>0;t--)
		for(ms=100;ms>0;ms--) _nop_();				                                                                                                                                                                                                                                   
}
/******************************************************************************
** Function name:       Delay_10us
** Descriptions:        10usµДСУК±	Ј¬ёщѕЭµҐЖ¬»ъµДК±ЦУЖµВКµчХы	  STC11FXXПµБР
** input parameters:   ОЮ
** output parameters:   ОЮ
** Returned value:      
******************************************************************************/
void  Delay_10us(void)
{
  uchar i;
  for(i=20;i>0;i--)
	{
		_nop_();  
	}
}
/******************************************************************************
** Function name:       ReadOneByte
** Descriptions:        ¶БИЎ1ЧЦЅЪКэѕЭ
** input parameters:   ОЮ
** output parameters:   ОЮ
** Returned value:      
******************************************************************************/
void ReadOneByte(void)
{
	uchar i;
    for(i=0;i<8;i++)	   
	{
		FLAG=2;
	   	while((!P1_1)&&FLAG++);
		Delay_10us();
		Delay_10us();
		Delay_10us();
	  	U8temp=0;
	    if(P1_1)U8temp=1;
		FLAG=2;
		while((P1_1)&&FLAG++);	   		  
	   	if(FLAG==1)break;	//і¬К±ФтМшіцforС­»·	   	 
		U8comdata<<=1;
	   	U8comdata|=U8temp;       
	 }
}  
/******************************************************************************
** Function name:       ReadSensor
** Descriptions:        ¶БИЎґ«ёРЖчµДОВКЄ¶И
** input parameters:   ОЮ
** output parameters:   tmp1Ј¬ОВ¶ИЦµЈ¬А©ґу10±¶КдіцЈ¬rh1,КЄ¶ИЦµ	TFLAG=0Ј¬ОВ¶ИОЄХэЈ¬=1Ј¬ОВ¶ИОЄёє
** Returned value:      
******************************************************************************/
void ReadSensor(void)
{
       P1_1=0; //А­µНЧЬПЯ
	   delay(4);//СУК±
	   P1_1=1;//А­ёЯЧЬПЯ
	   Delay_10us(); //µИґэґ«ёРЖчПмУ¦
	   Delay_10us();
	   Delay_10us();
	   Delay_10us();
	   P1_1=1;	     
	   FLAG=2; 
	   while((!P1_1)&&FLAG++);//µИґэёЯµзЖЅµЅАґ
	   FLAG=2;
	   ReadOneByte();	//¶БИЎ5ёцByte
	   U8RH_data_H_temp=U8comdata;
	   ReadOneByte();
	   U8RH_data_L_temp=U8comdata;
	   ReadOneByte();
	   U8T_data_H_temp=U8comdata;
	   ReadOneByte();
	   U8T_data_L_temp=U8comdata;
	   ReadOneByte();
	   U8checkdata_temp=U8comdata;
	   U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);//јЖЛг¶БіцКэѕЭµДРЈСйєН
	   if(U8temp==U8checkdata_temp)//Из№ыРЈСйХэИ·
	   {
	   	 U8RH_data_H=U8RH_data_H_temp;
	   	 U8RH_data_L=U8RH_data_L_temp;
	   	 U8T_data_H=U8T_data_H_temp;
	   	 U8T_data_L=U8T_data_L_temp;
	   	 U8checkdata=U8checkdata_temp;
		 tmp1=U8T_data_H<<8|U8T_data_L;	
		 rh1=U8RH_data_H<<8|U8RH_data_L;
		 if(tmp1>=400)//ОВ¶ИОЄХэ
		 {
		 	tmp1-=400;
			TFLAG=0;	
		 }
		 else //ОВ¶ИОЄёє
		 {
		 	tmp1=400-tmp1;//ЧЄ»»ОЄХэОВ¶И
			TFLAG=1; //ёєОВ¶И·ыєЕО»ЦГО»
		 } 
	   }	   	   	    
} 

Скажите, у Вас получилось получить вменяемые данные? И, если да, то какой формулой или даташитом Вы руководствовались?

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Все. Разобрался, похоже =)) Ошибочка в коде у меня была, данные были некорректны.

Подходит формула рассчета, которая выше в коде на С, или отсюда: http://www.elecrow.com/download/MYH02.pdf

jarik
Offline
Зарегистрирован: 13.10.2016

Пока не разбирался с этим датчиком.

Но насколько я понял в ответе должно содержаться 5 байт: два байта влажности + два байта температуры + 1 байт CRC.

итого первые ваши данные:
0000001100110100 0000010101000110 10000000 или в hex: 0
334 0546 80, в десятичном виде: 820(82.0% влажности) 1350 ((1350-400)/10=95*), а вот CRC не сошелся, он должен быть равен младшему байту из суммы первых четырех байтов ответа (03h+34h+05h+46h=82h а получили 80h).

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Все норм. Я разобрался, у меня была ошибочка в коде, теперь все гуд.

Да, там первые 2 байта - влажность (по формуле: полученные данные/10), следующие 2 байта - температура (по формуле: (полученные данные - 400)/10)), последний байт CRC (по формуле (байт 1 + байт 2 + байт 3+ байт 4) & 0xFF = байт 5)

Vitalyr
Offline
Зарегистрирован: 28.06.2017

Поделитесь, пожалуйста кодом, которым удалось читать данные - по глупости купил такой, теперь не знаю как подключить, чтоб им воспользоваться... И как, в результате, его правильно подключить к ардуине?

 

LobsterOK
Offline
Зарегистрирован: 04.10.2016

Вот выложил на ЯДиск свою библиотеку. Там и пример есть и в начале файла скетча есть как подключать датчик.

https://yadi.sk/d/Jh93yz2O3KbAsk

Vitalyr
Offline
Зарегистрирован: 28.06.2017

Спасибо огромное! Постараюсь победить, с Вашей помощью)