Mega 2560 + 6 DHT22 Проблемы с выводом данных

Mk_II
Offline
Зарегистрирован: 27.08.2014

Добрый всем день.

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

Сам скетч

#include <DHT22.h> //Импортирование библиотеки обработки данных с датчика DHT22
#include <stdio.h> //Импортирование библиотеки команд ввода-вывода данных

#define DHT22_1_PIN 2 //Объявление переменной пина, к которому подключен датчик №1 
#define DHT22_2_PIN 3 //Объявление переменной пина, к которому подключен датчик №2
#define DHT22_3_PIN 4 //Объявление переменной пина, к которому подключен датчик №3
#define DHT22_4_PIN 5 //Объявление переменной пина, к которому подключен датчик №4
#define DHT22_5_PIN 6 //Объявление переменной пина, к которому подключен датчик №5
#define DHT22_6_PIN 7 //Объявление переменной пина, к которому подключен датчик №6

DHT22 myDHT22_1(DHT22_1_PIN); //Содаем объект-сенсор №1
DHT22 myDHT22_2(DHT22_2_PIN); //Содаем объект-сенсор №2
DHT22 myDHT22_3(DHT22_3_PIN); //Содаем объект-сенсор №3
DHT22 myDHT22_4(DHT22_4_PIN); //Содаем объект-сенсор №4
DHT22 myDHT22_5(DHT22_5_PIN); //Содаем объект-сенсор №5
DHT22 myDHT22_6(DHT22_6_PIN); //Содаем объект-сенсор №6

void setup(void) //Описываем настройки программы
{
  Serial.begin(9600); //Запускаем считываение данных с serial-порта со скоростью 9600б/с
}

void loop(void) //Описываем цикл программы
{ 
  DHT22_ERROR_t errorCode;
  delay(2000); //Устанавливаем задержку меж измерениями в 2 секунды
  unsigned long time; // объявление переменной time типа unsigned long
  
//Датчик 1 
  
  errorCode = myDHT22_1.readData(); //Считываем данные датчика 1 с пина 2
  if (errorCode == DHT_ERROR_NONE)
  {
      doPrintTH(myDHT22_1.getTemperatureC(), myDHT22_1.getHumidity()) //Считываем температуру в Цельсиях и влажность
  ;}

//Датчик 2

  errorCode = myDHT22_2.readData(); //Считываем данные датчика 2 с пина 3
  if (errorCode == DHT_ERROR_NONE)
  {
      doPrintTH(myDHT22_2.getTemperatureC(), myDHT22_2.getHumidity()) //Считываем температуру в Цельсиях и влажность
  ;}
  
//Датчик 3

  errorCode = myDHT22_3.readData(); //Считываем данные датчика 3 с пина 4
  if (errorCode == DHT_ERROR_NONE)
  {
      doPrintTH(myDHT22_3.getTemperatureC(), myDHT22_3.getHumidity()) //Считываем температуру в Цельсиях и влажность
  ;}

//Датчик 4

  errorCode = myDHT22_4.readData(); //Считываем данные датчика 4 с пина 5
  if (errorCode == DHT_ERROR_NONE)
  {
      doPrintTH(myDHT22_4.getTemperatureC(), myDHT22_4.getHumidity()) //Считываем температуру в Цельсиях и влажность
  ;} 

//Датчик 5

  errorCode = myDHT22_5.readData(); //Считываем данные датчика 5 с пина 6
  if (errorCode == DHT_ERROR_NONE)
  {
      doPrintTH(myDHT22_5.getTemperatureC(), myDHT22_5.getHumidity()) //Считываем температуру в Цельсиях и влажность
  ;} 
  
//Датчик 6

  errorCode = myDHT22_6.readData(); //Считываем данные датчика 6 с пина 7
  if (errorCode == DHT_ERROR_NONE)
  {
      doPrintTH(myDHT22_6.getTemperatureC(), myDHT22_6.getHumidity()) //Считываем температуру в Цельсиях и влажность
  ;} 
     
}

void doPrintTH(float t, float h) //Вывод данных
{
   Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.println(" *C ");
  
  
}

Очень надо бы в данный код впилить следующие фичи: номер датчика, номер измерения и время измерения
вот в таком виде

Numb | Sens |  Time, sec |  Temp, C | Himud, % |

 

 

 

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну если просто впилить то так))

//Numb | Sens |  Time, sec |  Temp, C | Himud, % |

 

Mk_II
Offline
Зарегистрирован: 27.08.2014

jeka_tm пишет:

ну если просто впилить то так))

//Numb | Sens |  Time, sec |  Temp, C | Himud, % |

Okay(

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

намек не поняли. ну да ладно. скажу по другому. вы хотите получить запись такого вида

Numb | Sens |  Time, sec |  Temp, C | Himud, % |

но где? в uart отправить? на дисплей вывести?

Mk_II
Offline
Зарегистрирован: 27.08.2014

jeka_tm пишет:

намек не поняли. ну да ладно. скажу по другому. вы хотите получить запись такого вида

Numb | Sens |  Time, sec |  Temp, C | Himud, % |

но где? в uart отправить? на дисплей вывести?

Я в пограмировании не особо силен, но хотелось бы, чтобы в мониторе СОМ порта выводилось время замера, номер замера и номер датчика и т.д. Если есть возможность результаты измерения напрямую записывать в txt файл например - то туда. Курил туториалы на предмет экспорта измерений, нашел для портирования в MathLabб но там портирование через промежуточную среду, а это для пролетария умственного труда черезчур тяжко

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

1. в мониторе тогда должна быть программа которая бы собирала все эти данные

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

2. подцепить sd карточку и писать в txt

а потом уже обрабатывать как хочешь

насчет sd не подскажу. все руки никак не дойдут, но кто то тут уже делал

Mk_II
Offline
Зарегистрирован: 27.08.2014

Вот скрин результатов с экрана COM порта, откуда я могу копировать данные вручную. есть два столбца с значениями, влажность и темпераутра. А нужно добавить еще столбцы с номером датчика, номером измерения, временем измерения

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

для начала хотел спросить вы в курсе про инертность датчиков?

Mk_II
Offline
Зарегистрирован: 27.08.2014

jeka_tm пишет:

для начала хотел спросить вы в курсе про инертность датчиков?

Да. Желательно, конечно бы осреднять измерения, сделанные раз в секунду, например, на промежутке 5 секунд например.
Ну и сама конструкция корпуса представляет собой гидравлическое сопротивление, препятсвующее конвекции воздушной массы

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

время каким образом определять? через millis() ?

Radjah
Offline
Зарегистрирован: 06.08.2014

Для подобия метеостанции я делал так:

- объявлял переменные для всех датчиков

- опрашивал все датчики с записью прочитанного в переменные

- делал из всех переменных строки

- Проталкивал значения одним заходом в формате <идентификатор><значение>...<идентификатор><значение><lf> (<lf> делал с помщью char(13))

На принимающей стороне была программа на делфи, которая ждала <lf> (нашел пример кода в интернете), принимала всё из порта, парсила строку и писала замер в sqlite-базу.

 

Serial запускал с параметром SERIAL_8N2. При одном стоповом бите <lf> порой терялся.

DHT22 дергать чаще раза в две секунды по описанию нельзя.

Попробуй через разницу millis() замерить время опроса всех датчиков, чтобы подобрать задержку между замерами. Погрешность на время передачи всё равно будет, но хотя бы замеры будут равномерно идти.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Меня пугают инженеры которые пишут дисертацию, но немогут освоить азы програмирования, тоесть логическое мышление отсутствует. Что ждать от такого инженера? Печалько. :(

Mk_II
Offline
Зарегистрирован: 27.08.2014

Puhlyaviy пишет:
Меня пугают инженеры которые пишут дисертацию, но немогут освоить азы програмирования, тоесть логическое мышление отсутствует. Что ждать от такого инженера? Печалько. :(

А не надо от меня ждать чего-то. Вы погромист, я газодинамик. Если я вас начну спрашивать за краевые эффекты в пограничном слое околокритического течения, то я тоже испугаюсь. И да. Умение погромировать не есть обязательное условие логического мышления, инфа сотка, я не Аристотель.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

В каком месте следует что я програмист? С наблюдательностью тоже все плохо? Хотя современная наука вроде целиком построена на наблюдениях за природой. Тут совсем не важно кто вы по специальности. Хоть космонавт, смысл в том что нормальный человек с общим образованием осваивает ардуино в течении недели. А ваши выкрики что вы дисер пишете и газодинамик а не програмист, ставят вас в один ряд с местным быдлом, которое с криками что он механик,пилот,химик и тд и тп, а НЕ ПРОГРАМИСТ...пытаются разжиться чем то нахаляву.

Radjah
Offline
Зарегистрирован: 06.08.2014

В тред пришел пухлявый. Больше сказать нечего. :(

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Radjah пишет:

В тред пришел пухлявый. Больше сказать нечего. :(


Так а вы не говорите. Напишите товарищу код и отпустите. Он тут больше никогда и не появится. Хорошо если спасибо вам на прощание скажет :)

Mk_II
Offline
Зарегистрирован: 27.08.2014

Puhlyaviy пишет:
В каком месте следует что я програмист? С наблюдательностью тоже все плохо? Хотя современная наука вроде целиком построена на наблюдениях за природой. Тут совсем не важно кто вы по специальности. Хоть космонавт, смысл в том что нормальный человек с общим образованием осваивает ардуино в течении недели. А ваши выкрики что вы дисер пишете и газодинамик а не програмист, ставят вас в один ряд с местным быдлом, которое с криками что он механик,пилот,химик и тд и тп, а НЕ ПРОГРАМИСТ...пытаются разжиться чем то нахаляву.

А!!! Гешефтмастер)) Ну таки бы сrазу и сказали, шо пейсы душат гоrло и Вам таки нужен пrофит с сего дельца. Таки сrазу Вас огоrчу, я бедный евrей, ой вэй. И золотых зубов на сей теме Ви таки не заrаботаете.
Таки пrоходите мимо, не тrатьте свое дraгоценное вrемя.

"Хотя современная наука вроде целиком построена на наблюдениях за природой." - годно, нет, ну правда годно. Особенно квантовая механика. Особенно теория М-струн. Инфа сотка, я не Гейзенберг

 

Mk_II
Offline
Зарегистрирован: 27.08.2014

Со временем стало чуть понятнее, спасибо)

А Вы датчик калибровали? если да, то как именно

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Ой таки да, мы говорим о сотке шекелей? Ви таки делаете мне смешно.
Судя по тому что вам тяжело прочитать описание функции serial.print и добавить в ваш код пару переменных , ваше обучение нужно начинать где со второй четверти первого класса.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Ну, разобрались как сделать-то?
А то это ведь элементарно....
Добавить в функцию вывода еще переменную - номер, и секунды это millis()/1000 - тоже легко сделать вывод

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

Пушной звер
Пушной звер аватар
Offline
Зарегистрирован: 17.03.2013

Puhlyaviy пишет:
Меня пугают инженеры которые пишут дисертацию, но немогут освоить азы програмирования, тоесть логическое мышление отсутствует. Что ждать от такого инженера? Печалько. :(

чем больше читаю форум, тем сильнее удевляюсь, почему вас еще не забанили.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Пушной звер пишет:

чем больше читаю форум, тем сильнее удевляюсь, почему вас еще не забанили.


А вы отдельно тему заведите и будем там догадки строить. :)
Я вот кстати подумал тут. По сути у нас есть 2 группы
1.народ который имеет желание придумывать и собирать всякую интересную фигню. Но имеется проблема, фантазия дальше какой нибуть метеостанции или "умного" выключателя не двигается. Тоесть скукота и застой.
2. Народ навроде ТС, типа проводят какие иследования, диссертации пишут и нуждаются во всяких хитрых фиговинах. Но их попытки реализации выглядят , я тут машину собрал, но она у меня боком ездиет и не поворачивает, посоветуйте какой бензин заправить ,чтобы она ездида нормально.

Так вот , мне интересно. Что мешает тому-же ТС , прийти расказать что он там изучает, какие будут переспективы и где его иследования могут получить практическое применение. Заинтересовать народ идеей а не сотками. Потом расказать что ему нужно для практического тестирования. Тоесть дать идею для первой групы народа. И как результат получить и схемы и софт. И все рады и при деле

Но это видимо не вариант, нужно прийти вывалить кусок непонятно чего и с барского плеча бросить сотку халопам , а если халопы начнут уточнять, то тут побыковать это видимо традиция.

Radjah
Offline
Зарегистрирован: 06.08.2014

Mk_II пишет:

Со временем стало чуть понятнее, спасибо)

А Вы датчик калибровали? если да, то как именно

У меня DHT11 только есть, 22 я заказал на пощупать. 11-й показывает погоду на Марсе какую-то, хотя в дождь показания его растут. По крайней мере с обычным стрелочным барометром показания не совпадали.

Температура на правду вроде похожа.

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

 

В любом случае радует тот факт, что производитель предоставил не только железки, но библиотеки к ним. :)

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Dht22 чуть меньше глючит. Но показывает погоду на луне. Плюс к нему библиотек кто на что горазд. Они оба состоят из двух сенсоров, потому и коробка такая огромная.

Mk_II
Offline
Зарегистрирован: 27.08.2014

Пухлый, ты таки реально дурачок или у тебя пмс разыгрался?
1. Я открыл тему, чтобы кто может и хочет, имел возможность помочь мне в том, в чем я не компетентен.
2. Прибегает Пухлый и начинает исходить на говно, из-за того, что не все в этом мире погромисты
3. Мне здесь никто куски кода не кидал. Только название функций и операторов, которые надо глянуть, что я и делаю.

Я же не заявляю, что все, кто не могут в аналитику капилярных течений должны быть переработаны на метан или отправлены в 4 класс? Нет. Хотелось привлечь к себе внимание - Ви таки привлекли. Мисчон комплиттед. Май конгратьюлейшенс

Mk_II
Offline
Зарегистрирован: 27.08.2014

Может кому пользительно будет, нарытая инфа по DHT

http://www.dfrobot.com/image/data/SEN0137/AM2302_manual.pdf - мануал по АМ2302, с кривыми погрешностей датчика
http://www.kandrsmith.org/RJS/Misc/calib_dht22.html - статья по точной калибровке датчика DHT22 

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Mk_II пишет:

Пухлый, ты таки реально дурачок или у тебя пмс разыгрался?
1. Я открыл тему, чтобы кто может и хочет, имел возможность помочь мне в том, в чем я не компетентен.
2. Прибегает Пухлый и начинает исходить на говно, из-за того, что не все в этом мире погромисты
3. Мне здесь никто куски кода не кидал. Только название функций и операторов, которые надо глянуть, что я и делаю.

Я же не заявляю, что все, кто не могут в аналитику капилярных течений должны быть переработаны на метан или отправлены в 4 класс? Нет. Хотелось привлечь к себе внимание - Ви таки привлекли. Мисчон комплиттед. Май конгратьюлейшенс

Ну пока "исходите на гавно" исключительно Вы. Тут не школа благородных девиц чтобы на тон советчиков жаловаться. Напишите в "ищу исполнителя" - там Вас может(!) и будут обихаживать, хотя сильно сомневаюсь.

Nikonist
Offline
Зарегистрирован: 15.08.2014

Номер измерения вы хотите выводить общий (его можно автоматом получить из секунд, прошедших с момента перезапуска) или конкретного датчика (будет инкрементироваться только при удавшемся измерении, то есть DHT_ERROR_NONE)? Если второе, то вот пример для датчика №4, для остальных сделаете аналогично.

void loop(void)
{
...
static unsigned long measureCount4 = 0;
...
//Датчик 4
  errorCode = myDHT22_4.readData(); //Считываем данные датчика 4 с пина 5
  if (errorCode == DHT_ERROR_NONE)
  {
      measureCount4++;
      doPrintTH(myDHT22_4.getTemperatureC(), myDHT22_4.getHumidity(), 4, measureCount4);
  ;}
...
}

void doPrintTH(float t, float h, int sensor, unsigned long count) //Вывод данных
{
  Serial.print("Numb: "); 
  Serial.print(count); 
  Serial.print("Sens: "); 
  Serial.print(sensor); 
  Serial.print("Time: "); 
  Serial.print(millis()/1000); 

  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.println(" *C ");
 }

 

Mk_II
Offline
Зарегистрирован: 27.08.2014

Nikonist пишет:

Номер измерения вы хотите выводить общий (его можно автоматом получить из секунд, прошедших с момента перезапуска) или конкретного датчика (будет инкрементироваться только при удавшемся измерении, то есть DHT_ERROR_NONE)? Если второе, то вот пример для датчика №4, для остальных сделаете аналогично.

void loop(void)
{
...
static unsigned long measureCount4 = 0;
...
//Датчик 4
  errorCode = myDHT22_4.readData(); //Считываем данные датчика 4 с пина 5
  if (errorCode == DHT_ERROR_NONE)
  {
      measureCount4++;
      doPrintTH(myDHT22_4.getTemperatureC(), myDHT22_4.getHumidity(), 4, measureCount4);
  ;}
...
}

void doPrintTH(float t, float h, int sensor, unsigned long count) //Вывод данных
{
  Serial.print("Numb: "); 
  Serial.print(count); 
  Serial.print("Sens: "); 
  Serial.print(sensor); 
  Serial.print("Time: "); 
  Serial.print(millis()/1000); 

  Serial.print("Humidity: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(t);
  Serial.println(" *C ");
 }

 

Душевно! Благодарствую. Все работает=)

Sirocco
Offline
Зарегистрирован: 28.09.2013

Хочу спросить по DTH22. Пришло из китай 3 штуки. Беру стандартный пример скетча из библиотеки. Не работает. Датчик показывает влажность 1.0 и температуру 1.0. Резисторы стоят на 4,7КОм. Пробовал все датчики. Все как один работают так. Заметил что нормально начинают работать после сброса (нажатие на ресет) контроллера, примерно в половине случаев. И если попал на удачу, то работают нормально до следующего перебоя с питанием. Если просто снять питание и включить, не работают. Надо обязательно нажать ресет. Тогда, если повезёт, заработают. Подумал что в макетке проблема, может контакта нет. Развёл датчики по дому, спаял... Но всё также, при просто включении показывают 1,0. Питание проверил, ровно 5 вольт на датчике. С резистором экспериментировал, от 1КОм до 10КОм - результат не меняется.

Кто сталкивался? В чём может быть проблема? Показания каждые 10 минут в БД идут, бывает электричество моргнёт или отключают, и показания в базу не верные идут, пока не заметишь.

Иногда показания бывают 2,0 или 0,0.