前回まで。
relativelayout.hatenablog.com
最近、ちょっとだけバグフィックスしたのでメモ。
レアな運行情報として、遅延はしないが運休があるパターンが有ったので、その場合は遅延と同じく黄色い点滅をさせるようにした。
遅延と大幅な乱れは区別がつきそうなので、遅延は黄色い点滅、大幅な乱れは黄色と赤の点滅に変更。
クソコードはこちら
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <Adafruit_NeoPixel.h>
char ssid[] = "xxx";
char password[] = "yyy";
char unkopage[] = "unkou.keikyu.co.jp";
int intervalSec = 10 * 60;
#define PIN 4
#define NUMLED 4
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMLED, PIN, NEO_RGB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
Serial.println("");
pixels.begin();
pixels.setBrightness(60);
}
void loop() {
connectWifi();
String result = getPageSource();
Serial.println(result);
disconnectWifi();
if (result.indexOf("受託") > 0) {
Serial.println("振替輸送受託!");
ledExtreme(intervalSec);
return;
}
if (result.indexOf("見合わせ") > 0) {
Serial.println("運転見合わせ!");
ledStopped(intervalSec);
return;
}
if (result.indexOf("乱れ") > 0) {
Serial.println("大幅に乱れている!");
ledBad(intervalSec);
return;
}
if (result.indexOf("遅れ") > 0 || result.indexOf("運休") > 0) {
Serial.println("遅延!");
ledDelayed(intervalSec);
return;
}
Serial.println("たぶん平常通り運転!");
delay(intervalSec * 1000);
return;
}
void connectWifi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
ledConnecting(3);
}
Serial.println("connected!");
}
void disconnectWifi() {
WiFi.disconnect();
Serial.println("disconnected!");
}
String getPageSource() {
WiFiClient client;
if ( !client.connect(unkopage, 80) ) {
return String("");
}
client.print(String("GET ") + "/" + " HTTP/1.1\r\n" +
"Host: " + unkopage + "\r\n" +
"Range: bytes=8000-9000\r\n" +
"Connection: close\r\n\r\n");
client.println();
delay(1000);
String body = "";
String unko = "<!-- ======================== 運行情報 =================================== -->";
while (client.available()) {
body += client.readStringUntil('\r');
}
body = body.substring(body.indexOf(unko) + unko.length());
body = body.substring(0, body.indexOf(unko));
return body;
}
void ledConnecting(int sec) {
int count = 0;
while (count < sec) {
for (int i = 0; i < 256; i += 5) {
setColor( i, i, i);
}
for (int i = 255; i >= 0; i -= 5) {
setColor( i, i, i);
}
count++;
}
}
void ledDelayed(int sec) {
int count = 0;
while (count < sec) {
for (int i = 0; i < 256; i += 5) {
setColor( i, i, 0);
}
for (int i = 255; i >= 0; i -= 5) {
setColor( i, i, 0);
}
count++;
}
}
void ledBad(int sec) {
int count = 0;
while (count < sec) {
for (int i = 0; i < 256; i += 5) {
setColor( i, 0, 0);
}
for (int i = 255; i >= 0; i -= 5) {
setColor( i, 0, 0);
}
for (int i = 0; i < 256; i += 5) {
setColor( i, i, 0);
}
for (int i = 255; i >= 0; i -= 5) {
setColor( i, i, 0);
}
count++;
count++;
}
}
void ledStopped(int sec) {
int count = 0;
while (count < sec) {
for (int i = 0; i < 256; i += 5) {
setColor( i, 0, 0);
}
for (int i = 255; i >= 0; i -= 5) {
setColor( i, 0, 0);
}
count++;
}
}
void ledExtreme(int sec) {
int count = 0;
while (count < sec) {
for (int i = 0; i < 20; i++) {
setRandomColor();
delay(50);
}
count++;
}
}
void setColor(int r, int g, int b) {
for (int i = 0 ; i < NUMLED; i++) {
pixels.setPixelColor(i, pixels.Color(r, g, b));
pixels.show();
}
delay(10);
}
void setRandomColor() {
for (int i = 0 ; i < NUMLED; i++) {
pixels.setPixelColor(i, pixels.Color(64 * random(1, 5) - 1 , 64 * random(1, 5) - 1 , 64 * random(1, 5) - 1 ));
pixels.show();
}
delay(10);
}