Чтобы работала текущая погода, идём на https://darksky.net , регистрируемся, получаем в панели API ключ. В 122 строке скетча заменяем мой демо ключ 5cd22334057113cf6f27f07eb36bae21 на полученный, и координаты 60,30 на свои. Не забываем в 27 и 28 строке скетча прописать свою Wifi сеть и пароль, и в 34 строке свой часовой пояс.
Время и погода берутся из интернета и синхронизируются. По сути, это просто расширенный пример NTP клиента.
Плата Wemos D1 R1 (или R2) + дисплей на ILI9341 320*240 на 3.3V, обе детали с алиэкспресса. Ну и пучок из 9 проводов. Wemos для большей эстетичности у меня запихнут в стандартный пластиковый бокс для ардуин (+1$).
Смешного? Да, ничего. Мне было приятно почитать и настроение улучшилось. А то после вчерашнего аномального наплыва тем типа "памагити, никампилируется, вы ниправильна памагаити" - хоть на форум не заходи.
Если Вам выдаётся сообщение, что нет заголовочного файла, значит Вы его не туда положили. Добейтесь. чтобы этого сообщения не было. Может быть тамбольше ничего и не нужно.
Вы же сидите и ленитесь даже написать куда Вы его засунули и скетч привести, а только мечтаете
kombatus пишет:
Кто бы дал ссылку.
Если ни хрена не делать, то нихрена и не сделается.
Сцуко, Вы когда-нибудь скетч покажете? И будете писать разумно "я положил в библиотеки" - эт одля бабушки, конкретные фолдеры указывавате. Наверняка не так сделал - скобки угловые стоят в include вместо кавычек, из скетча это было бы видно
kombatus пишет:
Что не так сделал?
День мозг выносите, а ни скетча, ни структуры файлов библиотек. Вот это и не так
С первой ошибкой понятно - несовместимость версий библиотек. Вот здесь написано, какую версию взять. чтобы она ушла. Последующие похожи на наводные. исправьте эту, там видно будет.
и ещё, что за бардак у Вас со скобками в #include. Запомните: если включаемый файл в папке проекта, пишите его имя в кавычках, если в общей папке библиотек - в угловых скобках. Сделайте правильно.
Вы думаете скетч перевставлять? Трудно смотреть. Вот в ошибках есть номера строк, а в коде не видно их.
и ещё, что за бардак у Вас со скобками в #include. Запомните: если включаемый файл в папке проекта, пишите его имя в кавычках, если в общей папке библиотек - в угловых скобках. Сделайте правильно.
Это не у него, это у меня :) и я способен жить с этой тяжкой проблемой. Но для народа всё же исправил скетч.
Чегото я затупил как вам показать скетч с номерами строк. В ID включаю показ номеров строк, но после копирования номеров строк не вижу.
Не надо тупить три раза, надо почитать или песочницу, или найти самому тему: "Вставка кода в тему...". Причем, судя по артефактам в сообщении, вы ее нашли, только использовали неверно. При верном использовании она сама пронумерует.
Сделал версию 2, подгружает ежеминутно фотку с Flickr по ключевым словам для фона, но для неё требуется вебсервер с "прокси для фликера", ибо jpeg. Esp8266, в принципе, может и сам отрисовать маленький jpeg, но заморачиваться и протирать SPIFFS временными файлами я, как обычно, поленился.
myserver.com/esp8266-proxy.php
В строке 19 заменяем MY_FLICKR_APIKEY на свой. Рядом с php файлом создаём wordlist.txt со словами для картинок, одна фраза/слово на каждую строку. Можно, например, нагуглить текстовик с 23000 названий городов мира, получаются спокойные, красивые, хорошо контрастные, и иногда неожиданные картинки. Ещё можно чуть подредактировать скрипт и показывать свои собственные фотки.
Заменяем в начале скетча WiFi сеть (строка 28), пароль (29), ключ от API darksky (35), широту и долготу (35), часовой пояс (43), прописываем свой вебсервер (39) и url прокси (40).
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341_fast.h>
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <SPI.h>
#include <TimeLib.h>
#include <WiFiClientSecure.h>
#include <WiFiUdp.h>
#include "calibri20pt8b.h"
#include "calibri64pt8b.h"
#define TFT_CS D10
#define TFT_DC D9
#define TFT_RST D8
#define TFT_MOSI D7
#define TFT_MISO D6
#define TFT_CLK D5
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);
#define LED_PIN D3
#define LED_BRIGHTNESS 90
#define BACK_COLOR ILI9341_BLACK
#define FORE_COLOR ILI9341_WHITE
const char ssid[] = "My WiFi Network"; // your network SSID (name)
const char pass[] = "My WiFi password"; // your network password
// Weather API
const int https_port = 443;
const char* weather_host = "api.darksky.net";
const char* weather_fingerprint = "EB C2 67 D1 B1 C6 77 90 51 C1 4A 0A BA 83 E1 F0 6D 73 DD B8";
String weather_url = "/forecast/5dc45194057113cf6f27f07eb3111222/60.03,30.38?units=si&lang=ru&exclude=minutely,hourly,daily,alerts,flags";
// proxy to Flickr API
const int http_port = 80;
const char* flickr_host = "myserver.com";
String flickr_url = "/esp8266-proxy.php";
static const char ntpServerName[] = "us.pool.ntp.org";
const int timeZone = 3; // Central European Time
WiFiUDP Udp;
unsigned int localPort = 8888;
String months[13] = {"", "января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"};
String days[8] = {"", "Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"};
time_t prevDisplay = 0;
double temperature = 0.0;
double humidity = 0;
double pressure = 0;
int temperature_sign = 0;
int humidity_sign = 0;
int pressure_sign = 0;
/*-------- Recode russian fonts from UTF-8 to Windows-1251 ----------*/
String utf8rus(String source)
{
int i, k;
String target;
unsigned char n;
char m[2] = { '0', '\0' };
k = source.length(); i = 0;
while (i < k) {
n = source[i]; i++;
if (n >= 0xC0) {
switch (n) {
case 0xD0: {
n = source[i]; i++;
if (n == 0x81) {
n = 0xA8;
break;
}
if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
break;
}
case 0xD1: {
n = source[i]; i++;
if (n == 0x91) {
n = 0xB8;
break;
}
if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
break;
}
}
}
m[0] = n; target = target + String(m);
}
return target;
}
/*-------- fetch temperature code ----------*/
void get_weather()
{
WiFiClientSecure client;
//client.setTimeout(15);
client.setFingerprint(weather_fingerprint);
if (!client.connect(weather_host, https_port))
{
return;
}
client.print(String("GET ") + weather_url + " HTTP/1.1\r\n" +
"Host: " + weather_host + "\r\n" +
"User-Agent: Arduino_ESP8266_NTP_Clock\r\n" +
"Connection: close\r\n\r\n");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
break;
}
}
String line;
while ( client.available() )
{
char c = client.read();
line += c;
}
DynamicJsonDocument doc(2048);
DeserializationError error = deserializeJson(doc, line);
// Test if parsing succeeds.
if (error) {
//Serial.print(F("deserializeJson() failed: "));
//Serial.println(error.c_str());
return;
}
// Get the root object in the document
JsonObject root = doc.as<JsonObject>();
double new_temperature = root["currently"]["temperature"];
temperature_sign = ( new_temperature > temperature ) ? 1 : -1;
temperature = new_temperature;
double new_humidity = root["currently"]["humidity"];
new_humidity = new_humidity * 100.0;
humidity_sign = ( new_humidity > humidity ) ? 1 : -1;
humidity = new_humidity;
double new_pressure = root["currently"]["pressure"];
new_pressure = new_pressure * 100.0 / 133.3224;
pressure_sign = ( new_pressure > pressure ) ? 1 : -1;
pressure = new_pressure;
}
/*-------- serial display code ----------*/
void printDigits(int digits)
{
Serial.print(":");
if (digits < 10)
Serial.print('0');
Serial.print(digits);
}
void serial_digitalClockDisplay()
{
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(".");
Serial.print(month());
Serial.print(".");
Serial.print(year());
Serial.println();
}
/*-------- TFT display code ----------*/
void tft_printDigits(int digits)
{
if (digits < 10)
tft.print('0');
tft.print(digits);
}
void draw_triangle_up( int top_x, int top_y )
{
for ( int x = top_x, y = top_y, len = 2; x >= top_x - 7; x--, y++, len += 2 )
{
tft.drawFastHLine( x, y, len, ILI9341_YELLOW );
}
}
void draw_triangle_down( int top_x, int top_y )
{
for ( int x = top_x, y = top_y, len = 2; x >= top_x - 7; x--, y--, len += 2 )
{
tft.drawFastHLine( x, y, len, ILI9341_CYAN );
}
}
void shadow_text( int x, int y, String str )
{
tft.setTextColor(BACK_COLOR);
tft.setCursor(x - 3, y - 3);
tft.print( str );
tft.setTextColor(FORE_COLOR);
tft.setCursor(x, y);
tft.print( str );
}
void back_pic()
{
WiFiClient client;
//client.setTimeout(15);
if (!client.connect(flickr_host, http_port))
{
tft.fillScreen(BACK_COLOR);
return;
}
client.print(String("GET ") + flickr_url + " HTTP/1.1\r\n" +
"Host: " + flickr_host + "\r\n" +
"User-Agent: Arduino_ESP8266_NTP_Clock\r\n" +
"Connection: close\r\n\r\n");
while (client.connected()) {
String line = client.readStringUntil('\n');
if (line == "\r") {
break;
}
}
char useless_crlf = client.read();
// read extra pixel to fix 1 pixel shift at left border
char useless_r = client.read();
char useless_g = client.read();
char useless_b = client.read();
#define IMG_BUF_SIZE 640 // (320 px * 2 lines)
uint8_t bytes[IMG_BUF_SIZE * 2];
uint16_t pixels[IMG_BUF_SIZE];
tft.fillScreen(BACK_COLOR);
tft.setAddrWindow(0, 0, 319, 239);
int x = 0, y = 0;
while ( client.available() )
{
client.readBytes( bytes, IMG_BUF_SIZE * 2 );
for ( int i = 0; i < IMG_BUF_SIZE; i++ )
{
pixels[i] = ((uint16_t) bytes[i * 2 + 1] << 8) | bytes[i * 2];
}
tft.pushColors(pixels, IMG_BUF_SIZE);
y += 2;
yield();
if (240 == y) break;
}
}
void draw_fulltime()
{
back_pic();
// current time
tft.setFont(&calibri64pt8b);
// time shadow
tft.setTextColor(BACK_COLOR);
tft.setCursor(-2, 159);
tft.print(" ");
tft_printDigits(hour());
tft.print(":");
tft_printDigits(minute());
tft.setTextColor(FORE_COLOR);
tft.setCursor(-5, 162);
tft.print(" ");
tft_printDigits(hour());
tft.print(":");
tft_printDigits(minute());
// another texts with small font
tft.setFont(&calibri20pt8b);
String str;
int len;
// day of week
str = utf8rus( days[ weekday() ] );
len = str.length() * 16;
shadow_text( 160 - len / 2, 40, str );
// day and month and year
str = utf8rus( String( day() ) + " " + months[ month() ] + " " + year() );
len = str.length() * 18;
shadow_text( 160 - len / 2, 72, str );
// weather line
int weather_y = 198;
// temperature
str = String( temperature, 1 ) + "*C";
len = str.length() * 16;
shadow_text( 160 - len / 2, weather_y, str );
// pressure
str = String( pressure, 0 );
shadow_text( 10, weather_y, str );
// humidity
str = String( humidity, 0 );
shadow_text( 260, weather_y, str );
// temperature trend
switch ( temperature_sign )
{
case 1:
draw_triangle_up( 163, 206 );
break;
case -1:
draw_triangle_down( 163, 213 );
break;
default:
break;
}
// humidity trend
switch ( humidity_sign )
{
case 1:
draw_triangle_up( 280, 206 );
break;
case -1:
draw_triangle_down( 280, 213 );
break;
default:
break;
}
// pressure trend
switch ( pressure_sign )
{
case 1:
draw_triangle_up( 40, 206 );
break;
case -1:
draw_triangle_down( 40, 213 );
break;
default:
break;
}
// seconds
tft.setFont();
tft.setCursor(54, 224);
tft.print("10");
tft.setCursor(108, 224);
tft.print("20");
tft.setCursor(159, 224);
tft.print("30");
tft.setCursor(212, 224);
tft.print("40");
tft.setCursor(266, 224);
tft.print("50");
}
void draw_seconds_bar()
{
for ( int y = 235; y <= 239; y++ )
{
tft.drawFastHLine( 0, y, second() * 5.33, ILI9341_WHITE );
yield();
}
}
void refresh_display()
{
if ( second() == 0 )
{
draw_fulltime();
}
if ( ( minute() % 5 == 0 ) && ( second() == 20 ) )
{
get_weather();
}
draw_seconds_bar();
}
/*-------- NTP code ----------*/
const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; // buffer to hold incoming & outgoing packets
// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[0] = 0b11100011; // LI, Version, Mode
packetBuffer[1] = 0; // Stratum, or type of clock
packetBuffer[2] = 6; // Polling Interval
packetBuffer[3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); // NTP requests are to port 123
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}
time_t getNtpTime()
{
IPAddress ntpServerIP; // NTP server's ip address
while (Udp.parsePacket() > 0) ; // discard any previously received packets
Serial.println("Transmit NTP Request");
// get a random server from the pool
WiFi.hostByName(ntpServerName, ntpServerIP);
Serial.print(ntpServerName);
Serial.print(": ");
Serial.println(ntpServerIP);
sendNTPpacket(ntpServerIP);
uint32_t beginWait = millis();
while (millis() - beginWait < 1500) {
int size = Udp.parsePacket();
if (size >= NTP_PACKET_SIZE) {
Serial.println("Receive NTP Response");
Udp.read(packetBuffer, NTP_PACKET_SIZE); // read packet into the buffer
unsigned long secsSince1900;
// convert four bytes starting at location 40 to a long integer
secsSince1900 = (unsigned long)packetBuffer[40] << 24;
secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
secsSince1900 |= (unsigned long)packetBuffer[43];
return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
}
}
Serial.println("No NTP Response :-(");
return 0; // return 0 if unable to get the time
}
/*-------- setup && loop ----------*/
void setup()
{
// system_update_cpu_freq(160);
pinMode(LED_PIN, OUTPUT);
analogWriteFreq(32768);
analogWrite(LED_PIN, LED_BRIGHTNESS);
tft.begin();
tft.setRotation(1);
tft.setTextSize(2);
tft.fillScreen(ILI9341_BLACK);
tft.setTextColor(ILI9341_WHITE);
tft.setCursor(0, 26);
tft.print("Connecting");
Serial.begin(9600);
delay(250);
Serial.println("");
Serial.println("NTP Clock");
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
tft.print(".");
Serial.print(".");
}
tft.println("");
tft.println(WiFi.SSID());
tft.print("IP: ");
tft.println(WiFi.localIP());
tft.println("Starting UDP");
Udp.begin(localPort);
tft.print("Local port ");
tft.println(Udp.localPort());
tft.println("Time sync");
setSyncProvider(getNtpTime);
setSyncInterval(300);
tft.println("Fetch weather");
get_weather();
tft.setTextSize(1);
tft.fillScreen(ILI9341_BLACK);
draw_fulltime();
}
void loop()
{
if (timeStatus() != timeNotSet)
{
// update the display only if time has changed
if (now() != prevDisplay)
{
prevDisplay = now();
// serial_digitalClockDisplay();
refresh_display();
}
}
}
Файлы шрифтов Calibri и дополнительные библиотеки берём в постах #1 и #2.
Спасибо! Но уже поделие вылезает за рамки категорий и "для ленивых", и "для начинающих" :)
Хочу ему ещё указывать ключевые слова из прогноза погоды, ну там, "saint-petersburg" + "winter", "summer" + "snowy", "rainy", "windy" + "night", "evening", "morning" - будет, как в yahoo погоде, красивые картинки с Flickr. Но и рандомные города пока тоже хорошие.
Вы не могли бы подробней про вебсервер с "прокси для фликера"
Поскольку обработка jpeg - довольно тяжелая и затратная операция для микроконтроллера, я решил переложить её на плечи большого брата. Простейший скрипт делает поисковый запрос к API фликера с рандомной строкой из текстового файла wordlist.txt (я положил туда список городов мира), получает ответ, скачивает картинку, масштабирует до размеров ILI9341 320x240, упаковывает в цветовой формат rgb565 и выдаёт получившуюся заготовку вимосу. Для этого и нужен вебсервер (у меня был :), подойдёт любой хостинг с любой современной версией php, можно разместить файл скрипта "фликер-прокси" на любом уже существующем вашем хостинге сайтов, либо можно установить на любой компьютер в локальной сети apache+php (nginx+php-fpm), миллионы инструкций для любых ОС есть в сети.
А что Вам реально нужно более 1000 раз в день погоду запрашивать?
Да проблема даже не в этом, а в этом....We are no longer accepting new signups. Please see our blog post for more information! We apologize for any inconvenience this causes.
Да проблема даже не в этом, а в этом....We are no longer accepting new signups. Please see our blog post for more information! We apologize for any inconvenience this causes.
Ну что же, в интернете нет ничего вечного, а особенно бесплатного. Рад за ребят, что их купил Apple. Значит, нужно просто найти любого другого поставщика погоды с API.
Часы - это одно из немногих поделий на ардуине, которым я действительно активно пользуюсь, поэтому за несколько лет они изменились, если поищу новый источник погоды, выложу обновление.
Да проблема даже не в этом, а в этом....We are no longer accepting new signups. Please see our blog post for more information! We apologize for any inconvenience this causes.
Ну что же, в интернете нет ничего вечного, а особенно бесплатного. Рад за ребят, что их купил Apple. Значит, нужно просто найти любого другого поставщика погоды с API.
Openweathermap я пользуюсь в вебе с 2010, интегрировал в туристические сайты, и к 2020, три раза приходилось переделывать интеграцию, чтобы погода продолжала показываться на карте. С - стабильность.
Но можно взять и их. Можно взять любого поставщика, их сотни, правда, реальных всего несколько, остальные берут друг у друга.
calibri20pt8b.h
calibri64pt8b.h
clock_ntp_weather.ino
Подключение дисплея на ILI9341 к вимосу:
Чтобы работала текущая погода, идём на https://darksky.net , регистрируемся, получаем в панели API ключ. В 122 строке скетча заменяем мой демо ключ 5cd22334057113cf6f27f07eb36bae21 на полученный, и координаты 60,30 на свои. Не забываем в 27 и 28 строке скетча прописать свою Wifi сеть и пароль, и в 34 строке свой часовой пояс.
Время и погода берутся из интернета и синхронизируются. По сути, это просто расширенный пример NTP клиента.
Также потребуется библиотека ArduinoJson версии 6 или новее, берётся с гитхаба: https://github.com/bblanchon/ArduinoJson
Также потребуется библиотека ILI9341_fast: https://yadi.sk/d/ENH19hiq9V-mnQ
А какие 2 детали нужны,хочу собрать?
bulat943
Плата Wemos D1 R1 (или R2) + дисплей на ILI9341 320*240 на 3.3V, обе детали с алиэкспресса. Ну и пучок из 9 проводов. Wemos для большей эстетичности у меня запихнут в стандартный пластиковый бокс для ардуин (+1$).
Спасибо,закажу!
Спасибо! Настроение с утра подняли! Спасибо!
Что в поделии смешного-то?))
Смешного? Да, ничего. Мне было приятно почитать и настроение улучшилось. А то после вчерашнего аномального наплыва тем типа "памагити, никампилируется, вы ниправильна памагаити" - хоть на форум не заходи.
Я уже настолько привык к кучам негатива на форуме, что даже и не захожу в "памагити никампилируецца", что толку, я ж не учитель русского.
У меня ид ругается на отсутствие WiFiClientSecure.h Библиотеки ZIP не нашел, только заголовочный файл. Загнал его в библиотеки, но .... результата нет
Беда. Как загнал,куда загнал, как именно ругается - всё секретно, беда.
При компиляции возникае ошибка: нет файла WiFiClientSecure.h
При компиляции возникае ошибка: нет файла WiFiClientSecure.h
Ну, если его нет, то как же Вы его
Загнал его в библиотеки
Значит, не туда загнал. Разбирайтесь. так не бывает.
Я о чем писал. Обычно скачиваешь ZIP библиотеку, добавляешь ее в среду ардуино и все готово.
А здесь в скетче необходима библиотека WiFiClientSecure, а ее целиком я не нахожу, только заголовочный файл. Вот в этом и засада.
Кто бы дал ссылку.
Если Вам выдаётся сообщение, что нет заголовочного файла, значит Вы его не туда положили. Добейтесь. чтобы этого сообщения не было. Может быть тамбольше ничего и не нужно.
Вы же сидите и ленитесь даже написать куда Вы его засунули и скетч привести, а только мечтаете
Кто бы дал ссылку.
Если ни хрена не делать, то нихрена и не сделается.
Файл WiFiClientSecure.h я положил в библиотеки
WiFiClientSecure.h - это файл из библиотеки поддержки esp8266 для arduino ide, он устанавливается автоматически при установке платы Wemos D1 в IDE.
https://github.com/esp8266/Arduino
https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WiFi/src
Спасибо. Какая последовательность дейтвий по установке поддержки esp8266 для ide ?
Спасибо. Какая последовательность дейтвий по установке поддержки esp8266 для ide ?
Добавить это - Также потребуется библиотека ArduinoJson, берётся с гитхаба: https://github.com/bblanchon/ArduinoJson
Файлыcalibri20pt8b.h и calibri64pt8b.h я добавил в папку с основным файлом, но при компиляции ошибка что такого файла нет?
Что не так сделал?
Сцуко, Вы когда-нибудь скетч покажете? И будете писать разумно "я положил в библиотеки" - эт одля бабушки, конкретные фолдеры указывавате. Наверняка не так сделал - скобки угловые стоят в include вместо кавычек, из скетча это было бы видно
Что не так сделал?
День мозг выносите, а ни скетча, ни структуры файлов библиотек. Вот это и не так
Вот последнее
Скетч:
давно бы так. Я пока посмотрю, а Вы перевставьте код, чтобы номера строк были, а то трудно его обсуждать без них.
С первой ошибкой понятно - несовместимость версий библиотек. Вот здесь написано, какую версию взять. чтобы она ушла. Последующие похожи на наводные. исправьте эту, там видно будет.
и ещё, что за бардак у Вас со скобками в #include. Запомните: если включаемый файл в папке проекта, пишите его имя в кавычках, если в общей папке библиотек - в угловых скобках. Сделайте правильно.
Вы думаете скетч перевставлять? Трудно смотреть. Вот в ошибках есть номера строк, а в коде не видно их.
и ещё, что за бардак у Вас со скобками в #include. Запомните: если включаемый файл в папке проекта, пишите его имя в кавычках, если в общей папке библиотек - в угловых скобках. Сделайте правильно.
Это не у него, это у меня :) и я способен жить с этой тяжкой проблемой. Но для народа всё же исправил скетч.
Чегото я затупил как вам показать скетч с номерами строк. В ID включаю показ номеров строк, но после копирования номеров строк не вижу.
Чегото я затупил как вам показать скетч с номерами строк. В ID включаю показ номеров строк, но после копирования номеров строк не вижу.
Не надо тупить три раза, надо почитать или песочницу, или найти самому тему: "Вставка кода в тему...". Причем, судя по артефактам в сообщении, вы ее нашли, только использовали неверно. При верном использовании она сама пронумерует.
Ну, Вы избавились от той ошибки? Что и-за версии библиотеки?
Спасибо всем за помощь. После установки ArduinoJson-v6.7.0-beta компиляция прошла успешно.
Спасибо всем за помощь. После установки ArduinoJson-v6.7.0-beta компиляция прошла успешно.
так еще в #19 посте я вам об этом сказал )))
Вы не могли бы выложить свои библиотеки или бинарник проекта?
Бинарник брал у автора https://github.com/karawin/Ka-Radio32
yucan
Все сторонние библиотеки описаны в посте #2.
http://arduino.ru/forum/proekty/wemos-d1-ili9341-wifi-chasy-s-pogodoi-iz-dvukh-detalei-dlya-lenivykh-i-novichkov#comment-421060
В бинарнике нет смысла, так как в скетче нужно вписывать свою wi-fi сеть, пароль от неё, апи ключ к сервису погоды, широту, долготу, и часовой пояс.
negavoid
Понял. Упустил из вида этот момент.
Бинарник брал у автора https://github.com/karawin/Ka-Radio32
Это другой проект.
Сделал версию 2, подгружает ежеминутно фотку с Flickr по ключевым словам для фона, но для неё требуется вебсервер с "прокси для фликера", ибо jpeg. Esp8266, в принципе, может и сам отрисовать маленький jpeg, но заморачиваться и протирать SPIFFS временными файлами я, как обычно, поленился.
myserver.com/esp8266-proxy.php
В строке 19 заменяем MY_FLICKR_APIKEY на свой. Рядом с php файлом создаём wordlist.txt со словами для картинок, одна фраза/слово на каждую строку. Можно, например, нагуглить текстовик с 23000 названий городов мира, получаются спокойные, красивые, хорошо контрастные, и иногда неожиданные картинки. Ещё можно чуть подредактировать скрипт и показывать свои собственные фотки.
clock_ntp_weather2.ino
Заменяем в начале скетча WiFi сеть (строка 28), пароль (29), ключ от API darksky (35), широту и долготу (35), часовой пояс (43), прописываем свой вебсервер (39) и url прокси (40).
Файлы шрифтов Calibri и дополнительные библиотеки берём в постах #1 и #2.
Красиво!
Спасибо! Но уже поделие вылезает за рамки категорий и "для ленивых", и "для начинающих" :)
Хочу ему ещё указывать ключевые слова из прогноза погоды, ну там, "saint-petersburg" + "winter", "summer" + "snowy", "rainy", "windy" + "night", "evening", "morning" - будет, как в yahoo погоде, красивые картинки с Flickr. Но и рандомные города пока тоже хорошие.
Вы не могли бы подробней про вебсервер с "прокси для фликера"
Поскольку обработка jpeg - довольно тяжелая и затратная операция для микроконтроллера, я решил переложить её на плечи большого брата. Простейший скрипт делает поисковый запрос к API фликера с рандомной строкой из текстового файла wordlist.txt (я положил туда список городов мира), получает ответ, скачивает картинку, масштабирует до размеров ILI9341 320x240, упаковывает в цветовой формат rgb565 и выдаёт получившуюся заготовку вимосу. Для этого и нужен вебсервер (у меня был :), подойдёт любой хостинг с любой современной версией php, можно разместить файл скрипта "фликер-прокси" на любом уже существующем вашем хостинге сайтов, либо можно установить на любой компьютер в локальной сети apache+php (nginx+php-fpm), миллионы инструкций для любых ОС есть в сети.
Уважаемый автор, подскажите новичку, как заменить Wemos D1 R1 на Wemos D1 R2. Что нужно изменить в скетче?
Чтобы работала текущая погода, идём на https://darksky.net , регистрируемся, получаем в панели API ключ. В
Только вот...
А что Вам реально нужно более 1000 раз в день погоду запрашивать?
А что Вам реально нужно более 1000 раз в день погоду запрашивать?
Да проблема даже не в этом, а в этом....We are no longer accepting new signups. Please see our blog post for more information! We apologize for any inconvenience this causes.
baloo
Абсолютно ничего. Всё должно работать без изменений и с Wemos D1 R2 (уже на текущий момент, кроме погоды).
Да проблема даже не в этом, а в этом....We are no longer accepting new signups. Please see our blog post for more information! We apologize for any inconvenience this causes.
Ну что же, в интернете нет ничего вечного, а особенно бесплатного. Рад за ребят, что их купил Apple. Значит, нужно просто найти любого другого поставщика погоды с API.
Часы - это одно из немногих поделий на ардуине, которым я действительно активно пользуюсь, поэтому за несколько лет они изменились, если поищу новый источник погоды, выложу обновление.
Да проблема даже не в этом, а в этом....We are no longer accepting new signups. Please see our blog post for more information! We apologize for any inconvenience this causes.
Ну что же, в интернете нет ничего вечного, а особенно бесплатного. Рад за ребят, что их купил Apple. Значит, нужно просто найти любого другого поставщика погоды с API.
ну openweathermap пока работает у меня....
Openweathermap я пользуюсь в вебе с 2010, интегрировал в туристические сайты, и к 2020, три раза приходилось переделывать интеграцию, чтобы погода продолжала показываться на карте. С - стабильность.
Но можно взять и их. Можно взять любого поставщика, их сотни, правда, реальных всего несколько, остальные берут друг у друга.