工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

eDOT:高精度Arduino時計・気象ステーション(IRリモコン・自動輝度調整内蔵)

必要な部品と用品

ATmega328P-PU(マイクロチップ) ×1
MAX7219 LEDドライバ ×6
BME280 温湿度・気圧センサー(GY-BMEPブレークアウト) ×1
Adafruit 8×8 ドットマトリクスLED(Luckylight M1603095 白色) ×6
DS3231 RTC(高精度リアルタイムクロック) ×1
Arduino Nano R3 ×1
Arduino UNO ×1
eDOTcore 自作PCB ×1

必要な工具・機器

使用ソフトウェア

プロジェクト概要

eDOTとは

Arduinoベースの高精度時計・気象ステーションです。内蔵IRリモコン受信機と自動輝度調整機能を備え、6枚の8×8ドットマトリクスLEDで時刻、温度、湿度、気圧、曜日、日付を順次表示します。将来的にWi-Fiモジュール等で拡張可能な設計です。

3Dプリントパーツ: Thingiverse からダウンロード可能

eDOT:高精度Arduino時計・気象ステーション(IRリモコン・自動輝度調整内蔵)
eDOT:高精度Arduino時計・気象ステーション(IRリモコン・自動輝度調整内蔵)

YouTubeチャンネル: UCbIomyFKzBiLHqEb2xv9GHQ

部品表(BOM)

eDOTcore PCB

制御基板の最初のプロトタイプが完成。詳細は eDOTcoreプロジェクトページ 参照。

eDOT:高精度Arduino時計・気象ステーション(IRリモコン・自動輝度調整内蔵)

ソースコード

eDOT: Versatile precision weather station and clock

// eDOT: Versatile precision weather station and clock
// HISTORY
// 11/12/2015 Added measurement calibration coefficients
// 09/06/2016 Added automatic display brightness
// 09/06/2016 Added task scheduler
// 07/08/2016 Added eDOT splashscreen

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <Average.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "RTClib.h"
#include <EasyScheduler.h>

Adafruit_BME280 bme; // I2C
RTC_DS3231 rtc;

int pinCS = 10;
int numberOfHorizontalDisplays = 7;
int numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

#define TEMPERATURE 0
#define HUMIDITY 1
#define PRESSURE 2
#define TIME 3
#define DAY 4
#define DATE 5

float temp, tempavg, hum, humavg, press, pressavg;
char tempf[8], humf[8], pressf[8];
int screen = 0;
long previousLEDMillis = 0;
long LEDInterval = 5000;
int screenMax = 5;
bool screenChanged = true;
float lightsens, screenBrt = 0, lightsensavg;

Average<float> avetemp(60);
Average<float> avehum(60);
Average<float> avepress(60);
Average<float> avelightsens(40);

// キャリブレーション係数
float temp_o = -1.70, temp_s = 1.0, temp_lin;
float hum_o = 2.45, hum_s = 1.0, hum_lin;
float press_o = 0.0, press_s = 1.0, press_lin;
float brt_o = -4, brt_s = 1.35;

Scheduler Task1, Task2;

void setup() {
  Task1.start(); Task2.start();
  Wire.begin();
  bme.begin(0x76);
  matrix.setIntensity(screenBrt);
  // 7枚のディスプレイ回転設定
  for (int i = 0; i <= 7; i++) matrix.setRotation(i, 1);
  rtc.begin();
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // 初回のみ時刻合わせ

  // スプラッシュスクリーン
  matrix.fillScreen(0); matrix.write();
  matrix.setCursor(12,0); matrix.print("eDOT");
  for (screenBrt = 0; screenBrt <= 15; screenBrt++) {
    delay(25); matrix.setIntensity(screenBrt); matrix.write();
  }
  delay(250);
  for (screenBrt = 15; screenBrt >= 0; screenBrt--) {
    delay(50); matrix.setIntensity(screenBrt); matrix.write();
  }
  delay(500);
  matrix.fillScreen(0); matrix.write();
  delay(1000);
}

void loop() {
  Task1.check(acq1, 500);
  Task2.check(acq2, 20);
}

void acq1() {
  // データ取得と移動平均
  temp = bme.readTemperature(); avetemp.push(temp); tempavg = avetemp.mean();
  hum = bme.readHumidity(); avehum.push(hum); humavg = avehum.mean();
  press = bme.readPressure(); avepress.push(press); pressavg = avepress.mean();
  DateTime now = rtc.now();
  outSec = now.second(); outMin = now.minute(); outHour = now.hour();
  outday = now.day(); outmonth = now.month(); outyear = now.year() - 2000;
  dow = now.dayOfTheWeek();
}

void acq2() {
  // 光センサー読み取り・輝度自動調整
  lightsens = analogRead(A3);
  avelightsens.push(lightsens);
  lightsensavg = avelightsens.mean();
  screenBrt = constrain(((lightsensavg / 1023.0 * 15) * brt_s + brt_o), 0, 15);
  matrix.setIntensity(screenBrt);

  // 線形化補正
  temp_lin = tempavg * temp_s + temp_o;
  hum_lin = humavg * hum_s + hum_o;
  press_lin = pressavg * press_s + press_o;

  unsigned long currentLEDMillis = millis();
  if (currentLEDMillis - previousLEDMillis > LEDInterval) {
    previousLEDMillis = currentLEDMillis;
    screen++; if (screen > screenMax) screen = 0;
    screenChanged = true;
  }

  if (screenChanged) {
    screenChanged = false;
    switch (screen) {
      case TEMPERATURE:
        dtostrf(temp_lin, 4, 2, tempf);
        matrix.setCursor(6,0); matrix.setTextSize(1); matrix.setTextColor(255);
        matrix.print(tempf); matrix.drawRect(37,0,2,2,255); matrix.setCursor(40,0); matrix.print("C");
        matrix.write(); matrix.fillScreen(0); break;
      case HUMIDITY:
        dtostrf(hum_lin, 4, 2, humf);
        matrix.setCursor(6,0); matrix.setTextSize(1); matrix.setTextColor(255);
        matrix.print(humf); matrix.setCursor(37,0); matrix.print("%");
        matrix.write(); matrix.fillScreen(0); break;
      case PRESSURE:
        dtostrf(press_lin, 6, 0, pressf);
        matrix.setCursor(0,0); matrix.setTextSize(1); matrix.setTextColor(255);
        matrix.print(pressf); matrix.setCursor(37,0); matrix.print("Pa");
        matrix.write(); matrix.fillScreen(0); break;
      case TIME:
        matrix.setCursor(0,0); matrix.setTextSize(1); matrix.setTextColor(255);
        if (outHour < 10) matrix.print("0");
        matrix.print(outHour); matrix.print(":");
        if (outMin < 10) matrix.print("0");
        matrix.print(outMin); matrix.print(":");
        if (outSec < 10) matrix.print("0");
        matrix.print(outSec);
        matrix.write(); matrix.fillScreen(0); break;
      case DATE:
        matrix.setCursor(0,0); matrix.setTextSize(1); matrix.setTextColor(255);
        if (outday < 10) matrix.print("0");
        matrix.print(outday); matrix.print("/");
        if (outmonth < 10) matrix.print("0");
        matrix.print(outmonth); matrix.print("/");
        matrix.print(outyear);
        matrix.write(); matrix.fillScreen(0); break;
      case DAY:
        matrix.setCursor(15,0); matrix.setTextSize(1); matrix.setTextColor(255);
        matrix.print(daysOfTheWeek[dow]);
        matrix.write(); matrix.fillScreen(0); break;
    }
  }
}

製造プロセス

  1. Raspberry Pi搭載DIYソーラー駆動気象ステーション
  2. Raspberry Pi 2とADS-WS1で屋外気象観測ステーションを構築
  3. 高度気象ステーション v2.0:温度・気圧・湿度・高度のリアルタイム監視
  4. Arduino POVクロック:残像効果で浮かび上がるLED時計を自作する
  5. 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
  6. Arduino Dueと3.2インチTFTで作る温度監視付きリアルタイムクロック
  7. 10ドルで作る携帯型Arduino気象観測ステーション – Nano、DHT22、BMP180、LCDで簡単DIY
  8. Arduino Nanoと128x64 OLEDで実行するセルラーオートマトン「ライフゲーム」
  9. ArduinoとThingSpeakで作るリアルタイム気象モニタリングシステム
  10. ArduinoとGoogleスプレッドシート連携 リアルタイムRFID勤怠管理システム
  11. Arduino + Windows IoT + Azure クラウドによる高度な転倒検知システム