Created
July 31, 2016 17:47
-
-
Save weldtype/c160c8247ef3e17004e99f914c0ce987 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
小型I2C接続 128x64 OLED ディスプレイの動作確認 | |
2016/07/23 edy | |
このスケッチはu8glibのサンプルをカスタマイズしたものです。 | |
Universal 8bit Graphics Library | |
htempps://github.com/olikraus/u8glib | |
2016/07/26 ADT7410を接続、スケッチは「wsnakのブログ」を参考にした。 | |
htempp://www.wsnak.com/wsnakblog/?p=409 | |
2016/07/31 消費電流を抑えるためにラジオペンチさんの記事にあるdelayWDTを使ってみた。 | |
「消費電流が激減!delayWDT関数を作ってみた」 | |
htempp://radiopench.blog96.fc2.com/blog-entry-486.html | |
*/ | |
#include "U8glib.h" | |
#include <Wire.h>; | |
#include <avr/sleep.h> | |
#include <avr/wdt.h> | |
int I2CAdrs = 0x4b; //OLEDアドレス | |
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0); // I2C / TWI | |
float temp; | |
static char buf[8]; | |
static char temp_unit[3]; | |
float mesureTemp() | |
{ | |
uint16_t val; | |
long int ival; | |
// ワンショット リトリガ再設定 | |
Wire.beginTransmission(I2CAdrs); // S.C発行,CB送信 | |
Wire.write(0x03); // Configuration register 選択 | |
Wire.write(0x20 | 0x80); // one-shot mode 設定 | |
Wire.endTransmission(); // ストップ・コンディション | |
delay(240); | |
Wire.requestFrom(I2CAdrs, 2); // S.C発行,CB送信 | |
val = (uint16_t)Wire.read() << 8; // データの読み出し(上位) | |
val |= Wire.read(); // データの読み出し(下位) | |
//Wire.endTransmission(); | |
ival = (long int)val; | |
if (val & 0x8000) { // 符号判定 | |
// 負数 | |
ival = ival - 65536; | |
} | |
return (float)ival / 128.0; | |
} | |
void draw(void) { | |
dtostrf(temp, 6, 1, buf); | |
strcat(buf, temp_unit); | |
u8g.drawStr(0, 0, buf); | |
dtostrf(temp, 6, 1, buf); | |
strcat(buf, "%"); | |
u8g.drawStr(0, 23, buf); | |
dtostrf(temp + 1000, 6, 1, buf); | |
strcat(buf, "hP"); | |
u8g.drawStr(0, 46, buf); | |
} | |
void setup(void) { | |
Wire.begin(); // マスタ初期化 | |
u8g.setColorIndex(1); | |
u8g.setFont(u8g_font_courR18); | |
u8g.setFontPosTop(); // pixel on | |
temp_unit[0] = 0xb0; | |
temp_unit[1] = 'C'; | |
temp_unit[2] = '\0'; | |
} | |
void loop(void) { | |
temp = mesureTemp(); | |
// picture loop | |
u8g.firstPage(); | |
do { | |
draw(); | |
} while ( u8g.nextPage() ); | |
delayWDT(7); | |
} | |
// ここから下を全て使う | |
void delayWDT(unsigned long t) { // パワーダウンモードでdelayを実行 | |
delayWDT_setup(t); // ウォッチドッグタイマー割り込み条件設定 | |
ADCSRA &= ~(1 << ADEN); // ADENビットをクリアしてADCを停止(120μA節約) | |
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // パワーダウンモード | |
sleep_enable(); | |
sleep_mode(); // ここでスリープに入る | |
sleep_disable(); // WDTがタイムアップでここから動作再開 | |
ADCSRA |= (1 << ADEN); // ADCの電源をON (|=が!=になっていたバグを修正2014/11/17) | |
} | |
void delayWDT_setup(unsigned int ii) { // ウォッチドッグタイマーをセット。 | |
// 引数はWDTCSRにセットするWDP0-WDP3の値。設定値と動作時間は概略下記 | |
// 0=16ms, 1=32ms, 2=64ms, 3=128ms, 4=250ms, 5=500ms | |
// 6=1sec, 7=2sec, 8=4sec, 9=8sec | |
byte bb; | |
if (ii > 9 ) { // 変な値を排除 | |
ii = 9; | |
} | |
bb = ii & 7; // 下位3ビットをbbに | |
if (ii > 7) { // 7以上(7.8,9)なら | |
bb |= (1 << 5); // bbの5ビット目(WDP3)を1にする | |
} | |
bb |= ( 1 << WDCE ); | |
MCUSR &= ~(1 << WDRF); // MCU Status Reg. Watchdog Reset Flag ->0 | |
// start timed sequence | |
WDTCSR |= (1 << WDCE) | (1 << WDE); // ウォッチドッグ変更許可(WDCEは4サイクルで自動リセット) | |
// set new watchdog timeout value | |
WDTCSR = bb; // 制御レジスタを設定 | |
WDTCSR |= _BV(WDIE); | |
} | |
ISR(WDT_vect) { // WDTがタイムアップした時に実行される処理 | |
// wdt_cycle++; // 必要ならコメントアウトを外す | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment