Yahoo!株価ティッカープロジェクト – ArduinoとPythonでリアルタイム株価表示
必要な部品と材料
| Adafruit 16x2 キャラクターLCD (白文字/青背景) × 1 |
| Arduino Mega 2560 × 1 (UNOでも可、シリアルバッファー余裕のためMega推奨) |
| オス-メス ジャンパーワイヤー × 12 |
| オス-オス ジャンパーワイヤー × 5 |
必要な工具 (任意)
- 3Dプリンター (LCDケース出力用、Thingiverse: thing:614241)
ソフトウェア環境 (PC側)
- Python 2.7 (推奨: Enthought Canopy)
pip install yahoo_finance(注: 旧ライブラリ。現在はyfinance等へ移行推奨)pip install pyserial
プロジェクト概要
PC上のPythonスクリプトが Yahoo Finance API から複数銘柄の株価 (始値・現在値) を定期取得し、シリアル通信で Arduino に送信。Arduino は受信データを 16x2 LCD にスクロール表示します。銘柄リストは自由に編集可能です。
配線 (LCD → Arduino Mega)
| LCDピン | 機能 | Arduinoピン |
|---|---|---|
| 1 | VSS (GND) | GND |
| 2 | VDD (+5V) | 5V |
| 3 | VO (コントラスト) | 可変抵抗中点 (両端を5V/GND) |
| 4 | RS | D12 |
| 5 | RW | GND (書込み固定) |
| 6 | E | D11 |
| 11 | D4 | D5 |
| 12 | D5 | D4 |
| 13 | D6 | D3 |
| 14 | D7 | D2 |
| 15 | LED+ (バックライト+) | 5V (抵抗経由推奨) |
| 16 | LED- (バックライト-) | GND |
Pythonスクリプト (PC側)
from yahoo_finance import Share
import time
import serial
# 監視銘柄リスト (ティッカーシンボル)
StockShares = [
'DOW', 'YHOO', 'BAC', 'F', 'JPM', 'TWTR', 'CHK', 'PBR', 'FIT', 'COG',
'ABX', 'FCX', 'GE', 'TRGP', 'CNX', 'BSX', 'MRC', 'NKE', 'NEM', 'PBRA',
'HST', 'BP', 'MRK', 'HON', 'MET', 'CLR', 'WPX', 'EXC', 'JCP', 'YELP',
'GNC', 'TSLA', 'VRX', 'P', 'NFLX', 'CMG', 'SM', 'WYNN', 'SHAK', 'ICON'
]
# シリアルポート設定 (環境に合わせて変更)
ser = serial.Serial('COM1', 9600, timeout=1)
def printShare(share, name):
# 形式: "銘柄名: *始値,現在値"
msg = name + ': *' + share.get_open() + ',' + share.get_price()
ser.write(msg.encode() + b'\n')
print(msg)
time.sleep(0.1)
def mainProgram():
for symbol in StockShares:
try:
s = Share(symbol)
printShare(s, symbol)
s.refresh() # 最新データ取得
except Exception as e:
print("Error:", symbol, e)
time.sleep(9.5) # APIレート制限対策
if __name__ == '__main__':
while True:
mainProgram()
Arduinoスケッチ (LCD表示側)
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7
String symbol = "";
float openPrice = 0;
float currentPrice = 0;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
delay(1000);
}
void loop() {
if (Serial.available() > 0) {
// "SYMBOL: *OPEN,CURRENT" 形式で受信
symbol = Serial.readStringUntil('*');
openPrice = Serial.parseFloat();
currentPrice = Serial.parseFloat();
}
// 1行目: 銘柄 + 始値
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(symbol + " open:" + String(openPrice, 2));
// 2行目: 現在値
lcd.setCursor(0, 1);
lcd.print("current:" + String(currentPrice, 2));
delay(2000);
// スクロール表示 (長い銘柄名対応)
for (int i = 0; i < 17; i++) {
lcd.scrollDisplayLeft();
delay(200);
}
delay(500);
lcd.clear();
// 変化額表示
lcd.setCursor(0, 0);
lcd.print("change: " + String(currentPrice - openPrice, 2));
delay(2000);
for (int i = 0; i < 17; i++) {
lcd.scrollDisplayLeft();
delay(200);
}
lcd.clear();
}
現代的な改良版 (Python 3 + yfinance)
元の yahoo_finance ライブラリはメンテナンス終了しています。現在は yfinance の使用を推奨します。
# pip install yfinance pyserial
import yfinance as yf
import serial, time
ser = serial.Serial('COM3', 9600, timeout=1) # ポート調整
tickers = yf.Tickers(' '.join(StockShares))
while True:
for symbol in StockShares:
try:
hist = tickers.tickers[symbol].history(period='1d')
if not hist.empty:
open_p = hist['Open'].iloc[-1]
curr_p = hist['Close'].iloc[-1]
msg = f"{symbol}: *{open_p:.2f},{curr_p:.2f}\n"
ser.write(msg.encode())
print(msg.strip())
except Exception as e:
print(f"Error {symbol}: {e}")
time.sleep(10) # レート制限配慮
拡張アイデア
- 複数行LCD (20x4等) で同時表示銘柄数アップ
- OLEDディスプレイ (SSD1306等) でグラフィカル表示
- WiFi搭載ボード (ESP8266/ESP32) でPC不要のスタンドアローン化
- 日足チャート描画 (マイコン内蔵ディスプレイなら可能)
- アラート機能: 閾値突破でブザー/LED点滅
- 為替・暗号資産・指数等への対応 (API変更のみ)
注意事項
- Yahoo Finance API にはレート制限あり。頻繁すぎるアクセスは避ける (10秒以上間隔推奨)
- 市場休場時 (夜間・週末) はデータ更新されない
- ティッカーシンボルは Yahoo Finance 準拠 (米国株はそのまま、日本株は
7203.T等)
製造プロセス
- 現代トイレの進化、材料、製造
- リボルバー:起源から現代製造まで
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoプロジェクトのための最適化電源ソリューション
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- スマートArduino四足歩行ロボットの製作:ステップバイステップガイド
- ゲーム用カスタムArduinoジョイスティックハンドルの製作