2차 프로젝트에서 기존 1차에서 쓰던 방식

(AT 커맨드를 통해 ESP-8266 모듈을 직접 제어하고, GET 방식으로 센서 값 전송)

을 그대로 쓸려다 MQTT 통신을 써 볼려니 문제가 생겼다. 

ESP8266과 ESP 01 어댑터를 조합하여 아두이노에 연결하고,

WiFiEsp 라이브러리를 같이 사용했는데,

테스트 코드를 업로드 했을 때 unsupported firmware version / module initialize failed

등등의 오류를 많이 구경하다...해결 방법을 찾아서 정리해본다.

 

0. 펌웨어 교체 - 통신속도(보레이트) 확인

 

최근 나오는 모델은 보통 기본 통신속도가 9600으로 되어있는 경우가 많다. 

또는 아두이노에서 실습을 할려고 통신속도를 변경하는 경우가 많은데, 

 

공식적으론 115200으로 출고가 된다. 

이를 115200으로 원상복구 시켜줘야 하는데

AT+CIOBAUD=115200 또는 AT+UART_DEF=115200,8,1,0,0 명령으로 변경할 수 있다.

사전 설치된 모듈의 펌웨어에 따라 사용 할 수 있는 명령어가 다르니 확인하도록 하자!

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

void setup() {
  Serial.begin(9600);

  mySerial.begin(9600); // 115200인 경우 변경해주면 됨
}

void loop() { 
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

 

코드를 업로드 한 후 라인 인코딩은 Both NL & CL, 보레이트는 9600으로 설정하고

AT를 입력하여 OK 응답이 날라오는지 확인한다.

 

아두이노와의 배선은 다음과 같이 연결한다.

https://funyphp.com/archive/arduino/20 의 배선도 참고

다만 업데이트 하기 전에 3.3V 핀 위에 있는 RESET 핀과 GND 핀을 쇼트시킨 상태에서 진행해야 성공률이 높다.

(아두이노에 내장된 MCU를 비활성화 시키는 역활을 한다.)

 

1. 펌웨어 파일 업로드하기

esp_iot_sdk_v1.5.0_15_11_27.zip
2.08MB
FLASH_DOWNLOAD_TOOLS_v2.4_150924.rar
5.44MB

상단의 두 파일을 받아 적당한 위치에 압축을 해제한다.

ESP_DOWNLOAD_TOOL_V2.4.exe 파일을 실행하면 다음과 같은 화면이 표시된다.

 

1-1 Download Path Config 설정

순서는 상관 없지만 파일 명과 주소는 반드시 맟줘주어야 한다! 

 

  bin\at\nobooteagle\flash.bin  , ADDR : 0x00000

  bin\at\nobooteagle\irom0text.bin , ADDR :  0x40000

  bin\blank.bin  , ADDR :  0xfe000

  bin\blank.bin  , ADDR : 0x7e000

추가한 뒤 좌측의 체크 표시를 모두 활성화 시켜준다.

 

1-2 기타 설정

 

SPI SPEED : 40MHz

SPI MODE : QIO OR DOUT

FLASH SIZE : DETECTED INFO 표시되는 정보대로 맞춰주기 (대부분 8Mbit이긴 함)

COM PORT & BAUDRATE : 장치관리자에 표시되는 아두이노의 시리얼 포트 / 115200으로 설정

 

START를 누른 뒤 완료되길 기다리면 된다. 설정 값에 문제가 없다면 완료 메세지를 확인할 수 있을 것이다.

 

 

 

다만...ESP-8266 모듈의 단점이 자체 전원 소비량이 많다는 것 (어디까지나 아두이노에 붙여 사용할때의 문제)

인지, 완벽히 호환되지는 않는 듯 하다. 아두이노에 종속적인 센서들을 많이 쓰는 지라

ESP 32로의 이동은 어려워서 아두이노 메가를 사용중에 있는데, 

MQTT 라이브러리와 이런저런 센서를 붙혀서 올리고 하는 과정이 꽤나 손이 많이 간다.

분명 저장 공간상으론 남아도는데 틈만 나면 커넥션이 끊겼다가 다시 붙거나 / 아예 못잡거나 / 무한정 시도하거나 이 세가지의 동작이 지속되고 있다. MQTT 로직이 섞여들어가서 그런건지는 모르겠으나 의도한 동작 때문에

코드를 그렇게 짰는데..  머리가 너무 복잡하다.

 

2차 프로젝트를 위해 DB 멘토링을 받으면서 강사분이 객체지향에 대해 야무지게 설명을 해주셔서..

복습 겸 옮겨보고자 한다.

 

 

네이버 IT 용어사전 객체 검색 결과는 다음과 같다.

 

어렵긴 하지만...요약해보면 다음과 같다. 

 

객체란?

개념적인 것들 (사람/동물/사물/주문/예약/감정....등등)을 의미한다.

 

고유한 속성을 가지고 있다.

타인이 알 수 있는 것.

사전에 등록된 명사.

 

고유한 속성이란게 애매모호하면 타인이 알 수 있는 것, 사전에 등록된 명사 둘만을 생각해도 좋다.

 

즉 "asdlkfjasdflkklsdfwe"는 객체가 될 수 없다. 타인도 모르고 사전에도 없기 때문에!

하지만, 속성과 기능이 포함된 객체를 표현하려면 다른 게 필요한데, 이럴때 Class를 사용한다.

클래스는 크게 두 가지로 나눌 수 있다.

 

사용자 정의 클래스(User Defined Class) vs 내장 클래스 (Built-In-Class)

 

이름과 나이를 가지는 학생이란 클래스를 만들어보면 다음과 같다. 

public class Student                             // 클래스 이름
{
   private String name;                          // 속성:Property:멤버필드
   private int age;

   public Student()                              // 생성자 :: 기본생성자
   {
   }
   
   public Student(String name, int age)          // 생성자 1
   {
      this.name = name;
      this.age  = age;
   }
   public void setName(String name)              // 기능:메소드:멤버함수
   {
      this.name = name;
   }
   public String getName()
   {
      return this.name;
   }
   public void setAge(int age)
   {
      this.age = age;
   }
   public String getName()
   {
      return this.name;
   }
}

 

이름과 나이 속성을 필드로 선언을 하고, 두 종류의 생성자를 호출한 모습이다.

 

생성자의 특징 : 클래스 명과 같은 이름을 가지고 반환타입이 없다. 

처음 선언된 생성자에는 매개변수가 없는데, 이는 기본 생성자라고 해서 클래스가 생성될 때(인스턴스화)

자동으로 호출이 되며, 

두 번째 생성자는 전달인자와 속성이 동일하기 때문에 자기 자신을 가르키는 this 키워드를 사용한 것이다. 

 

//객체 인스턴스화 (메모리 할당) 
Student s1 = new Student();

 

객체지향의 기초 요소 4가지

(1) 캡슐화(encapsulation) : 속성과 기능을 클래스 내부에 집어넣는 행위 (변수와 함수를 하나의 단위로 묶는 것.)
     1.1정보은닉(information hiding)
: private / protected / public (접근자 제한)

     프로그램의 세부 구현을 외부로 드러나지 않도록 모듈 내부에 감추는 것.

 

(2) 상속(inheritance)  : 클래스나 추상 클래스를 상속받는 행위

자식 클래스가 부모 클래스의 속성과 기능을 그대로 물려받는 것.

     2.1 오버로딩 vs 오버라이딩


 (3) 다형성(polymorphism)
: poly = multi, numerous; morph = form

   하나의 변수, 또는 함수가 상황에 따라 다른 의미로 해석될 수 있는 것을 의미한다.
     (3.1) subtype polymorphism   (서브타입 다형성) - 메소드 오버라이딩
     (3.2) parametric polymorphism (매개변수 다형성) - 제네릭 메소드

     (3.3) ad-hoc polymorphism (임시 다형성) - 함수 오버로딩

     (3.4) coercion polymorphism (강제 다형성) - 묵시적(자동)/명시적(수동) 형변환


 (4) 직렬화(Serializtion) :
네트워크 상에서 전송되는 코드를 바이트 코드 형태로 변환해서 전송의 효율성 높임. 

     (4.1) 역직렬화(Deserializtion) : 전송받은 바이트 코드를 다시 객체화 시키는 작업.

 

 

 

 

 

'학원 수업 관련 > Language' 카테고리의 다른 글

안드로이드의 엑티비티와 인텐트  (0) 2022.01.23

기업 연계프로젝트 참여와 팀 내 아이디어를 기반으로 하여 프로젝트를 진행할 수 있었는데,

개인적으론 반대했지만, 팀원들의 뜻에 따르기로 하고, 기업 연계 프로젝트에 참여하게 되었다.

(마음고생도 되게 많이 했다..)

 

 

 

 

요구되는 기술 스택들에 대해 별 안내 없이 들어서 더 거부감이 컸던것도 있다. (이걸 다 써야 하는거야?)

 

같은 과정을 듣는 다른 분반 팀들과 협업 형식으로 진행이 되는데,

 

크게는 대립이

 

"각자 전체 서비스를 소형화 시켜 구현하는 것이다. vs 센서 수집 시스탬과 전체 관제 시스템을 두 팀이 나눠 진행한다."

"프로젝트 발표를 한 팀이 전담하는 것은 부당하다. vs 굳이 두 팀 각자 같은 주제로 발표할 필요가 있나?"

 

라는 내용에서 발생했지만

 

"센서 수집 시스템은 A분반 팀이 진행하고, 통합 관제 시스템 및 비콘 출입관리 시스템은 B분반 팀이 진행한다."

"발표는 각자가 개발한 기능에 초점을 맞춰 진행하고, 기타 문서는 통합이 가능하면 통합하는 순으로 한다."

 

로 Fix가 되어 얼마 전 부품 선정을 마치고, 학습에 필요한 도서도 주문 완료 했다.

 

그래서....내가 맡은 웹서버 구현 및 데이터베이스 구축, 라즈베리파이 셋팅 및 환경 백업의 과정을 요약해보고자 한다.

 

 

0. 라즈베리파이 원격 접속 설정

 

자주 쓰게 될 SSH와 VNC를 활성화 해주었다. VNC가 연결되었을 때의 해상도도 별도로 설정함.

 

1. mariaDB 설정 및 node.js 최신버전 설치

 

//mariadb 설치
sudo apt-get install mariadb-server

//mariadb 보안 설정, 입력 한 후 내용 읽어보며 진행하기.
sudo mysql_secure_installation

//관리자 계정으로 접속, 모든 ip에 대한 허용 진행
sudo mysql -u root -p 설정했던 비밀번호

//계정 생성 및 비밀번호 설정
create user'사용자명'@'호스트명' identified by '패스워드';

//모든 데이터베이스에 대한 접근권한을 특정 사용자에게 부여하는 명령
GRANT ALL PRIVILEGES ON *.* TO '사용자명'@'호스트명' IDENTIFIED BY '패스워드';
//호스트 명을 *.*로 해두면 모든 IP에서 접속이 가능하다. 다만 보안설정은 필수!

flush privileges;

// mariadb 서비스 종료, 시작, 재시작
sudo service mysql stop
sudo service mysql start
sudo service mysql restart

 

다음 경로의 파일을 열어준다.

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

 

bind-address 가 기본 값으론 127.0.0.1로 되어있는데, 이를 *로 바꾸어 준다.

Ctrl +x로 나가면서 y 입력하고 빠져나간 후 서비스를 다시 시작해준다.

 

기존 개발환경과 일치시키기 위해 nodejs의 버전을 업데이트 시켜준다. 현재 기준 최신 LTS 버전은 

16.13.1이지만, 라즈베리파이에는 이보다 이전의 버전이 설치되어 있을 것이다.

 

//설치된 nodejs의 버전 확인
node -v

//구버전 node.js 삭제
sudo apt-get remove nodejs
sudo apr-get autoremove -y

//패키지 저장소와 버전 비교
apt list | grep nodejs

//nodejs 패키지 저장소 최신화
sudo curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -

//갱신 여부 확인
apt list | grep nodejs

//최신버전 nodejs 설치
sudo apt-get install nodejs -y

 

2. vsCode 설치 및 ufw(리눅스 방화벽) 설치, DB 및 자주 쓰는 포트 열기

//vsCode 설치 
sudo apt-get install code -y

//방화벽 설치
sudo apt-get install ufw -y

일단 확실하게 열어야 할 포트는 SSH 사용을 위한 22번 포트, VNC Viewer를 위한 5900포트, mysql에서 사용되는

3306 포트가 되겠다. (필요한 포트가 있다면 포트번호만 바꾸는 방식으로 열어줄 수 있으니 걱정 마시라..!)

기본 정책상으론 들어오는 포트는 모두 닫혀있기에 필요한 포트만 열어주는 식으로 작업했다.

//방화벽 활성화
sudo ufw enable

//방화벽 끄기
sudo ufw disable

//포트 허용
sudo ufw allow '포트번호'

//포트 차단
sudo ufw deny '포트번호'

모든 작업이 되었다면 한번 방화벽을 껐다가 다시 켜 주자.

 

테스트 해 본 결과이다. 

 

 

번외 :: 라즈베리파이 환경 백업하기

저장장치로 마이크로 SD카드가 아닌 외장 SSD를 사용중에 있는데, 스냅샷 겸 현재 상태를 이미지 화 시키고 싶었다.

Win32diskimger32의 경우 모든 섹터를 저장하니 저장장치 크기만큼 점유한다는 문제가 있어 알아보던중...

Acronis True Image를 이용하기로 했다. 마침 학원 PC의 SSD가 WD 제품인지라..for Western Digital 버전을 다운로드, 

백업을 진행하고 테스트를 해 봤는데...정상동작한다!

 

ex)단, 사양차이가 나는 라즈베리파이의 모델 간 작업 시에는 오류가 발생할 가능이 높다.

특히 상위 모델에서 백업한 이미지를 구형 모델에 복원 시킬 경우 오류 발생하는 빈도가 높았다.(직접 당함)

라즈베리파이 3/3+에서 백업한 자료를 라즈베리파이 4에 작업 할 경우 - 정상 동작

라즈베리파이 4 4기가 모델에서 백업한 자료를 라즈베리파이 4 2기가 모델에 작업할 경우 - 오류 발생

하지만 동일 기기의 백업 목적으로는 사용하기가 좋다. 

 

 

라즈베리파이를 셋팅하면서 나름대로 오류를 해결한 방법들에 대해 정리해보고자 한다.

 

 

1. 저장장치 준비

16G 정도의 마이크로 SD 카드나, USB 메모리, 외장하드를 준비한다.

특히나 마이크로 SD카드의 경우 읽기 쓰기 속도가 빠른 제품을 사용하는 것이 사용 시의 답답함을 줄일 수 있다.

(별도의 EMMC가 내장 된 것이 아니라, 마이크로 SD카드 혹은 외장 하드를 운영체제 저장공간으로 사용하기 때문에

이러한 장치들의 읽기, 쓰기 속도에 영향을 많이 받는다.)

 

2. 라즈베리파이용 OS (라즈비안) 이미지 다운로드 받기

 

https://www.raspberrypi.com/software/

 

Raspberry Pi OS – Raspberry Pi

From industries large and small, to the kitchen table tinkerer, to the classroom coder, we make computing accessible and affordable for everybody.

www.raspberrypi.com

공식 사이트에 접속한다.

 

상단의 Software를 클릭하고, 하단으로 내려간다.

 

'See all download option'를 클릭한다. 

 

Raspberry Pi OS 에서 Raspberry Pi OS with desktop and recommended software  아래의 Download를 클릭하여 이미지를 내려받는다. (각종 IDE, 게임, 툴들이 사전 설치되어있는 이미지이다.)

 

3. balenaEtcher 다운로드 (또는 Windiskimager32 사용해도 무관)

 

https://www.balena.io/etcher/? 

 

balena - The complete IoT fleet management platform

Infrastructure and tools to develop, deploy, and manage connected devices at scale. Your first ten devices are always free.

www.balena.io

프로그램 제작사의 홈페이지로 이동한다.

 

중앙에서 Download for Windows (x86|x64) 를 클릭하고, (Portable) 표시가 있는 걸 클릭한다. 

다운로드가 완료되면 저장장치를 PC에 연결하고, Etcher를 실행한다. (포터블 버전이라 실행에 시간이 걸림).

 

4. 이미지 플래싱 하기

Etcher가 실행되면, 화면에서 Flash from file을 클릭하고, 아까 다운로드받았던 이미지를 지정해준다. 

 

Select target를 클릭하여 이미지를 설치할 저장장치를 선택하고, 하단의 Select를 클릭한다. 

그런 뒤 Flash를 클릭하면 UAC 창이 뜨면서 명령 프롬프트를 사용하기 위한 권한을 물어본다. (거기서 예 클릭해야 함)

자동으로 Flash (쓰기) 작업을 진행하고, verify(검증) 절차가 끝나게 된다. 

 

끝나게 되면 무조건 이런 메세지가 뜨게 되는데 이유는 다음과 같다.

윈도우에서 인식할 수 없는 ext4 형식을 사용하기 때문에 포맷을 하겠냐고 물어보게 되는데, 여기서 디스크 포맷을 누르면 4단계 처음부터 다시 해야 하니 취소를 눌러준다.

 

4-1 WiFi 네트워크 사전설정하기

boot 드라이브 내에 다음과 같은 파일을 생성한다. (저장 타입은 모든 파일 (All Types)으로!)

 

파일명 :: wpa_supplicant.conf


ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="WIFI 이름"
    psk="WIFI 암호"
}

ssid 자리에는 사용중인 인터넷 공유기의 SSID를, psk자리에는 공유기의 비밀번호를 넣고 저장한다.

작성이 완료되면 저장장치를 제거한다.

 

 

5.저장장치 연결 및 부팅

라즈베리파이 하단에 아까 작업한 SD 카드를 연결하거나, USB 포트에 저장장치를 연결한다.

전원을 연결하기 전에 모니터 케이블과 키보드, 마우스를 연결하고, 전원을 연결해야 한다,

랜선이 있다면 랜선도 같이 연결한다.

 

 

6-1. 초기 설정 (비밀번호 변경)

 

초기 id, 비밀번호는 pi / raspberry 이다.

이미 셋팅해놓은 라즈베리파이에서 캡처한 것이나 모양만 보고 따라가는 게 좋을 것이다.

상단 산딸기 아이콘 클릭 - Help 아래 기본 설정 탭 클릭  - Raspberry Pi Configuration 클릭 후 

System tab 이동, Change Password.. 클릭

 

 

변경할 비밀번호를 모두 입력해주고, OK를 클릭한다.

 

 

6-2. 초기 설정 (패키지 저장소 경로 변경)

기본적으로 외국으로 저장소가 잡혀있어 업데이트 설치 시 시간이 오래 걸린다. 

https://www.raspbian.org/RaspbianMirrors/

 

RaspbianMirrors - Raspbian

Raspbian Mirrors Raspbian Repository Mirrors CONTINENT COUNTRY MIRROR DEB/DEB-SRC ADDRESS ISSUES Europe United Kingdom University of Oxford http://mirror.ox.ac.uk/sites/archive.raspbian.org/archive/raspbian Europe* United Kingdom Mythic Beasts (http|rsync)

www.raspbian.org

이 사이트에 접속한다. 

 

이 부분이 우리나라에 있는 라즈비안의 미러 저장소 목록이다.

작업 표시줄의 이 아이콘을 눌러

터미널 창을 실행하고, 화면에 sudo nano /etc/apt/sources.list 를 입력한다. 커서로 이동하고,

다음의 내용을 입력한다. 

 

2021 10월자에 나온  bullseye의 경우 다음의 두 줄을 추가한다.

deb http://ftp.kaist.ac.kr/raspbian/raspbian/ bullseye main contrib non-free rpi
deb-src http://ftp.kaist.ac.kr/raspbian/raspbian/ bullseye main contrib non-free rpi

 

2021 06월자의 buster의 경우 다음의 두 줄을 추가한다.

deb http://ftp.kaist.ac.kr/raspbian/raspbian/ buster main contrib non-free rpi
deb-src http://ftp.kaist.ac.kr/raspbian/raspbian/ buster main contrib non-free rpi

Ctrl + o를 눌러 저장하고, y를 입력해 저장한다. Ctrl+x를 눌러 빠져나온다.

 

 

6-3. 초기 설정 (시간대 설정)

 

 

아까 실행했던 Raspberry Pi Configuration로 들어가 Localisation Tab의 Set Timezone를 클릭하고, 

Area를 Asia로, Location을 Seoul로 잡아준 뒤 확인을 누른다. 시간대가 정상적으로 바뀐 후 다음 단계를 진행한다.

 

6-4. 초기 설정 (업데이트 및 한글 설정)

터미널 창을 실행한다. sudo apt-get update를 입력해 캐시를 업데이트 해 준 후, 

sudo apt-get upgrade -y를 입력해 업데이트를 진행한다.

bullseye 버전의 경우 vlc 오류가 발생하며 업데이트가 안 되는 경우도 있는데, 

그런 경우 sudo apt remove vlc -y를 입력해 vlc를 삭제하고,

sudo apt-get autoremove를 진행해 사용하지 않는 패키지를 같이 지워준다.

그런 후 sudo apt-get upgrade -y를 다시 시도한다.

 

 

업데이트가 끝나면 sudo apt-get install fonts-unfonts-core -y를 사용해서 한글 폰트를 설치해준다.

 

설치가 완료되면 Language를 ko(Korean), Character Set을 UTF-8로 변경하고, OK를 클릭한다.

한번 재부팅을 해 주면 언어가 한글로 바뀐 것을 확인할 수 있다.

 

7. 한글 키보드 설치

터미널 창에 sudo apt-get install ibus ibus-hangul -y 를 입력하고, 설치가 완료되길 기다린다.

 

Yes를 클릭해 실행해준다. 

 

"..."을 클릭한 뒤, Shift를 체크해주고 추가 & 적용을 눌러주고 확인을 클릭해 나온다. 

재부팅 후  좌측 Shift + Space 키 조합으로 한영 전환이 되는 걸 확인하고, 사용하면 된다.

 

*한글 입력이 안 되는 경우

sudo apt-get remove ibus ibus-hangul , sudo apt autoremove 를 순서대로 완료해준 뒤

sudo apt-get install fcitx-hangul을 입력해 fcitx 입력기를 설치한다.

 

sudo nano /etc/default/im-config 를 입력해 시작 시 자동 실행이 될 수 있도록 

사진과 같이 수정해준다. (기본값은 auto로 되어있음)

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;

시스템 도구 탭에 있는 Fcitx를 실행해 주고 ,

작업 표시줄에 보이는 키보드 아이콘을 우클릭 해서 설정을 클릭한다.

 

 

input Method 항목을 아래 사진과 같이 설정해준 후 창을 닫는다.

 

 

 

1차 프로젝트를 하면서 유용하게 사용한 타이머인터럽트(MsTimer2) 라이브러리에 대한 이야기이다.

아두이노를 활용한 실습을 할때 함수가 많아지는 경우가 있다.

동작이 의도한 대로 안 되거나 정확도를 높히고 싶을 때(센서로부터 받는 값을 특정 주기로 계속 측정하고 싶을 때)

인터럽트를 통해 이러한 걸 구현 할 수 있다. 또는 어딘가로 보내는 통신을 loop문에서 계속 호출한다던가.

 

인터럽트 

쉽게 생각하면, 끼어들기라고 생각하면 좋다. void loop 문 내 기본 메인 동작을 수행하는 도중에 어떤 돌출된 상황이 발생하면(즉, 이벤트) 메인 동작에 영향을 안주는 선에서 끼어들어서 그 상황에 관련된 특정 동작을 수행하고 

다시 되돌아가는 것을 의미한다.

 

아두이노에선 핀에 대한 인터럽트를 다음과 같은 방식으로 사용할 수 있다. (우노 기준 2,3번핀)

attachInterrupt(digitalPinToInterrupt(interruptPin), exchange, FALLING);

attachInterrupt(인터럽트핀, 호출함수, 상태)로 해서 setup()함수에 선언하여 사용한다.

LOW     :   LOW 상태일 때
CHANGE  :  입력 값이 변할때
RISING  :  LOW -> HIGH로 변할때
FALLING :  HIGH -> LOW로 변할때

 

하지만 나의 경우는 측정함수를 설정한 주기 동안 반복하게끔 하고 싶었기 때문에, MsTimer2 라이브러리를 사용했다.

 

설치 방법

Arduino IDE의 라이브러리 매니저에서 MsTimer2를 검색하거나,

https://github.com/PaulStoffregen/MsTimer2 에서 아래와 같은 방법으로 다운로드 받을 수 있다.

 

하지만 프로젝트에서는 아두이노 메가보드(Mega 2560/ADK)를 주력으로 사용하기에

http://www.hellmaker.kr/post/302 이 글을 참고하여 MsTimer2.cpp 파일을 수정하여 사용했다.

 

 

사용 방법

파일의 최 상단에 #include <MsTimer2.h>를 추가해주고, setup 문 안에 다음과 같이 정의한다.

void setup() {
....
  MsTimer2::set(ms, func); 
  MsTimer2::start();
....
  }

 

MsTimer2::stop를 만나기 전 까지 MsTimer2::set에 설정된 ms (1000ms = 1sec)주기로, func를 계속 실행하게 된다.

func 파라미터의 경우 반환형식이 없는 void 형의 함수만 호출이 가능하다. (그게 안 돼서 어리둥절했다는..)

최대 49일까지 설정이 가능하다.

 

 

 

delay를 사용한 blink 예제 vs 타이머 인터럽트를 사용한 blink 예제

void setup(){
	
	pinMode(13,OUTPUT);
	
}
void loop(){
	//문장 1
	digitalWrite(13,!digitalRead(13));
	delay(500);
	//문장 2
}

loop 문 내에 작성하면 동작이 끝난 후에 다음 문장을 실행하기 때문에 여러가지 동작을 loop 문 내에 작성하려는 경우 

delay를 활용하면 안 된다. 

 

#include <MsTimer2.h>

void setup(){
	pinMode(13,OUTPUT);
	MsTimer2::set(500,ledBlink);
	MsTimer2::start();
}

void loop(){
	//문장 1
	//문장 2
}

void ledBlink{
	digitalWrite(13,!digitalRead(13);
	state = !state; 
}

 

타이머인터럽트의 경우 loop문 보다 우선순위가 높아 500ms 간격으로 LED를 제어 할 수 있다.

void Setup 문 안에 위와 같이 선언을 해주고, 다음과 같은 측정함수를 불러오게끔 했다.

 

 

일정

 

2021.10.11~2021.10.16

아이디어 브래인스토밍 및 멘토링 기획서 작성, 아이디어 선정, 필요 부품 주문

 

2021.10.18~2021.10.25

요구사항 정의서, DB 설계, 기획서 작성 및 DB 설계 확정

 

2021.10.26~2021.10.30

GitHub 사용법 학습 및 레퍼지토리 생성, 칸반보드 작성 시작.

아두이노 - 웹서버 간 통신 테스트. 기초 감지 로직 작성.

각 기능을 위한 DAO / VO 설계 및 SQL 쿼리문 작성, 테스트

웹페이지 레이아웃, 페이지 배치 및 배경화면 변경, 

 

2021.11.01~2021.11.04

일산화탄소 농도에 따른 기기 동작 코드 작성

발표 자료 제작 및 최종 검수

시제품 제작 및 동작영상 촬영, 질의응답 대비

담당 Part

데이터베이스 설계 및 시퀸스 생성.

GetSensor 서블릿 작성 및 DAO 설계

SQL 쿼리문 작성 및 테스트

아두이노 센서, 네트워크 통신테스트, 주 로직 설계, 시제품 제작.

기타 프로젝트간 팀원들 파트 막히는 부분 AS 및 조율 - DB, SQL, 서블릿, 아두이노

 

1주차(2021.10.11~2021.10.16) 진행 과정

0. 아이디어 도출 (브래인스토밍 진행) & 아이디어 멘토링

내부에서 아이디어를 선정해서 멘토링을 받기 보단 다 모아서 가자는 생각으로 아이디어를 모아 다음과 같이 작성했다.

브래인스토밍 과정

브래인스토밍으로 도출한 아이디어를 가지고 멘토링을 받았다.

내가 제안했던 유해가스 감지기 및 경보기만 살아남아 보충할 점에 대해 의견을 들었다. 

알림까진 좋으나 신고 기능에 대해 보강할 점이 필요해 해당 부분은 진행하면서 생각하기로 의견을 종합했다.

 

1.부품 주문

아이디어에 필요한 부품들을 주문하는 절차를 가졌다. 장바구니에서 바로 엑셀을 뽑을 수 있다는 장점, 

대학교때 잘 썼던 디바이스마트에서 주문을 했으나...그게 나중에 대참사가 될 줄은 몰랐다.

부품 선정 및 주문서 작성.

 

2주차(2021.10.18~2021.10.25) 진행 과정

1. 데이터베이스 테이블 명세서, 테이블 정의서 작성

여기서 생각보다 시간이 많이 걸렸다. 나머지 문서야 팀원들이 분담해서 작성하고, 내가 봐주면서 보강해주면 되는 것이라 어렵진 않았지만...몇번을 갈아 엎은지를 모르겠다. 멘토링 받으며 해결.

 

데이터베이스 요구사항 정의서
관리자 회원정보 테이블

 

3주차 (2021.10.26~2021.10.30) 진행 과정

0. 아두이노 네트워크 통신 테스트

값이 넘어올 JSP 파일을 만들어 통신 테스트를 진행.

아두이노 코드를 작성했다.

ESP8266 모듈과 메가보드를 사용하기에 소프트웨어시리얼을 사용하지 않았다.

아두이노 코드 링크 >> https://github.com/SkyBlaze96/Toyproject/blob/main/MQ_9_WebServerChange.ino

정상적으로 넘어가는 것을 확인한 뒤 서블릿 설계에 들어갔다.

 

1. GetSensor & DAO 메서드 생성

파일명 확장자를 안 붙힌 체 서블릿 파일명을 지정하면 바로 프로젝트 내의 자바 리소스에 접근할 수 있게 된다.

DAO는 미리 생성해놨기에 GetSensor 서블릿을 만들고, DAO로 넘어가 메서드를 만들었다.

GetSensor 서블릿

 

DAO 내 InsertSensor 메서드

아두이노에 RTC 모듈을 달지 않아 일단 시간은 네트워크에 전송이 되었을 때 그 때 서버 시간을 넣어줄 수 있도록 

SimpleDateFormat를 사용했다. 

그리고 쿼리문이 진짜 긴데...목적을 설명하면 다음과 같다.

 통합 정보 테이블의 모든 컬럼에

 1) 관리 번호는 자동 부여 (시퀸스)

 2) 관리자 번호는 사용자 정보 테이블에 들어있는 기기 아이디와 입력받은 기기 아이디와 일치하는 관리자 번호

 3) 사용자 번호는 사용자 정보 테이블에 들어있는 기기 아이디와 입력받은 기기 아이디와 일치하는 사용자 번호

 4) 입력받은 기기 아이디 

 5) 입력받은 가스 농도

 6) SimpleDateFormat의 시간정보

이런 걸 넣고자 하는 쿼리문이다.

 

3. 기초 로직 설계 및 동작설계

설정한 평균농도에 따라 가스벨브를 잠그고 (솔레노이드벨브) 환풍기를 동작시키며 경고 알람을 동작시키고, 

해당 상황이 되었을 때 외부 웹서버로 이를 전송하도록 큰 틀을 잡았다.

 

단순히 아두이노 코드 내의 void loop() 내에 작성하면 무조건 보내기만 하니 

조건문을 걸어 평균농도가 일정 수치가 넘고, 60회(테스트 편의를 위해 10회로 조정함)할 때만 

값을 보내도록 하고, 카운트 변수를 초기화하도록 설정했다.

값이 정상화되면 모든 외부 릴레이, 부저 동작을 멈추게끔 하고 싶어 조건문 내에 중지하는 함수를 호출하게 했더니

멈추거나 아니면 값이 안 넘어가는 경우가 생겼다.

 

그냥 외부 릴레이 함수를 평균 계산하고 타이머 누적하는 함수에서 호출하도록 변경했다.

 

4. Github 칸반보드 작성

지금이야 모두 마무리되서 Done에 가 있지만

크게 해야 할 일을 To Do에 작성, 그날 그날 진행중인걸 In progress에 넣는 식으로 작성을 했다.

 

3주차 (2021.11.01~2021.11.04) 진행 과정

 

0. 프로토타입 조립 및 시연 영상 촬영

포맥스 3T로 외형을 만들고, 글루건과 록타이드 본드를 사용했다. 

배선의 문제인지 역전류의 문제, 전류량 문제인지는 모르겠으나 아두이노와 솔레노이드 벨브를 12V 어댑터 전원을

사용하도록 연결하니 릴레이가 동작하는 시점(즉, 솔레노이드 벨브에 전원이 인가되는 순간)에 보드가 리부팅 되는

문제가 있었다.

일단 동작 영상은 찍어야 하니 여분의 릴레이로 교체하고, 아두이노 전원인가는 USB 포트로 하도록 했다.

1.아두이노 내부 로직 완성

영상 촬영 및 테스트를 위해 수치를 낮게 설정했었는데 (평균농도 20ppm, 카운트 5회)

수치를 현실적인 경고기준으로 변경했다. (250ppm 이상이 3분 정도 지속되면)

2. 최종 발표 준비 및 문서 작업

시스템 동작 흐름도를 작성하고, 발표를 맡은 팀원과, 발표자료 제작 팀원 간 계속 확인해가며 발표준비를 진행했다.

insert into TBL1 (col1,col2,col3,col3)

values (col1, (select col2 from tbl2),col3.col4)

 

이때 select 절의 반환 결과는 단일 행 쿼리여야 한다. 

괄호 내의 쿼리 결과는 몇 개를 반환하던 하나로 인식해서 만일

아ㅋㅋ col2, col3 이렇게 하면 같이 들어가겠지 라고 생각해서

select col2,col3 from tbl2 이래버리면 not enough values 오류가 발생한다...!

 

select col2,col3 from tbl2 (x)

(select col2 from tbl2),(select col3 from tbl2) (o)

 

 

 

'학원 수업 관련 > DB' 카테고리의 다른 글

SQLD 자격증 취득하기!  (0) 2022.01.29

Rrufus 구버전 (1.4.9) 다운로드

 

부팅 디스크 만들기 탭에서 MS-DOS 선택

 

도중에 오류날텐데 그때 그냥 Rrufus 끄고 (쉽게 말하면 얘로 일단 파티셔닝 및 포맷, 활성화만 시켜주는 것.)

 

https://www.allbootdisks.com/download/iso.html

 

AllBootDisks ISO Image Downloads | AllBootDisks - Providing Free Boot Disk Downloads. MS-DOS to Windows XP.

These are the ISO boot disk images available from AllBootDisks. Download the ISO image you need, and if you need assistance creating a bootable CD from this image, visit the how-to page. You have no Javascript! You must use a Javascript enabled browser.

www.allbootdisks.com

사이트 접속후 win98se_bootdisk.iso 다운로드

 

다운받은 iso 파일 더블클릭해 마운트하기 또는 반디집으로 열어 내부 파일을 

 

아까 포맷했던 USB 메모리에 복사. 그리고 목적에 맞는 파일들 추가 복사

 

(바이오스라던지 디스크검사라던지 펌웨어 업그레이드 라던지 등등)

 

그리고 부팅하려는 PC에 메모리 연결하고 바이오스 설정에서 USB 메모리를 부팅순서 최상단으로 올려주기.

 

부팅해서 작업하면 끝.

+ Recent posts