산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino 및 Bluetooth가 탑재된 스마트 커피 머신

구성품 및 소모품

Arduino Nano R3
× 1
HC-05 블루투스 모듈
× 1
HARDWARIO DS18B20 온도 센서 1m
× 1

앱 및 온라인 서비스

Kai Morich가 만든 직렬 블루투스 단말기
Arduino IDE

이 프로젝트 정보

소개

그래프가 포함된 스마트 자동 커피 메이커는 블루투스를 통해 제어할 수 있습니다... 또는 신선한 물을 공급하기만 하면 시스템이 자동으로 시작됩니다!

부품 하나하나가 수작업이고 모든 기능은 제 아이디어입니다.

"Test Mode"도 코딩하여 컨트롤러를 외부 온도 센서와 함께 다목적 온도 측정기로 사용할 수 있습니다.

Arduino에서 개발됨 Nano / Uno, ST7920 디스플레이 사용 , HC-05 블루투스 어댑터, Dallas DS18B20 온도 센서 , 히터 코일을 제어하는 ​​릴레이, LED가 있는 버튼, 부저 및 CD4017BE 디케이드 카운터가 LED 바를 구동합니다.

시작하는 방법

<울>
  • 자동 시작 :대기 모드에서 시스템은 주기적으로 배경 온도를 측정합니다. 담수를 로드하면 온도가 떨어집니다. , 시스템이 시작됩니다.
    이 기능은 스마트폰에서 "자동"을 전송하여 활성화/비활성화할 수 있으며 설정은 EEPROM 메모리에 저장됩니다.
  • 버튼 누르기 :커피 만들기를 시작/중단하거나 테스트 모드를 종료합니다.
  • "시작" 메시지 보내기 스마트폰에서 또는 "중지 ".
  • 동영상

    모든 작업 방식을 보여줍니다.

    어떻게 만들어졌는지, 어떻게 생겼는지... 아래를 클릭/탭하세요!

    커피를 만드는 동안 한 번 분석

    시작 후 60초 후 MCU는 저장된 초기 온도 값과 현재 온도 값을 비교하여 온도와 경과 시간만 기준으로 결론을 도출합니다. 이 값은 다음과 같습니다.

    <울>
  • "물을 잊어버렸습니다. " - (온도가 너무 높음)
  • "2인용 커피 " - (더 적은 물 - 더 높은 온도 상승)
  • "6인용 커피 " - (더 많은 물 - 낮은 온도 상승)
  • "히팅 코일 오류! " - (중요한 온도 상승 없음)
  • 또한 센서 오류 감지 커피 머신이 켜져 있는 동안 계속 작동합니다.

    보시는 바와 같이 6회분의 물은 소량의 물이 훨씬 더 빨리 도달한 동일한 온도에 도달하는 데 더 많은 시간이 필요했습니다.

    물 없이 시작하면 매우 높은 온도가 발생하지만 평평한 선은 온도가 변하지 않음을 나타내므로 히터 코일 오류입니다.

    측정 단위 변경

    "c를 전송하여 측정 단위를 변경할 수 있습니다. " 또는 "f " 커피를 만드는 과정에서도 스마트폰에서 "그래프에 흔적이 남지 않습니다. .

    저장된 초기 및 이전 온도 값이 변환됩니다 내가 코딩한 프로그램 함수 호출에 의해 - 통계 및 분석에 사용됩니다. 이 설정은 EEPROM 메모리에도 저장됩니다.

    동적 화면 요소

    화면이 가득 차면 그래프가 왼쪽으로 회전하기 시작합니다.

    측정된 값에 따라 일부 화면 요소가 방해가 될 수 있습니다. 충돌을 피하기 위해 위치는 동적입니다.

    이 6개의 작은애니메이션 이미지 내가 코딩한 것을 보여줍니다:

    음, 즐거운 시간이었습니다:

    테스트 모드

    이 모든 것을 만들 때 아이디어가 떠올랐습니다. 그래프를 다른 용도로 사용하지 않겠습니까?

    그래서 테스트 모드를 코딩했습니다. 외부 온도 센서를 부착하기만 하면 그래프가 있는 다목적 온도계로 사용할 수 있습니다.

    이 작업 방식에서 그래프의 극한 값은 -20°C(-4°F)입니다. 및 +128°C(+262°F) .

    1 사이에 스마트폰에서 번호 보내기 및 999999 초 단위의 측정 간격으로 허용되므로 그래프의 너비는 128초 사이입니다. 및 11.57일 .

    블루투스 통신

    명령을 수락하고 보고서를 전송하고 스마트폰 연결 또는 연결 해제 여부를 감지합니다.

    보낸 메시지는 파란색이고 응답/보고 메시지는 커피 메이커에서 보낸 녹색입니다.

    주도 제어

    CD4027BE 디케이드 카운터는 LED 막대를 구동하고 모든 온도 측정에서 MCU로부터 CLK를 수신하고 위치를 증가시킵니다. 새로운 커피 만들기 절차나 테스트 모드가 시작되면 Atmega 328P는 기본 위치를 설정하기 위해 RST 신호를 보냅니다.

    버튼에는 핀이 2개뿐인 2색 LED가 있으므로 코드에서 간단하고 재미있는 솔루션을 제어하는 ​​방법을 볼 수 있습니다.

    <울>
  • 단색 녹색 :대기 또는 커피 준비, 코일 꺼짐
  • 단색 빨간색 :커피를 내리는 중, 히터 코일이 켜져 있습니다.
  • 빨간색/녹색 차례 :테스트 모드
  • 빨간색 깜박임 :오류가 발생했습니다.
    -센서 오류,
    -히터 코일 오류 또는
    -물을 잊어버려서 시스템에서 커피 만드는 과정이 중단되었습니다.
  • <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 스마트 커피 메이커 - Ősi Gyula
  • 스마트 커피 메이커 - Ősi GyulaArduino
    // 프로그램 코드 - 스마트 커피 메이커. Arduino Nano에서 개발되었으며 ST7920 디스플레이, HC-05 Bluetooth 어댑터,// Dallas DS18B20 온도 센서, 릴레이, 버튼, LED, 부저 및 CD4017BE 10진수 카운터를 사용합니다.// // 명령 및 작업 매개변수를 전송하여 Bluetooth를 통해 제어할 수 있습니다. 또는 버튼을 사용하여... 또는 그냥 담수를 로드하십시오!//// Functions:// -그래프:화면에 동적 온도 그래프// -자동 시작:담수를 로드하면 온도가 떨어지고 시스템이 시작됩니다// 기능은 "Auto"를 전송하여 활성화/비활성화할 수 있으며 설정은 EEPROM 메모리에 저장됩니다.// -커피를 만드는 동안 분석:시스템 시작 후 60초 후 현재와 초기 온도 값을 비교하고// 다음과 같은 결론을 내립니다. be:// 1. 물을 잊어버렸습니다(온도가 너무 높음)// 2. 커피 2인분(물이 적음 - 온도 상승이 높음)// 3. 6인용 커피(물을 더 많이 - 온도 상승이 낮음)// 4. 히팅 코일 오류(시작부터 온도 상승이 심하지 않음)// -센서 오류 감지(비정상 값 가져오기)// -C elsius 또는 Fahrenheit working:커피를 만드는 과정에서도 스마트폰에서 C의 F를 전송하여 전환할 수 있습니다. // 초기 및 이전 온도 값은 통계 및 분석에 사용됩니다.// 이 설정은 EEPROM 메모리에 저장됩니다. .// -테스트 모드:외부 온도 센서를 부착하면 시스템을 다목적 온도 측정기로 사용할 수 있습니다.// 이 모드에서 그래프 간격은 -20C / -4F와 +128C / +262F 사이입니다.// 숫자 값 보내기 1에서 999999 사이는 초 단위의 측정 간격으로 허용되므로 // 그래프 너비는 128초에서 11.57일 사이가 될 수 있습니다.// -Bluetooth 통신:명령 수락 및 보고서 전송, 스마트폰 연결 또는 연결 해제 여부 감지// - LED 바 제어:MCU는 CD4027BE 10년 카운터를 제어하고 LED 바는 모든 온도 측정 주기//-------------------------- -------------------------------------------------- -------------------------------------------------- ---// // 설계, 구축 t 및 프로그래밍 // Gyula Osi에 의해 //// 판권 소유.// ---- Display #include "U8glib.h"//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // OLED 디스플레이 I2C 버스, SDA(TX) A4, SCL(RX) A5U8GLIB_ST7920_128X64 u8g(11, 10, 9, U8G_PIN_NONE); // 표시 생성자 PIN6-D11, PIN5-D10, PIN4-D9byte 프레임 =0; // 시작 로고 포인터 // ---- Ports &Controlled Peripherals// A0에서 빨간색 led // A1에서 grn led const int bright[2] ={0, 500};const byte 버저 =3;const byte cd4017beCLK =4; // 제어 CD4017BE 디케이드 카운터 const byte cd4017beRST =5;const byte btn =13;const byte relay =12;// ---- System Strings#define strSize 3String str[strSize]; // 시스템 이벤트 및 보고서 printout#define reportSize 5const String reportStr[reportSize] ={"Starting...", "Going standby 곧...", "Stopped.", " *** TEST MODE ***", "일반 모드입니다."};//#define standbySize 5//const String standbyStr[standbySize] ={"Press key", ">", "or", "send", "start"};const String autostartStr[2 ] ={"Autostart off.", "Autostart on."};// ---- 시스템 상태 이진 플래그 배열의 구조 #define flagElements 6bool binFlags[flagElements] ={0, 1, 1, 0, 0, 0 }; // ---- 요소 [i] 목적 초기화/대기 모드 val // 0 확인 0 // 1 완료 1 // 2 대기 1 // 3 대기 메시지 전송 0 // 4 코일/센서 오류 0 // 5 테스트 mode 0// ---- 온도 측정 및 관련 기능#include "OneWire.h" #include "DallasTemperature.h#define DS18B20 2 // D2OneWire에 OneWire 버스 설정 temprWire(DS18B20); // OneWire 버스에서 작동하도록 DS18B20을 설정합니다.DallasTemperature sensor(&temprWire);float tempr; // 측정값 float temprInit; // 1회 측정값의 사본 비교float temprPrev; // 순환 비교를 위한 측정값 복사#define mUnit 2float temprBottomLim[mUnit] ={ 0, 26}; // AND의 tempr에서 자동 시작 tempr ofconst char unit[mUnit] ={'F', 'C'};const String unitStr[mUnit] ={"Fahrenheit mode.", "Celsius mode."};float trendSens[mUnit] ={ 0, 0.1}; // 일정한 온도로 평가되는 +/- 범위(F/C) // *** 화씨 기준 값은 시작 시 계산됩니다!bool trend[2] ={1, 0}; // 다음과 같이 온도 추세를 설명합니다. // ---- 요소 [i] 목적 // 0 변경 // 1 추세 #define checkSize 7const String checkStr[checkSize] ={"물이 감지되었습니다!", "히팅 코일 오류!", "6인분 커피", "2인분 커피", "물을 잊어버렸습니다!", "센서 오류!", "커피가 준비되었습니다."};float temprCheck[mUnit][checkSize] ={{ }, {- 0.15, 5, 17, 28, 60, -127, 110}}; // |<-- REL -->|<--CONST-->| // [j] F / C // ---------------------------------------- ----- // ---- 요소 [i] 용도 // 0 autostart rel 값 // 1 코일 오류 감지 rel 값 // 2 water for 6 rel 값 // 3 water for 2 rel 값 // 4 물 감지 없음 상대 값 // 5 D2 const 참조에 신호 없음 // 6 비등점 const 참조// ---- 그래프 선언 및 변수#define posYsize 128byte posY[posYsize];byte 포인터 =0;#define refrElements 42float temprRefr[refrElements];#define rangeElements 2 // 최소 / 최대#define 모드 2 // 일반 / 테스트 모드float graphRange[mUnit][mode][rangeElements] ={{{ }, { }}, {{24, 127.938889 + 2}, {-20, 그래프 범위[1][0][1]}}}; // [k] 0 1 0 1 // [j] | 0 | 1 // ---- 요소 [i] | | | | // 0 minFnorm maxFnorm minFtest maxFtest // 1 minCnorm maxCnorm minCtest maxCtestfloat graphDiff[mUnit][mode]; // 온도에 따른 수직 단계// ---- 시스템 타이머, 제어 및 분석#include  elapsedMillis timer0; // 8비트, PWM 타이머, elapsedMillis() 함수에서 사용됨 unsigned long tmrPrev =0; // 간격이 upbool일 때 경과된 시간은 이전이 됩니다. cyclic =0;const long tmrInt[5] ={500, 2000, 60000, 640000, 800000}; // ---- 요소 [i] 목적 // 0 측정 간격(테스트 모드), led ctrl // 1 측정 간격(일반 모드) // 2 일회성 분석(일반 모드, 커피 만드는 동안) / 순환 분석( 대기 모드) // 3 대기 메시지 전송(일반 모드, 커피 추출 후) // 4 시스템 대기(일반 모드, 커피 추출 후)long copyof_tmrInt0 =tmrInt[0]; const String tmrInt0Str ="간격이 변경되었습니다."; // ---- 시리얼 통신 설정 const byte btState =6;bool conn =0;const String connStr[2] ={"연결이 끊어졌습니다.", "스마트폰이 연결되었습니다."};#include  const int RX1 =7; const int TX1 =8; 소프트웨어 직렬 sUART(RX1,TX1); #define exRXSize 6char exRX[exRXSize]; // 시리얼 포트로부터 데이터를 받을 변수 // ---- 메모리 관리#include #define occBytes 2const byte addr[occBytes] ={ 0, 1};bool sysSettings[occBytes]; // ---- 메모리 맵 addr[i] | 데이터 | 설명 | 저장된 val // ---------------------------------------------- ------- // 0 | 부울 | 자동 시작 | 0:자동 시작 없음, 1:자동 시작 // 1 | 부울 | 측정 단위 | 0:화씨, 1:섭씨// ---- Terminators &The Cleanup Crewconst char termCharSpc =' ';const String termStr;const byte termByte =0;const bool termBool =0;const uint8_t frame0[] U8G_PROGMEM ={ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0x7F, 0 0xFF, 0x07, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFC, 0xFF, 0x7F, 0xF0, FF, 0x8F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0, 0xFF, 0xFF, 0x8F, 0xFF, 0xFF, 0xFF , 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x0x , 0x00, 0x18, 0xC0, 0x8F, 0xFF, 0x1F, 0x7F, 0x8C, 0x3F, 0x1E, 0xFF, 0x00, 0xF, 0xF, 0xF, 0x1F, 0xFF, 0xF1, 0x , 0x1E, 0xFF, 0xFF, 0xF8, 0x1F, 0xFF, 0x31, 0xFE, 0x7F, 0xFC, 0x8F, 0xFF, 0x1F, 0x1F, 0x0C, 0x3E, 0x0C, 0 , 0xFC, 0x0F, 0x0E, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0xFC, 0x00, x , , 0 , 0 , 0 , 0 , 8 , 0 , 0 7C, 0 30, 0 0 , 0 x 7 , 0 , 0 × 00, 0xF8, 0x1f이, 0x7C, 0x30에, 0xFE로, 0x7F의,의 0xF0, 0x0F의, 0xFE로, 0x18, 0x1f이, 0x0C, 0x3E,에 0x1E, 0x3C, 0x3E, 0xF8, 0x1f이, 0x7C,의 0xF0, 0x00으로, 0x7E가,의 0xF0, 0x0F의 , 0xFE로, 0x18, 0x1f이, 0x0C, 0x3E,에 0x1E, 0x3C, 0x3E, 0xF8, 0x1f이, 0x7C,의 0xF0, 0x00으로, 0x7E가,의 0xF0, 0x0F의, 0xFE로, 0x18, 0x1f이, 0x0C, 0x3E,에 0x1E, 0x3C, 0x3E, 0xF8 , 0x1F, 0x7C, 0xF0, 0x3F, 0x78, 0xF0, 0x0F, 0xFE, 0x18, 0x1F, 0x0C, 0x3E, 0x1E, 0x3C, 0x3E, 0xF8, 0x1f이, 0x7C,의 0xF0, 0x3F입니다,은 0x78, 0xF0입니다, 0x0F의, 0xFE로, 0x18, 0x1f이, 0x0C, 0x3E,에 0x1E, 0x3C, 0x3E, 0xF8, 0x1f이, 0x7C,의 0xF0, 0x3F입니다,은 0x78, 0xF0입니다, 0x0F의, 0xFE로, 0x18, 0x1f이, 0x0C, 0x3E,에 0x1E, 0x3C, 0x3E, 0xF8, 0x1f이, 0x7C,의 0xF0, 0x3F입니다,은 0x78, 0xF0입니다, 0x3F입니다, 0 × 00, 0x7E가, 0 × 00, 0x3C, 0x80으로, 0x07 인,의 0xF0, 0x00으로, 0xF8, 0x7F, 0x00, 0x3C, 0x00, 0x1E, 0xC0, 0x3F, 0x00, 0x7E, 0x00, 0x3C, 0x00, 0x3C, 0x80, 0x07, 0xF0, 0x00, 0x700x 0x1F, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFC, 0xFF, FF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x FF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, FF, 0xFF, 0xFF, 0xFF, 0,FF, 0xFF, 0xFF 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0,0x0,0xFF, 0xFF, 0x00, 0x00, 00x00 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 , 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00이 , 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00이 , 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00이 , 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0x7E가,이 0x06, 0xE6, 0x3F입니다 , 0x06 일,에는 0xC6, 0x7F의, 내지 0xFE, 0xE7, 0x3F입니다, 0x7E가, 0xFE로,에는 0xC7, 0x7F의, 0 × 00, 0 × 00, 0x30에,이 0x06, 0x66, 0x60으로,이 0x06, 0x66, 0x00으로,는 0x60, 0x60으로,는 0x60, 0x30에,이 0x06, 0x60으로는 , 0 × 00, 0 × 00, 0 × 00, 0x30에,이 0x06, 0x66, 0x60으로,이 0x06, 0x66, 0x00으로,는 0x60, 0x60으로,는 0x60, 0x30에,이 0x06, 0x60으로, 0 × 00, 0 × 00, 0 × 00, 0x30의,에 0x1E, 0x66, 0x60으로,이 0x06, 0x66은 , 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x30, 0x3E, 0x66, 0x60, 0 x06, 0x66, 0x00, 0x60, 0x60, 0x60, 0x30, 0x06, 0x60, 0x00, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x3C 0x3F, 0x00, 0x00, 0x3C, 0x7E, 0xE6, 0x61, 0x1E, 0xC7, 0x3F, 0x70, 0xE0, 0x3F, 0x3C, 0xFE, 0x3C, 0x 0x70, 0x70, 0xE0, 0x1D, 0x3C,에 0x1E, 0x00으로, 0x70, 0x00으로, 0 × 00, 0x3C,에 0x1E, 0xE7,이 0x61,에 0x1E, 0x07 값, 0x70, 0x70, 0xE0, 0x31로 회신, 0x3C,에 0x1E, 0x00으로, 0x70, 0x00으로, × 00, 0x3C,에 0x1E, 0xE6,이 0x61,에 0x1E, 0x07 값, 0x70, 0x70, 0xE0,이 0x61, 0x3C,에 0x1E, 0x00으로, 0x70, 0x00으로, 0 × 00, 0x3C,에 0x1E, 0xE6,이 0x61,에 0x1E, 0x07 값, 0x70, 0x70, 0xE0, 0x61, 0x3C, 0x1E, 0x00, 0x70, 0x00, 0x00, 0x7F, 0x1E, 0xE6, 0x3F, 0xE6, 0x3F, 0xFC, 0xE3, 0x3F, 0x10, 0x × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0, 0x0, 0x0, 0x00, 0x00, 0x00, 0x0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0 × 00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xt0, 0x00, 0x00, 0x00, 0x000, 0x00, 0x000, ={0xF8, 0x21 // 11111000 00, // 01 00,100,001 0x22, // 02 00,100,010 값 0x24, 0x08에서 03 // 00100100, 00001000 // 04은 0x10, // 05 00010000 값 0x24, 0x44 // 00100100 06, // 07 01,000,100 // 0x0F, // 00001111 08 0x04, // 00000100 09 0x04, // 00000100 10 0x03, // 00000011 0 , 0 , 1 0 11}; const uint8_t 0 // 0 11}; PROGMEM ={0 00111110 02 0x7F, // 01111111 03}; const uint8_t frame3[] PROGMEM ={ 0x7F, // 01111111 00 0x3E, // 0,0 0x3E, // 00111110 01 0x1C, //0 설정 .시작하다(); 채우기 배열(); 핀모드(cd4017beCLK, 출력); 핀모드(cd4017beRST, 출력); CD4017BE(0); // RESET을 10년 카운터 IC로 보냅니다. pinMode(btState, INPUT); 핀모드(btn, 입력); 핀모드(릴레이, 출력); sUART.begin(9600); 메모(2); // EEPROM에서 시스템 설정을 로드합니다. sensor.begin(); // DS18B20 시작 temprMeas(); 임시 초기화 =임시; 그래프(2); // 그래프 초기화 ledHandler(0);}void loop() { sysControl(); 체크Btn(); 체크콘(); RX(); u8g.firstPage(); { 무승부(); } 동안(u8g.nextPage()); if (프레임 ==0) { 지연(3000); 프레임 =1; scrClr(); }} // ---- 메모리 관리 // 매개변수 호출 // 2:시작 시 읽기 // 0, 1:적절한 주소에 쓰기 //void memo(byte op) { switch(op) { case 2:for (바이트 i =0, i  tmrInt[2]) &&(!binFlags[5])) { if (binFlags[2]) { temprMeas(); if ((tempr - temprInit <=temprCheck[sysSettings[1]][0]) &&(tempr =temprCheck[sysSettings[1]][6]) &&(!binFlags[1])) { // check boiling point coil(0); strSelector(0, 6); } if ((timer0> tmrInt[3]) &&(!binFlags[2]) &&(!binFlags[3])) { // going standby msg AND a second security check strSelector(1, 1); binFlags[3] =1; if (!binFlags[1]) { // for case if the coil went broken after the One Time Analysis coil(0); // and therefore there was no boiling point strSelector(0, 1); } } if (timer0> tmrInt[4]) { // the system goes standby binFlags[2] =1; strSelector(6, 0); } }void temprMeas() { temprPrev =tempr; sensor.requestTemperatures(); // update sensor readings if (sysSettings[1]) { tempr =sensors.getTempCByIndex(0); // read remperature } else { tempr =sensors.getTempFByIndex(0); } if (tempr>=temprPrev + trendSens[sysSettings[1]]) { trend[0] =0; trend[1] =1; } if (tempr <=temprPrev + trendSens[sysSettings[1]]) { trend[0] =0; trend[1] =0; } if ((tempr  temprPrev - trendSens[sysSettings[1]])) { trend[0] =1; }} // ---- Coil Control // 0:power off // 1:power onvoid coil(byte op) { switch (op) { case 0:digitalWrite(relay, 0); binFlags[1] =1; strSelector(1, 2); ledHandler(0); 부서지다; case 1:digitalWrite(relay, 1); strSelector(6, 0); CD4017BE(0); graph(1); for (byte i =0; i  0; i--) { str[i] =termStr; } return; } TX(); for (byte i =(strSize - 1); i> 0; i--) { // roll for printout str[i] =str[i - 1]; } buzz(4, 1); }void draw(void) { if (frame ==0) { u8g.drawXBMP( 0, 0, 128, 64, frame0); } else { if (frame ==1) { scr(); } }}void scr(void) { if (binFlags[2]) { #define standbySize 4 const String standbyStr[standbySize] ={"Press key>>>>", "or", "send", "start"}; u8g.setFont(u8g_font_courB10); u8g.setPrintPos(2, 12); u8g.print(standbyStr[0]); u8g.setPrintPos(14, 26); u8g.print(standbyStr[1]); u8g.setPrintPos(30, 40); u8g.print(standbyStr[2]); u8g.setColorIndex(!cyclic); u8g.drawBox(74, 28, 50, 14); u8g.setColorIndex(cyclic); u8g.setPrintPos(76, 40); u8g.print(standbyStr[3]); u8g.setColorIndex(1); } else { if ((posY[0]>=20) || (posY[13]>=20)) { u8g.drawBitmapP( 5, 0, 1, 12, frame1); } else { u8g.drawBitmapP( 5, 25, 1, 12, frame1); } if ((posY[54]>=30) || (posY[112]>=30)) { u8g.drawHLine(69, 40, 53); scrTempr(72, 12); } else { scrTempr(72, 44); } for (byte i =0; i  0) { u8g.drawVLine(i, posY[i], 2); } } } u8g.setFont(u8g_font_6x12); byte y =53; for (byte i =(strSize - 1); i> 0; i--) { u8g.setPrintPos(0, y); y =y + 9; u8g.print(str[i]); } }void scrTempr (byte tX, byte tY) { u8g.drawVLine(2, 4, 39); u8g.drawHLine(0, 40, 69); u8g.drawHLine(0, posY[pointer - 1], 5); byte tXrel =2; byte tYrel =11; if ((tempr <100) &&(tempr> -10)) { u8g.drawFrame(tX - tXrel, tY - tYrel, 45, 13); u8g.drawHLine(116, 40, 12); } else { u8g.drawFrame(tX - tXrel, tY - tYrel, 51, 13); u8g.drawHLine(122, 40, 6); } u8g.setFont(u8g_font_6x12); u8g.setPrintPos(tX, tY); u8g.print(tempr); u8g.print(char(176)); u8g.print(unit[sysSettings[1]]); if (trend[0]) { return; } tXrel =12; if (trend[1]) { u8g.drawBitmapP(tX - tXrel, tY - tYrel, 1, 4, frame2); } else { u8g.drawBitmapP(tX - tXrel, tY - tYrel, 1, 4, frame3); }}void scrClr(){ u8g.firstPage(); do { } while(u8g.nextPage());} // ---- Maintenance of Graph Arrays // call param // 0:step &fill // 1:clr // 2:initvoid graph(byte op) { switch (op) { case 0:if (pointer ==posYsize) { for (byte i =0; i <(posYsize - 1); i++) { posY[i] =posY[i + 1]; posY[i + 1] =termByte; } pointer =posYsize - 1; } for (byte i =0; i =temprRefr[i + 1])) { posY[pointer] =i; 반품; } } break; case 1:for (byte i =0; i  0) &&(atof(exRX)>=1) &&(atof(exRX) <=999999)) { copyof_tmrInt0 =(atof(exRX) * 1000); strSelector(5, 0); } for (byte i =0; i   

    회로도


    제조공정

    1. QR, RFID 및 온도 확인을 통한 출입 통제
    2. 온도 및 습도 데이터 로거
    3. Bluetooth가 탑재된 Arduino로 LED 제어!
    4. 스마트 신발(자동 끈 및 전기 생성)
    5. Nextion 디스플레이의 BME280 온도, 습도 및 압력
    6. Arduino 및 MPU6050으로 서보 모터 제어
    7. OK Google이 포함된 Bluetooth 음성 제어 기기
    8. U-blox LEA-6H 02 GPS 모듈(Arduino 및 Python 포함)
    9. DHT11로 Blynk에서 온도와 습도를 읽는 방법
    10. Arduino를 사용한 간단하고 스마트한 로봇 팔