DHT22 передает непонятки
- Войдите на сайт для отправки комментариев
Чт, 13/10/2016 - 11:29
Добрый день! Суть вопроса такова, что был скетч с DHT11 работал, понадобилось мне заменить этот датчик более совершенным DHT22, вроде сделал вск как надо, а он зараза в сериал шлет наборы цыфр. Укажите пож. где не так?
Вот код:
#include "DHT.h" #define DHTPIN 7 #define DHTTYPE DHT22 //#include <dht11.h> //#define DHT11PIN 11 // пин DHT11 #define gsm Serial //dht11 DHT11; DHT dht(DHTPIN, DHTTYPE); void modemread(){ while (gsm.available()>0) { char c = gsm.read(); Serial.write(c); } } // функция отправляет данные на фтп сервер void gprssend(){ //DHT11.read(DHT11PIN); // считаем данные с градусника char val[8]; // собераем массив для отправки //snprintf(val, sizeof(val),",%d,%d;",DHT11.humidity,DHT11.temperature); snprintf(val, sizeof(val),",%d,%d;",dht.readHumidity(),dht.readTemperature()); // проверяем соединины ли с интернетом gsm.flush(); gsm.println("at+xiic?"); delay(100); if (gsm.find("0.0.0.0")) gprsconnect(); // если нет, то подключаемся gsm.flush(); gsm.println("AT+FTPLOGOUT"); // на всякий случай разлогиниваемся delay(1000); gsm.flush(); // соединяемся с FTP и отправляем массив в файл gsm.println("AT+FTPLOGIN=5.101.152.43,21,rfb79270_test,A*D7]66*"); // соединяемся с FTP, УКАЗЫВАЕМ СВОЙ СЕРВЕР! while(!gsm.find("+FTPLOGIN")); // в цикле ждем ответ delay(100); gsm.println("AT+FTPPUT=test.csv,1,2,8"); // открываем файл delay(1000); gsm.println(val); // пишим в файл массив delay(100); while(!gsm.find("+FTPPUT:")){ // ждем ответ Serial.print("."); delay(1000); } Serial.print("FTP send"); // отписываемся что отправили delay(1000); gsm.println("AT+FTPLOGOUT"); // разлогиниваемся } // отправляем настройки GPRS и подключаемся. void gprsconnect(){ gsm.println("AT+CGDCONT=1,\"IP\",\"internet.beeline.ru\""); //delay(100); modemread(); gsm.println("AT+XGAUTH=1,1,\"beeline\",\"beeline\""); //delay(100); modemread(); gsm.println("AT+CUSD=1,\"*99***1#\",15"); //delay(100); modemread(); gsm.println("AT+XISP=0"); // включаем РРР //delay(100); modemread(); gsm.println("at+xiic=1"); //delay(100); modemread(); do{ // ждем IP gsm.println("at+xiic?"); Serial.print("."); delay(300); }while(gsm.find("0.0.0.0")); } void setup() { dht.begin(); Serial.begin(19200); gsm.begin(19200); do{ // проверяем готовность модема gsm.println("AT+CPAS"); Serial.print("."); delay(100); }while(!gsm.find("0")); do{ gsm.println("AT+CREG?"); Serial.print(":"); delay(100); }while(!gsm.find("+CREG: 0,1")); delay(100); gsm.flush(); gprsconnect(); // соединяемся с инетом gprssend(); // отправляем данные } void loop() { delay(600000); // Данные шлются раз в 10 минут gprssend(); gsm.flush(); }
Сам 22-й датчик проверял, рабочий.
float надо через f,g,e выводить, а не как не через d. (
"%f, %e"
, f1, f2)
я так понимаю строчка должна выглядеть так
попробывал вот так: snprintf(val, sizeof(val),",%f,%f;",dht.readHumidity(),dht.readTemperature());
шлет вопросики!
,?,?;
я так понимаю строчка должна выглядеть так
Подставил строчку, выдает , ?, ?; Что за бред, должно же быть все просто! Всю голову сломал, с этим датчиком, да еще и с буфером сериал порта. Спасибо за предложение, но блин не работает!
А просто в сериал порт выкинуть результат и значение val?
Нашел тему на http://forum.easyelectronics.ru/viewtopic.php?p=289034
там человек пришел к такому выводу:
"Действительно, дело было в урезанной работе (по умолчанию) sprintf с типом данных float."
Решил проблему заменой библиореки на stDHT.h и строчкой:
snprintf(val, sizeof(val),",%d,%d;",sens.readHumidity(7),sens.readTemperature(7));
По сути это кастыль (не показывает десятые доли температуры)! только для того чтоб ДШТ22 на месте оставить. В последствии конечно надо как то подружить float с sprintf.
Окончательно решил проблему с помощью вот этой функции:
dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);
Теперь отсылаю показания с запятой!