Wemos D1 + ILI9341 RBC News Box
- Войдите на сайт для отправки комментариев
Стареть я стал, новости почитывать. Чтобы не отвлекаться от работы, собрал на клоне Wemos D1 и ILI9341 эдакий News Box, показывающий новости от РБК. Решил выложить, так как в соседней теме увидал интерес к этой плате.
Wemos D1 - $6 на али
Дисплей на ILI9341 - $3.5 на али
Провода dupont папа-мама - $0.61 за 60 штук на али
#include <ESP8266WiFi.h> #include "SPI.h" #include "Adafruit_GFX.h" #include "Adafruit_ILI9341_fast.h" #include <Fonts/DroidSerifBold18pt8b.h> const char* ssid = "network"; const char* password = "pass"; const char* host = "myserver.com"; #define TFT_DC D9 #define TFT_CS D10 #define TFT_MOSI D7 #define TFT_CLK D5 #define TFT_RST D3 #define TFT_MISO D6 // Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC // Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); // If using the breakout, change pins as desired Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); void setup() { Serial.begin(115200); delay(10); // LED +3.3 V pinMode( D4, OUTPUT ); digitalWrite( D4, HIGH ); tft.begin(); tft.setRotation(1); tft.fillScreen(ILI9341_RED); tft.setFont(&DroidSerifBold18pt8b); tft.setTextSize(1); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } } void loop() { WiFiClient client; const int httpPort = 80; if (!client.connect(host, httpPort)) { return; } String url = "/ardunews/"; client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); unsigned long timeout = millis(); while (client.available() == 0) { if (millis() - timeout > 5000) { client.stop(); return; } } tft.fillScreen(ILI9341_BLACK); tft.setTextColor(ILI9341_WHITE); tft.setCursor(0, 15); bool drop_header = false; while (client.available()) { String line = client.readStringUntil('\r'); line.trim(); if ( line.length() == 0 ) drop_header = true; if ((drop_header) && ( line.length() != 0 )) { tft.print( utf8rus( line ) ); tft.println(); tft.println(); } yield(); } delay(120000); }
На сервере стоит простенький скрипт, парсящий главную страницу RBC
<?php $line = file_get_contents( "http://rbc.ru" ); $regex = "#<span class=\"news-feed__item__title\">(.*?)</span>#si"; preg_match_all($regex, $line, $matches); $regex = "#<span class=\"news-feed__item__date\">(.*?)</span>#si"; preg_match_all($regex, $line, $time_matches); $news = []; $i = 0; foreach ( $matches[1] as $line ) { $long_time = trim( $time_matches[1][$i] ); list( $rubric, $short_time ) = explode( ",", $long_time ); // if ( !empty( trim( $short_time ) ) ) { $line = trim( strip_tags( $line ) ); $line = str_replace(" ", "", $line); $line = str_replace("«", "\"", $line); $line = str_replace("»", "\"", $line); $line = str_replace("\xA0\xC2", " ", $line); // strange B letter instead of spacebar $line = str_replace("\xC2\xA0", " ", $line); // remove strange B [other way] $line = iconv("UTF-8","Windows-1251//IGNORE", $line ); $line = iconv("Windows-1251", "UTF-8", $line ); $news[] = trim( $short_time ) . " " . $line; } $i++; } for ( $i = 0; $i < 4; $i ++ ) { echo trim( $news[$i] ) . "\r\n"; }
Получилось вот так:
В планах - прикрутить фотку топ-новости для дисплея, показывать на нём попеременно то фотку с подписью, то список последних новостей. У ESP8266 1 мегабайт оперативки, на подготовленную для 320*240*2 фотку вполне хватит. Ещё думается прикрутить парсинг других сайтов, довести до ума русификацию через стандартные шрифты Adafruit GFX (сейчас использовал сконвертированный шрифт из соседней темы).