DHT22 передает непонятки

Sasha80
Offline
Зарегистрирован: 18.01.2016

Добрый день! Суть вопроса такова, что был скетч с 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();

}

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

Сам 22-й датчик проверял, рабочий.

nik182
Offline
Зарегистрирован: 04.05.2015

float надо через f,g,e выводить, а не как не через d.  ("%f, %e", f1, f2)

Sasha80
Offline
Зарегистрирован: 18.01.2016

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

void gprssend(){  
     
      char val[8];         // собераем массив для отправки
     
        snprintf(val, sizeof(val),",%f,%f;",dht.readHumidity(),dht.readTemperature());

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

попробывал вот так: snprintf(val, sizeof(val),",%f,%f;",dht.readHumidity(),dht.readTemperature());

шлет вопросики!

,?,?;

 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Sasha80 пишет:

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

void gprssend(){  
     
      char val[12];         // собераем массив для отправки
     
        sprintf(val,"%5.1f,%5.1f",dht.readHumidity(),dht.readTemperature());

 

Sasha80
Offline
Зарегистрирован: 18.01.2016

Подставил строчку, выдает ,    ?,    ?;  Что за бред, должно же быть все просто! Всю голову сломал, с этим датчиком, да еще и с буфером сериал порта. Спасибо за предложение, но блин не работает!

 

nik182
Offline
Зарегистрирован: 04.05.2015

А просто в сериал порт выкинуть результат и значение val?

Sasha80
Offline
Зарегистрирован: 18.01.2016

Нашел тему на http://forum.easyelectronics.ru/viewtopic.php?p=289034

там человек пришел к такому выводу:

"Действительно, дело было в урезанной работе (по умолчанию) sprintf с типом данных float."

Sasha80
Offline
Зарегистрирован: 18.01.2016

Решил проблему заменой библиореки на stDHT.h и строчкой:

snprintf(val, sizeof(val),",%d,%d;",sens.readHumidity(7),sens.readTemperature(7));

По сути это кастыль (не показывает десятые доли температуры)! только для того чтоб ДШТ22 на месте оставить. В последствии конечно надо как то подружить float с sprintf.

Sasha80
Offline
Зарегистрирован: 18.01.2016

Окончательно решил проблему с помощью вот этой функции:

dtostrf(floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, charBuf);

Теперь отсылаю показания с запятой!