arduino examples

This commit is contained in:
2021-08-05 13:20:51 +09:00
commit 20c4a0fa7f
13 changed files with 663 additions and 0 deletions

7
Blink/.vscode/arduino.json vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"sketch": "Blink.ino",
"board": "arduino:avr:nano",
"configuration": "cpu=atmega328",
"port": "/dev/ttyUSB0",
"programmer": "AVRISP mkII"
}

21
Blink/.vscode/c_cpp_properties.json vendored Normal file
View File

@@ -0,0 +1,21 @@
{
"configurations": [
{
"name": "Arduino",
"includePath": [
"/snap/arduino/current/tools/**",
"/snap/arduino/current/hardware/arduino/avr/**",
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/usr/bin/cpp",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64",
"forcedInclude": [
"/snap/arduino/current/hardware/arduino/avr/cores/arduino/Arduino.h"
]
}
],
"version": 4
}

17
Blink/Blink.ino Normal file
View File

@@ -0,0 +1,17 @@
#include <Arduino.h>
// the setup function runs once when you press reset or power the board
void setup()
{
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop()
{
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(2000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}

View File

@@ -0,0 +1,83 @@
// --------------------------------------
// i2c_scanner
//
// Version 1
// This program (or code that looks like it)
// can be found in many places.
// For example on the Arduino.cc forum.
// The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
// Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26 2013
// V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
// by Arduino.cc user Krodal.
// Changes by louarnold removed.
// Scanning addresses changed from 0...127 to 1...119,
// according to the i2c scanner by Nick Gammon
// http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
// As version 4, but address scans now to 127.
// A sensor seems to use address 120.
// Version 6, November 27, 2015.
// Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}

Binary file not shown.

View File

@@ -0,0 +1,70 @@
const unsigned int TABLE[] = {
0X0000, 0XC0C1, 0XC181, 0X0140, 0XC301, 0X03C0, 0X0280, 0XC241,
0XC601, 0X06C0, 0X0780, 0XC741, 0X0500, 0XC5C1, 0XC481, 0X0440,
0XCC01, 0X0CC0, 0X0D80, 0XCD41, 0X0F00, 0XCFC1, 0XCE81, 0X0E40,
0X0A00, 0XCAC1, 0XCB81, 0X0B40, 0XC901, 0X09C0, 0X0880, 0XC841,
0XD801, 0X18C0, 0X1980, 0XD941, 0X1B00, 0XDBC1, 0XDA81, 0X1A40,
0X1E00, 0XDEC1, 0XDF81, 0X1F40, 0XDD01, 0X1DC0, 0X1C80, 0XDC41,
0X1400, 0XD4C1, 0XD581, 0X1540, 0XD701, 0X17C0, 0X1680, 0XD641,
0XD201, 0X12C0, 0X1380, 0XD341, 0X1100, 0XD1C1, 0XD081, 0X1040,
0XF001, 0X30C0, 0X3180, 0XF141, 0X3300, 0XF3C1, 0XF281, 0X3240,
0X3600, 0XF6C1, 0XF781, 0X3740, 0XF501, 0X35C0, 0X3480, 0XF441,
0X3C00, 0XFCC1, 0XFD81, 0X3D40, 0XFF01, 0X3FC0, 0X3E80, 0XFE41,
0XFA01, 0X3AC0, 0X3B80, 0XFB41, 0X3900, 0XF9C1, 0XF881, 0X3840,
0X2800, 0XE8C1, 0XE981, 0X2940, 0XEB01, 0X2BC0, 0X2A80, 0XEA41,
0XEE01, 0X2EC0, 0X2F80, 0XEF41, 0X2D00, 0XEDC1, 0XEC81, 0X2C40,
0XE401, 0X24C0, 0X2580, 0XE541, 0X2700, 0XE7C1, 0XE681, 0X2640,
0X2200, 0XE2C1, 0XE381, 0X2340, 0XE101, 0X21C0, 0X2080, 0XE041,
0XA001, 0X60C0, 0X6180, 0XA141, 0X6300, 0XA3C1, 0XA281, 0X6240,
0X6600, 0XA6C1, 0XA781, 0X6740, 0XA501, 0X65C0, 0X6480, 0XA441,
0X6C00, 0XACC1, 0XAD81, 0X6D40, 0XAF01, 0X6FC0, 0X6E80, 0XAE41,
0XAA01, 0X6AC0, 0X6B80, 0XAB41, 0X6900, 0XA9C1, 0XA881, 0X6840,
0X7800, 0XB8C1, 0XB981, 0X7940, 0XBB01, 0X7BC0, 0X7A80, 0XBA41,
0XBE01, 0X7EC0, 0X7F80, 0XBF41, 0X7D00, 0XBDC1, 0XBC81, 0X7C40,
0XB401, 0X74C0, 0X7580, 0XB541, 0X7700, 0XB7C1, 0XB681, 0X7640,
0X7200, 0XB2C1, 0XB381, 0X7340, 0XB101, 0X71C0, 0X7080, 0XB041,
0X5000, 0X90C1, 0X9181, 0X5140, 0X9301, 0X53C0, 0X5280, 0X9241,
0X9601, 0X56C0, 0X5780, 0X9741, 0X5500, 0X95C1, 0X9481, 0X5440,
0X9C01, 0X5CC0, 0X5D80, 0X9D41, 0X5F00, 0X9FC1, 0X9E81, 0X5E40,
0X5A00, 0X9AC1, 0X9B81, 0X5B40, 0X9901, 0X59C0, 0X5880, 0X9841,
0X8801, 0X48C0, 0X4980, 0X8941, 0X4B00, 0X8BC1, 0X8A81, 0X4A40,
0X4E00, 0X8EC1, 0X8F81, 0X4F40, 0X8D01, 0X4DC0, 0X4C80, 0X8C41,
0X4400, 0X84C1, 0X8581, 0X4540, 0X8701, 0X47C0, 0X4680, 0X8641,
0X8201, 0X42C0, 0X4380, 0X8341, 0X4100, 0X81C1, 0X8081, 0X4040
};
// the setup function runs once when you press reset or power the board
void setup() {
Serial.begin(9600);
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(500); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
byte data[] = {0x7e,0x01,0x01};
unsigned int r = crc(data, 3);
Serial.println(r, HEX);
//Serial.println(highByte(r), HEX);
//Serial.println(lowByte(r), HEX);
}
unsigned int crc (byte* nData, unsigned int nLength){
byte nTemp;
unsigned int wCRCWord = 0xFFFF;
while (nLength--)
{
nTemp = *nData++ ^ wCRCWord;
wCRCWord >>= 8;
wCRCWord ^= TABLE[nTemp];
}
return wCRCWord;
}

32
buzz/buzz.ino Normal file
View File

@@ -0,0 +1,32 @@
#include "muze.h"
#define PIN_BUZZ 3
unsigned long last_time_millis, current_time_millis;
Muze muze = Muze(PIN_BUZZ);
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(PIN_BUZZ, OUTPUT);
Serial.begin(115200);
last_time_millis = millis();
muze.setScore(GREEN_SLEEVES);
}
void loop() {
current_time_millis = millis();
if (current_time_millis < last_time_millis) {
last_time_millis = current_time_millis;
return;
}
muze.play();
last_time_millis = current_time_millis;
}

25
buzz/datetime.cpp Normal file
View File

@@ -0,0 +1,25 @@
#include "Arduino.h"
#include "datetime.h"
unsigned long DateTime::get(){
return _set_time + _elapsed_ms_after_set_time/1000;
}
void DateTime::set(unsigned long sec_since_epoch){
_set_time = sec_since_epoch;
_elapsed_ms_after_set_time = 0;
}
void DateTime::update(){
_current_ts = millis();
if (_current_ts < _last_ts) {
_set_time = _set_time + _elapsed_ms_after_set_time/1000;
_elapsed_ms_after_set_time = _current_ts + (MAX_UL - _last_ts);
} else {
_elapsed_ms_after_set_time += _current_ts;
}
_last_ts = _current_ts;
}

32
buzz/datetime.h Normal file
View File

@@ -0,0 +1,32 @@
#ifndef Elex_DateTime_lib
#define Elex_DateTime_lib
#include "Arduino.h"
#define MAX_UL 0xfffffffful
class DateTime {
public:
/*
* 매 루프마다 반복 실행해 줄 것.
*/
void update();
/**
* 현재 시간 설정 (초)
* 기준 시간은 알아서 정할 것.
*/
void set(unsigned long sec_since_epoch);
/*
* 현재 시간 (초)
*/
unsigned long get();
private:
// 시간 값이 설정된 기준 시간. 오버플로가 발생한 때에도 업데이트된다.
unsigned long _set_time;
// 기준 시간 이후 경과한 시간 (밀리초)
unsigned long _elapsed_ms_after_set_time;
// 매 루프마다 업데이트됨.
unsigned long _current_ts, _last_ts;
};
#endif

101
buzz/muze.cpp Normal file
View File

@@ -0,0 +1,101 @@
#include "Arduino.h"
#include "muze.h"
#define GAP_BETWEEN_NOTES 5
Melody _green_sleeves[] = {
{NOTE_G5, NOTE_LEN_8},
{NOTE_B5_F, NOTE_LEN_4}, {NOTE_C6, NOTE_LEN_8}, {NOTE_D6, NOTE_LEN_8_DOT}, {NOTE_E6, NOTE_LEN_16}, {NOTE_D6, NOTE_LEN_8},
{NOTE_C6, NOTE_LEN_4}, {NOTE_A5, NOTE_LEN_8}, {NOTE_F5, NOTE_LEN_8_DOT}, {NOTE_G5, NOTE_LEN_16}, {NOTE_A5, NOTE_LEN_8},
{NOTE_B5_F, NOTE_LEN_4}, {NOTE_G5, NOTE_LEN_8}, {NOTE_G5, NOTE_LEN_8_DOT}, {NOTE_F5_S, NOTE_LEN_16}, {NOTE_G5, NOTE_LEN_8},
{NOTE_A5, NOTE_LEN_4}, {NOTE_F5_S, NOTE_LEN_8}, {NOTE_D5, NOTE_LEN_4}, {NOTE_G5, NOTE_LEN_8},
{NOTE_B5_F, NOTE_LEN_4}, {NOTE_C6, NOTE_LEN_8}, {NOTE_D6, NOTE_LEN_8_DOT}, {NOTE_E6, NOTE_LEN_16}, {NOTE_D6, NOTE_LEN_8},
{NOTE_C6, NOTE_LEN_4}, {NOTE_A5, NOTE_LEN_8}, {NOTE_F5, NOTE_LEN_8_DOT}, {NOTE_G5, NOTE_LEN_16}, {NOTE_A5, NOTE_LEN_8},
{NOTE_B5_F, NOTE_LEN_8_DOT}, {NOTE_A5, NOTE_LEN_16}, {NOTE_G5, NOTE_LEN_8}, {NOTE_F5_S, NOTE_LEN_8_DOT}, {NOTE_E5, NOTE_LEN_16}, {NOTE_F5_S, NOTE_LEN_8},
{NOTE_G5, NOTE_LEN_2_DOT},
{NOTE_F6, NOTE_LEN_4_DOT}, {NOTE_F6, NOTE_LEN_8_DOT}, {NOTE_E6, NOTE_LEN_16}, {NOTE_D6, NOTE_LEN_8},
{NOTE_C6, NOTE_LEN_4}, {NOTE_A5, NOTE_LEN_8}, {NOTE_F5, NOTE_LEN_8_DOT}, {NOTE_G5, NOTE_LEN_16}, {NOTE_A5, NOTE_LEN_8},
{NOTE_B5_F, NOTE_LEN_4}, {NOTE_G5, NOTE_LEN_8}, {NOTE_G5, NOTE_LEN_8_DOT}, {NOTE_F5_S, NOTE_LEN_16}, {NOTE_G5, NOTE_LEN_8},
{NOTE_A5, NOTE_LEN_4}, {NOTE_F5_S, NOTE_LEN_8}, {NOTE_D5, NOTE_LEN_4_DOT},
{NOTE_F6, NOTE_LEN_4_DOT}, {NOTE_F6, NOTE_LEN_8_DOT}, {NOTE_E6, NOTE_LEN_16}, {NOTE_D6, NOTE_LEN_8},
{NOTE_C6, NOTE_LEN_4}, {NOTE_A5, NOTE_LEN_8}, {NOTE_F5, NOTE_LEN_8_DOT}, {NOTE_G5, NOTE_LEN_16}, {NOTE_A5, NOTE_LEN_8},
{NOTE_B5_F, NOTE_LEN_8_DOT}, {NOTE_A5, NOTE_LEN_16}, {NOTE_G5, NOTE_LEN_8}, {NOTE_F5_S, NOTE_LEN_8_DOT}, {NOTE_E5, NOTE_LEN_16}, {NOTE_F5_S, NOTE_LEN_8},
{NOTE_G5, NOTE_LEN_2_DOT}
};
Melody _minions[] = {
{NOTE_G3, NOTE_LEN_8}, {NOTE_G3, NOTE_LEN_8}, {NOTE_G3, NOTE_LEN_4}, {NOTE_G3, NOTE_LEN_16}, {NOTE_G3, NOTE_LEN_8}, {NOTE_G3, NOTE_LEN_16}, {NOTE_G3, NOTE_LEN_4},
{NOTE_G3, NOTE_LEN_8}, {NOTE_G3, NOTE_LEN_8}, {NOTE_G3, NOTE_LEN_4}, {NOTE_G3, NOTE_LEN_16}, {NOTE_G3, NOTE_LEN_8}, {NOTE_G3, NOTE_LEN_16}, {NOTE_A5, NOTE_LEN_8}, {NOTE_B5, NOTE_LEN_8},
};
Muze::Muze(int pin){
pinMode(pin, OUTPUT);
_pin = pin;
}
Muze::Muze(int pin, Score score){
pinMode(pin, OUTPUT);
_pin = pin;
setScore(score);
}
boolean Muze::play(){
_current_ts = millis();
if (_current_ts > _next_ts) {
if (_cue < _melody_size) {
_buzz();
_isPlaying = true;
} else {
noTone(_pin);
_isPlaying = false;
}
}
return isPlaying();
}
void Muze::setTempo(unsigned int tempo){
_tempo = tempo;
}
void Muze::setScore(Score score){
switch (score){
case MINIONS_0:
break;
case GREEN_SLEEVES:
default:
_melody = _green_sleeves;
_melody_size = sizeof(_green_sleeves) / sizeof(Melody);
_tempo = 100;
break;
}
_cue = 0;
_next_ts = 0;
_isPlaying = false;
}
bool Muze::isPlaying(){
return _isPlaying;
}
void Muze::_buzz() {
long duration = _duration(_melody[_cue].len);
tone(_pin, _melody[_cue].pitch, duration-GAP_BETWEEN_NOTES);
_next_ts = _current_ts + duration;
_cue ++;
}
unsigned long Muze::_duration(unsigned long len) {
return len * 60000 / _tempo / NOTE_LEN_4;
}

209
buzz/muze.h Normal file
View File

@@ -0,0 +1,209 @@
#ifndef Elex_Muze_lib
#define Elex_Muze_lib
#include "Arduino.h"
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_C1_S 35
#define NOTE_D1_F 35
#define NOTE_D1 37
#define NOTE_D1_S 39
#define NOTE_E1_S 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_F1_S 46
#define NOTE_G1_F 46
#define NOTE_G1 49
#define NOTE_G1_S 52
#define NOTE_A1_F 52
#define NOTE_A1 55
#define NOTE_A1_S 58
#define NOTE_B1_F 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_C2_S 69
#define NOTE_D2_F 69
#define NOTE_D2 73
#define NOTE_D2_S 78
#define NOTE_E2_F 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_F2_S 93
#define NOTE_G2_F 93
#define NOTE_G2 98
#define NOTE_G2_S 104
#define NOTE_A2_F 104
#define NOTE_A2 110
#define NOTE_A2_S 117
#define NOTE_B2_F 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_C3_S 139
#define NOTE_D3_F 139
#define NOTE_D3 147
#define NOTE_D3_S 156
#define NOTE_E3_F 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_F3_S 185
#define NOTE_G3_F 185
#define NOTE_G3 196
#define NOTE_G3_S 208
#define NOTE_A3_F 208
#define NOTE_A3 220
#define NOTE_A3_S 233
#define NOTE_B3_F 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_C4_S 277
#define NOTE_D4_F 277
#define NOTE_D4 294
#define NOTE_D4_S 311
#define NOTE_E4_F 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_F4_S 370
#define NOTE_G4_F 370
#define NOTE_G4 392
#define NOTE_G4_S 415
#define NOTE_A4_F 415
#define NOTE_A4 440
#define NOTE_A4_S 466
#define NOTE_B4_F 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_C5_S 554
#define NOTE_D5_F 554
#define NOTE_D5 587
#define NOTE_D5_S 622
#define NOTE_E5_F 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_F5_S 740
#define NOTE_G5_F 740
#define NOTE_G5 784
#define NOTE_G5_S 831
#define NOTE_A5_F 831
#define NOTE_A5 880
#define NOTE_A5_S 932
#define NOTE_B5_F 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_C6_S 1109
#define NOTE_D6_F 1109
#define NOTE_D6 1175
#define NOTE_D6_S 1245
#define NOTE_E6_F 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_F6_S 1480
#define NOTE_G6_F 1480
#define NOTE_G6 1568
#define NOTE_G6_S 1661
#define NOTE_A6_F 1661
#define NOTE_A6 1760
#define NOTE_A6_S 1865
#define NOTE_B6_F 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_C7_S 2217
#define NOTE_D7_F 2217
#define NOTE_D7 2349
#define NOTE_D7_S 2489
#define NOTE_E7_F 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_F7_S 2960
#define NOTE_G7_F 2960
#define NOTE_G7 3136
#define NOTE_G7_S 3322
#define NOTE_A7_F 3322
#define NOTE_A7 3520
#define NOTE_A7_S 3729
#define NOTE_B7_F 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_C8_S 4435
#define NOTE_D8_F 4435
#define NOTE_D8 4699
#define NOTE_D8_S 4978
#define NOTE_REST 0
#define NOTE_LEN_4 720
#define NOTE_LEN_2 1440 // NOTE_LEN_4 * 2
#define NOTE_LEN_1 2880 // NOTE_LEN_4 * 4
#define NOTE_LEN_8 360 // NOTE_LEN_4 / 2
#define NOTE_LEN_16 180 // NOTE_LEN_4 / 4
#define NOTE_LEN_32 90 // NOTE_LEN_4 / 8
#define NOTE_LEN_2_DOT 2160 // NOTE_LEN_2 * 1.5
#define NOTE_LEN_4_DOT 1080 // NOTE_LEN_4 * 1.5
#define NOTE_LEN_8_DOT 540 // NOTE_LEN_8 * 1.5
#define NOTE_LEN_16_DOT 270 // NOTE_LEN_16 * 1.5
#define NOTE_LEN_32_DOT 135 // NOTE_LEN_32 * 1.5
#define NOTE_LEN_4_TRIPLET 240 // NOTE_LEN_4 / 3
#define NOTE_LEN_8_TRIPLET 120 // NOTE_LEN_8 / 3
#define NOTE_LEN_16_TRIPLET 60 // NOTE_LEN_16 / 3
#define NOTE_LEN_32_TRIPLET 30 // NOTE_LEN_32 / 3
/*
재생 가능한 곡 리스트
*/
typedef enum _Score {
GREEN_SLEEVES = 0,
MINIONS_0,
} Score;
/*
음의 높이와 길이
*/
typedef struct _Melody {
unsigned int pitch;
unsigned int len;
} Melody;
/*
노래하는 클래스
*/
class Muze {
public:
// 핀 번호
Muze(int pin);
// 핀 번호, 재생할 곡
Muze(int pin, Score score);
public:
// 메인 루프에서 호출하면 재생된다.
boolean play();
// 곡의 빠르기를 지정
void setTempo(unsigned int tempo);
// 재생할 곡을 선
void setScore(Score score);
// 재생 중인가?
bool isPlaying();
private:
// 핀 번호
int _pin;
// 음표 데이터 배열
Melody* _melody;
// 데이터의 크기
unsigned int _melody_size;
// 템포
unsigned int _tempo = 100;
// 데이터의 현재 재생 인덱스
unsigned int _cue = 0;
// 현재 시간, 다음 재생 이벤트 발생 시간
unsigned long _current_ts = 0, _next_ts = 0;
// 재생 중?
bool _isPlaying;
// 소리 발생
void _buzz();
// 재생 시간 계산
unsigned long _duration(unsigned long len);
};
#endif

View File

@@ -0,0 +1,39 @@
int result = 0;
void setup(){
Serial.begin(9600);
}
long readVcc() {
// Read 1.1V reference against AVcc
// set the reference to Vcc and the measurement to the internal 1.1V reference
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
#else
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif
delay(2); // Wait for Vref to settle
ADCSRA |= _BV(ADSC); // Start conversion
while (bit_is_set(ADCSRA,ADSC)); // measuring
uint8_t low = ADCL; // must read ADCL first - it then locks ADCH
uint8_t high = ADCH; // unlocks both
long result = (high<<8) | low;
result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
return result; // Vcc in millivolts
}
void loop(){
result = readVcc();
Serial.println(result);
delay(1000);
}

View File

@@ -0,0 +1,27 @@
#include <avr/wdt.h>
void setup() {
wdt_disable(); // 셋업 중에는 워치독 사용을 중지한다.
Serial.begin(9600);
Serial.println("setup()");
wdt_enable(WDTO_4S);
}
void loop() {
wdt_reset(); // 워치독 타이머를 리셋한다.
//wdt_reset();
unsigned long currentMillis = millis();
Serial.println(currentMillis);
if (currentMillis>10000) {
while(1){
Serial.println("delay... ");
delay(1000);
}
}
Serial.println("loop()");
delay(1000);
}