commit 20c4a0fa7fc1131dbe6d8a8c403733a40d090811 Author: Elex Date: Thu Aug 5 13:20:51 2021 +0900 arduino examples diff --git a/Blink/.vscode/arduino.json b/Blink/.vscode/arduino.json new file mode 100644 index 0000000..5666526 --- /dev/null +++ b/Blink/.vscode/arduino.json @@ -0,0 +1,7 @@ +{ + "sketch": "Blink.ino", + "board": "arduino:avr:nano", + "configuration": "cpu=atmega328", + "port": "/dev/ttyUSB0", + "programmer": "AVRISP mkII" +} \ No newline at end of file diff --git a/Blink/.vscode/c_cpp_properties.json b/Blink/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..9ba00b1 --- /dev/null +++ b/Blink/.vscode/c_cpp_properties.json @@ -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 +} \ No newline at end of file diff --git a/Blink/Blink.ino b/Blink/Blink.ino new file mode 100644 index 0000000..10eed5f --- /dev/null +++ b/Blink/Blink.ino @@ -0,0 +1,17 @@ +#include + +// 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 +} \ No newline at end of file diff --git a/I2C_Scanner/I2C_Scanner.ino b/I2C_Scanner/I2C_Scanner.ino new file mode 100644 index 0000000..d8b7991 --- /dev/null +++ b/I2C_Scanner/I2C_Scanner.ino @@ -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 + + +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 +} diff --git a/blink_and_serial/.vscode/ipch/1cc73c488439ca3e/mmap_address.bin b/blink_and_serial/.vscode/ipch/1cc73c488439ca3e/mmap_address.bin new file mode 100644 index 0000000..a77bfd5 Binary files /dev/null and b/blink_and_serial/.vscode/ipch/1cc73c488439ca3e/mmap_address.bin differ diff --git a/blink_and_serial/blink_and_serial.ino b/blink_and_serial/blink_and_serial.ino new file mode 100644 index 0000000..740fc0b --- /dev/null +++ b/blink_and_serial/blink_and_serial.ino @@ -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; +} + + diff --git a/buzz/buzz.ino b/buzz/buzz.ino new file mode 100644 index 0000000..a249c90 --- /dev/null +++ b/buzz/buzz.ino @@ -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; +} + diff --git a/buzz/datetime.cpp b/buzz/datetime.cpp new file mode 100644 index 0000000..923039f --- /dev/null +++ b/buzz/datetime.cpp @@ -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; +} diff --git a/buzz/datetime.h b/buzz/datetime.h new file mode 100644 index 0000000..7c56a07 --- /dev/null +++ b/buzz/datetime.h @@ -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 diff --git a/buzz/muze.cpp b/buzz/muze.cpp new file mode 100644 index 0000000..d252b0c --- /dev/null +++ b/buzz/muze.cpp @@ -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; +} + + diff --git a/buzz/muze.h b/buzz/muze.h new file mode 100644 index 0000000..2cdbb00 --- /dev/null +++ b/buzz/muze.h @@ -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 + diff --git a/voltage_check/voltage_check.ino b/voltage_check/voltage_check.ino new file mode 100644 index 0000000..fc62d57 --- /dev/null +++ b/voltage_check/voltage_check.ino @@ -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); + +} diff --git a/watchdog_test/watchdog_test.ino b/watchdog_test/watchdog_test.ino new file mode 100644 index 0000000..5feb7d0 --- /dev/null +++ b/watchdog_test/watchdog_test.ino @@ -0,0 +1,27 @@ +#include + +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); +}