Get it on Google Play


Wm뮤 :: 자주쓰는 아두이노 코드 모음

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
퇴직한 전자과 게임프로그래머
2020.3.48f1 , 2022.3.6f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


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
posted by 모카쨩

  • total
  • today
  • yesterday

Recent Post

저사양 유저용 블로그 진입