2021. 6. 21. 18:39
아두이노
문자열 처리
int StringToHex(char str[])
{
return (int) strtol(str, 0, 16);
}
int StringToHex(String text)
{
return (int) strtol(text.c_str(), 0, 16);
}
void StringToHexArray(byte *byteArray,String text)
{
for(int i=0;i<text.length();i++)
{
byteArray[i]=StringToHex(text.substring(i*2,i*2+2));
}
}
String IntToHexString(int hexInt)
{
return String("0123456789ABCDEF"[hexInt/16])+String("0123456789ABCDEF"[hexInt%16]);
}
문자열 연산
//정적 문자열+정적 문자열
String text=String("text1")+String("text2");
//문자열+숫자
String text=String("text1")+number;
//문자열+캐릭터
String text=String("text1")+char;
enum (개구림)
//선언부
enum State {
Start, //다른 Enum인자명, 함수명과 동일하면 안된다
NonPlaying,
Playing
};
State state=Start;
//switch
String Message="Unknown";
switch(state)
{
case Start:
Message="Start";
break;
case NonPlaying:
Message="NonPlaying";
break;
}
//enum연산
state=(State)((int)state+1);
enum 길이
슬프게도 이것보다 더 좋은 방법을 찾을수 없었다
enum State {
Start,
NonPlaying,
Playing,
Count
};
int _max=Count;
enum class
이름 충돌 방지한답시고 더 귀찮게 만들어놨다.
유지보수하는놈은 지능 덜 떨어진게 분명함. C#좀 보고 배워야 한다
//선언부
enum class State {
Start,
NonPlaying,
Playing
};
State state=State::Start;
//switch
String Message="Unknown";
switch(state)
{
case State::Start:
Message="Start";
break;
case State::NonPlaying:
Message="NonPlaying";
break;
}
//enum연산
state=(State)((int)state+1);
enum class 길이
enum class State {
Start,
NonPlaying,
Playing,
Count
};
int _max=(int)State::Count;
//연산에 적용
state=(State)((int)state-1);
if((int)state<0)
{
state=(State)((int)State::Count-1);
}
state=(State)((int)state+1);
if(state>=State::Count)
{
state=(State)0;
}
비프, 부저 (패시브)
void HandmadeTone(int pin,int frequency,int duration)
{
#if defined(ARDUINO_AVR_UNO)
tone(pin, frequency, duration);
#else
bool pinState=HIGH;
int delayTime=(1000*1000)/(frequency*4);
for(int i=0;i<(duration*1000)/delayTime;i++)
{
pinState=!pinState;
digitalWrite(pin, pinState);
delayMicroseconds(delayTime);
}
digitalWrite(pin, LOW);
#endif
}
void Beef()
{
int pin=4;
int frequency=768;
int duration=100;
HandmadeTone(pin, frequency, duration);
}
void BeefError()
{
int pin=4;
int frequency=768*0.25;
int duration=100;
HandmadeTone(pin, frequency, duration);
delay(100);
HandmadeTone(pin, frequency, duration);
}
버튼
내부적으로 저항이 생기기 때문에 별도 저항연결이 필요없다
int pinButton=2;
void setup()
{
pinMode(pinButton, INPUT_PULLUP);
}
void loop()
{
if(!digitalRead(pinButton))
{
//실행코드
while(!digitalRead(pinButton))
{
delay(10);
}
}
}
델타타임
unsigned long currentTime=0;
unsigned long currentTimePrevious=0;
float deltaTime=0.01;
void SetDeltaTime()
{
currentTime=millis();
float deltaTimeTemp=((float)(currentTime-currentTimePrevious))/1000;
currentTimePrevious=currentTime;
if(deltaTimeTemp>0)
{
deltaTime=deltaTimeTemp;
}
}
void loop()
{
SetDeltaTime() ;
Serial.println(String(deltaTime));
}
조이스틱
int xVal=analogRead(A0);
if(xVal<128)
{
//Left
delay(400);
}
if(xVal>1024-128)
{
//Right
delay(400);
}
int yVal=analogRead(A1);
if(yVal<128)
{
//Up
delay(400);
}
if(yVal>1024-128)
{
//Down
delay(400);
}
개빡치게 중앙값이 750~800이고 조금만 움직여도 맥스값을 찍는다
C++판 nameof
#define NAMEOF(name) #name
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
int frequency=768;
Serial.print(__func__); //setup
Serial.print(NAMEOF(frequency)); //frequency
}
__func__ 가 함수명이고
NAMEOF는 define으로 선언해주어야 한다
완벽히 동일한 기능을 하는건 아니고 잘못된 값을 넣어도 잘만 컴파일 된다. IDE에서 이름확인하는데에만 쓰자
define 원래 용도가 이건데 매크로같은 용도이다.
자세한건
https://dev.to/tomoyukiaota/exploring-c-equivalent-of-cs-nameof-operator-1p8c
http://www.cplusplus.com/forum/beginner/206693/
두곳을 참조하자
EEPROM
어드레스 0~512
값 0~255
#include <EEPROM.h>
int index=0;
int indexAddress=0;
void Read()
{
index = EEPROM.read(indexAddress);
}
void Save()
{
EEPROM.write(indexAddress, index);
}
c++
'아두이노' 카테고리의 다른 글
아두이노 헤더 예제 (0) | 2021.07.15 |
---|---|
byte to hex (0) | 2021.02.23 |
아두이노 RC522 (RFID 13.56MHz) (0) | 2020.11.12 |