So-net無料ブログ作成

ESP8266(WeMOS)のハングアップをATTINY85で自動リセット

IMG_5217.JPG
WeMOSは長い時間動作させると突然停止してしまう事が多々あります。
ATTINY85でハートビートをモニターし、動作しなくなった、WeMOSをリセットさせます。

#else
ADMUX = bit (REFS0) | (port & 0x07); // AVcc
#endif
noInterrupts ();
set_sleep_mode (SLEEP_MODE_ADC); // sleep during sample
sleep_enable();
// start the conversion
ADCSRA |= bit (ADSC) | bit (ADIE);
interrupts ();
sleep_cpu ();
sleep_disable ();
// reading should be done, but better make sure
// maybe the timer interrupt fired
// ADSC is cleared when the conversion finishes
while (bit_is_set (ADCSRA, ADSC))
{ }
byte low = ADCL;
byte high = ADCH;
ADCSRA = 0; // disable ADC
power_adc_disable();
return (high << 8) | low;
}
// watchdog interrupt
ISR (WDT_vect)
{
wdt_disable(); // disable watchdog
} // end of WDT_vect
#if defined(__AVR_ATtiny85__)
#define watchdogRegister WDTCR
#else
#define watchdogRegister WDTCSR
#endif
//display
#include "SSD1306_minimal.h"
#include #define DEG "\xa7" "C" SSD1306_Mini oled; byte switch_on = 0; void setup() { pinMode(1, OUTPUT);//LED digitalWrite(1, HIGH); pinMode(4, OUTPUT);//RESET digitalWrite(4, HIGH); switch_on = 1; oled.init(0x3c); oled.clear(); oled.startScreen(); oled.printString("init"); pinMode(A3, INPUT); //volt //Sleep wdt_reset(); delay(5000); digitalWrite(1, LOW); } void(* resetFunc) (void) = 0;//declare reset function at address 0 int a, a_pre = 0; unsigned long response_time = 0, interval_time = 0; void loop() { digitalWrite(1, HIGH); oled.clear(); oled.cursorTo( 0, 0 ); oled.printString("volt:"); // Volt=val/1023*(19.8+68.1)/19.8*3.3=val*0.0143 a_pre = a; a = int(analogRead(A3) * 0.0032); //for 3.3V char strSensorValue[5]; oled.printString(itoa(a, strSensorValue, 10)); // if (a != a_pre) { response_time = millis(); char buffer[10]; oled.cursorTo(0, 1); sprintf(buffer, "%lu", response_time); oled.printString(buffer); goToSleep (); } if (a == a_pre) { oled.cursorTo(0, 1); oled.printString("int"); interval_time = millis() - response_time; char buffer[10]; oled.cursorTo(0, 2); sprintf(buffer, "%lu", interval_time); oled.printString(buffer); goToSleep (); if ( interval_time > 5000) { oled.clear(); oled.cursorTo(0, 0); oled.printString("Reset"); digitalWrite(4, LOW); switch_on = 0; delay(1000); digitalWrite(4, HIGH); delay(10000); response_time = millis(); } } //sleep digitalWrite(1, LOW); goToSleep (); if (millis() > 30 * 24 * 60 * 60 * 1000) resetFunc(); } void goToSleep () { set_sleep_mode (SLEEP_MODE_PWR_DOWN); noInterrupts (); // timed sequence coming up // pat the dog wdt_reset(); // clear various "reset" flags MCUSR = 0; // allow changes, disable reset, clear existing interrupt watchdogRegister = bit (WDCE) | bit (WDE) | bit (WDIF); // set interrupt mode and an interval (WDE must be changed from 1 to 0 here) //watchdogRegister = bit (WDIE) | bit (WDP2) | bit (WDP1) | bit (WDP0); // set WDIE, and 2 seconds delay watchdogRegister = bit (WDIE) | bit (WDP2) | bit (WDP1); // set WDIE, and 1 seconds delay sleep_enable (); // ready to sleep interrupts (); // interrupts are required now sleep_cpu (); // sleep sleep_disable (); // precaution }
nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0