не могу разобраться с отправкой погоды в телеграмм
- Войдите на сайт для отправки комментариев
Втр, 28/02/2017 - 13:52
Добрый день! Прошу помощи в отладке программы. Ардуино лезет на сайт с погодой, вытаскивает кусок текста с погодой для моего города, и отправляет в сериал распарсенные значения. Потом если нажать кнопку (получить погоду) отправляется текст с погодой в чат.
при попытке отправить кусок нераспарсенного текста (переменная Sting line) действительно в телеграмм вываливается неудобоваримый текст.
Но при попытке отправки переменной String name - значение не выводится. Как мне привести код к такому виду что бы в телеграмм выдавались значения float или int и как сделать так что бы они не были пустыми. Заранее прошу прощения за столь сумбурные объяснения. Код выкладываю ниже.
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ArduinoJson.h>
// Initialize Wifi connection to the router
char ssid[] = "Dlink"; // your network SSID (name)
char password[] = "Dlink"; // your network key
// Initialize Telegram BOT
#define BOTtoken "31606564:AFHBe1uUoSFX-jwzKcB8jp4NuMYT4QhEwgo" // your Bot Token (Get from Botfather)
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
int Bot_mtbs = 1000; //mean time between scan messages
long Bot_lasttime; //last time messages' scan has been done
const char* host = "api.openweathermap.org";
String line;
String name;
float tempC;
float tempCmin;
float tempCmax;
float pressure;
int humidity;
float windspeed;
int winddeg;
void jsonGet() {
// Use WiFiClient class to create TCP connections
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
client.println("GET /data/2.5/weather?id=1488754&appid=6a4ba421859c9f4166697758b68d889b HTTP/1.1");
client.println("Host: api.openweathermap.org");
client.println("Connection: close");
client.println();
delay(1500);
// Read all the lines of the reply from server and print them to Serial
while (client.available()) {
line = client.readStringUntil('\r');
}
Serial.print(line);
Serial.println();
Serial.println("closing connection");
StaticJsonBuffer<2000> jsonBuffer; /// буфер на 2000 символов
JsonObject& root = jsonBuffer.parseObject(line); // скармиваем String
if (!root.success())
{
Serial.println("parseObject() failed"); // если ошибка, сообщаем об этом
jsonGet(); // пинаем сервер еще раз
return; // и запускаем заного
}
Serial.println();
String name = root["name"]; // достаем имя,
Serial.print("name:");
Serial.println(name);
float tempK = root["main"]["temp"]; // достаем температуру из структуры main
float tempC = tempK - 273.15; // переводим кельвины в цельси
Serial.print("temp: ");
Serial.print(tempC); // отправляем значение в сериал
Serial.println(" C");
float tempKmin = root["main"]["temp_min"]; // и так далее
float tempCmin = tempKmin - 273.15;
Serial.print("temp min: ");
Serial.print(tempCmin);
Serial.println(" C");
float tempKmax = root["main"]["temp_max"];
float tempCmax = tempKmax - 273.15;
Serial.print("temp max: ");
Serial.print(tempCmax);
Serial.println(" C");
int pressurehPa = root["main"]["pressure"];
float pressure = pressurehPa / 1.333;
Serial.print("pressure: ");
Serial.print(pressure);
Serial.println(" mmHc");
int humidity = root["main"]["humidity"];
Serial.print("humidity: ");
Serial.print(humidity);
Serial.println(" %");
float windspeed = root["wind"]["speed"];
Serial.print("wind speed: ");
Serial.print(windspeed);
Serial.println(" m/s");
int winddeg = root["wind"]["deg"];
Serial.print("wind deg :");
Serial.println(winddeg);
}
void handleNewMessages(int numNewMessages) {
Serial.println("handleNewMessages");
Serial.println(String(numNewMessages));
for (int i=0; i<numNewMessages; i++) {
String chat_id = String(bot.messages[i].chat_id);
String text = bot.messages[i].text;
String from_name = bot.messages[i].from_name;
if (from_name == "") from_name = "Guest";
if (text == "/get_weather") {
//String pogoda = "gorod:"+ String(name) + ".\n";
//pogoda +="c"+ String(tempC)+ "\n";
//pogoda +="min c"+ String(tempCmin)+ "\n";
//pogoda += "max c"+String(tempCmax)+ "\n";
//pogoda += "/get_weather : see bellow\n";
bot.sendMessage(chat_id, String(line) , ""); // в телеграмм вываливается куча неудобоваримого текста
// do something
} else {
// or not to do
}
if (text == "/start")
{
String welcome = "Eto weather bot, " + from_name + ".\n";
welcome += "Press ''get_weather''.\n\n";
welcome += "/get_weather : dlay prognoza\n";
bot.sendMessage(chat_id, welcome, "");
}
}
}
void setup() {
Serial.begin(115200);
// Set WiFi to station mode and disconnect from an AP if it was Previously connected
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
// attempt to connect to Wifi network:
Serial.print("Connecting Wifi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
jsonGet();
}
void loop() {
if (millis() > Bot_lasttime + Bot_mtbs) {
int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while(numNewMessages) {
Serial.println("got response");
handleNewMessages(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
Bot_lasttime = millis();
}
}
Люди, помогите разобраться.
В начале программы я объявил переменную Sting (line) и String (name)
В следующей части программы где идет работа функции
voidjsonGet() эти переменные принимают значения.В переменной line - текст, где погода, ветер и имя города
В переменной name - город Тюмень.
Там же они и отправляются в serial port.
Далее идет работа другой функции
voidhandleNewMessages.Если заставить телеграмм бота выводить string (line) то действительно в чат приходит кусок текста.
bot.sendMessage(chat_id, String(line) ,"");Если в
bot.sendMessage(chat_id, String(line) ,"") прописать Strting (name) - то сообщения вообще не приходят.Не могу понять почему переменная line выводится ( в ней есть значения) а в переменной name - пусто (хотя в при работе функцииjsonGet в сериал порт выводится значения.)