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)я так понимаю строчка должна выглядеть так
void gprssend(){ char val[8]; // собераем массив для отправки snprintf(val, sizeof(val),",%f,%f;",dht.readHumidity(),dht.readTemperature());попробывал вот так: snprintf(val, sizeof(val),",%f,%f;",dht.readHumidity(),dht.readTemperature());
шлет вопросики!
,?,?;
я так понимаю строчка должна выглядеть так
void gprssend(){ char val[12]; // собераем массив для отправки sprintf(val,"%5.1f,%5.1f",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);
Теперь отсылаю показания с запятой!