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

Arduino 에너지 모니터 및 데이터 로거를 구축하는 방법

구성품 및 소모품

Arduino UNO
× 1
Dr. Wattson 에너지 모니터링 위원회
× 1
Dr. Wattson 에너지 모니터링 위원회용 인클로저
× 1
Adafruit MicroSD 카드 브레이크아웃 보드+
× 1
LED(일반)
× 1
Adafruit 촉각 버튼
× 1
저항 221옴
× 1

이 프로젝트 정보

(이 게시물은 2017년 9월 19일 Medium에 처음 게시된 게시물을 기반으로 하며 GitHub의 라이브러리 및 예제 게시에 대한 세부 정보를 포함하여 여기에서 더 최신 상태로 업데이트되었습니다.)

이 게시물에서는 다양한 부하에 대한 전류 및 에너지 데이터를 쉽게 수집하고 Excel과 같은 프로그램을 사용하여 해당 정보를 플롯하는 데 도움이 되는 Arduino 에너지 모니터 및 데이터 로거를 구축한 방법을 보여 드리겠습니다.

여러분 중 일부는 제가 #Arduino 라이브러리 및 #Python 라이브러리( #RaspberryPi 및 #BeagleBoneBlack과 같은 보드용) 고품질 에너지 데이터를 다음 프로젝트에 쉽게 통합할 수 있습니다! 들어본 적이 없고 더 많은 정보를 원하시면 https://upbeatlabs-wattson.launchrock.com/에서 더 많은 정보를 확인하십시오. 틴디에서도 가능합니다.

다양한 부하의 에너지 특성을 연구하는 데 도움이 되도록 이 게시물의 주제인 Arduino 에너지 모니터 및 데이터 로거를 만들었습니다!

그것은 데이터를 쓸 SD 카드와 함께 에너지 데이터를 얻기 위해 Dr. Wattson 보드와 통신하는 Arduino(물론!)로 구성됩니다. 또한 데이터 로깅을 토글하는 버튼과 데이터가 로깅되고 있을 때 표시하는 LED 표시기를 추가했습니다. LED와 함께 버튼을 사용하면 적절한 로드를 연결했을 때 데이터 로깅을 시작하기가 정말 쉬워졌습니다.

로깅 및 후속 분석을 용이하게 하기 위해 로그 회전 체계도 구현하여 각 실행이 다른 파일에 기록됩니다. 출력은 CSV 형식이므로 Excel(또는 Mac의 Numbers 또는 기타 동등한 기능)으로 쉽게 가져올 수 있고 데이터가 표시됩니다.

설정

Dr. Wattson 보드를 아크릴 인클로저에 넣어 AC 전선이 봉입되어 안전하게 사용하실 수 있습니다! 이렇게:

나중에 인클로저를 약간 업데이트했으며 이제 Tindie에서 사용할 수 있습니다. 이것이 지금의 모습입니다. 추가 IEC 소켓과 쉬운 연결을 위한 스페이드 커넥터로 좀 더 깔끔하게 정리했습니다.

배선 방법을 보여주는 사용자 매뉴얼을 준비했으며 현재 GitHub에서 볼 수 있습니다.

Wattson 박사에서 나오는 디지털 출력은 전류 및 전압 변압기를 사용하여 격리된 방식으로 에너지 측정이 수행되기 때문에 주전원에서 완전히 격리되어 있으므로 디지털 출력을 처리하기에 완벽하게 안전합니다.

인클로저에 들어가면 케이블을 기존 콘센트에 꽂고 모든 장치를 인클로저의 콘센트에 연결하기만 하면 됩니다. — PCB는 최대 12A의 전류용으로 설계되었으므로 상당히 잘 만들어졌습니다! 최대 4A의 전류를 측정하도록 보정되었습니다(그래서 대기 전력 측정을 위한 아주 작은 전류를 측정할 수 있었습니다. —기반이 되는 MCP39F521 칩의 동적 비율은 4000:1이므로 4A에서 1mA까지 측정할 수 있음)

회로

다음은 내가 사용한 회로입니다.

나는 Adafruit와 유사한 SD 카드 브레이크아웃을 사용했습니다(그래서 Fritzing에서 가장 가까운 부분이므로 사용했습니다). 연결은 매우 표준적입니다. — CLK(Arduino Uno 핀 13), MISO(Arduino Uno 핀 12), MOSI(Arduino Uno 핀 11) 및 CS(칩 선택). CS는 구성 가능하지만 하드웨어 CS의 경우 기본적으로 10번 핀으로 설정되어 있습니다. — 그냥 사용합니다.

버튼의 경우 사용하기 쉬운 패키지에 디바운싱 및 다양한 유용한 기능을 제공하는 Jack Christensen의 Button 라이브러리를 사용합니다. (https://github.com/JChristensen/Button). 버튼은 Arduino의 내부 풀업을 사용하므로 외부 풀업이 없고 반전 논리도 사용합니다(높음은 OFF, 낮음은 ON) — 이 모든 것은 Button 생성자의 매개변수로 구성할 수 있습니다! 버튼을 핀 4에 연결했지만 원하는 핀을 사용할 수 있습니다.

나는 정말로 Dr. Wattson을 Fritzing의 새로운 부분으로 모델링할 시간과 인내심이 없었습니다. 그래서 나는 속이고 Z-HUT의 조언을 사용했습니다. 많은 고민 없이 사용자 정의 부품을 쉽게 채찍질할 수 있습니다. 나는 그것을 시청하는 것이 좋습니다! https://www.youtube.com/watch?v=dfxx8wF3Uhs — 고마워요 Z-HUT ! :-)

유일한 단점은 내가 Dr. Wattson을 표현하기 위해 수정한 "일반 IC" 부품의 브레드보드 이미지를 사용하는 데 만족해야 한다는 것입니다. 씨라비!

다음은 Wattson 박사의 핀(왼쪽에서 오른쪽으로)입니다.

<울>
  • SCL — I2C 통신의 경우 Arduino Uno A5로 이동
  • SDA — I2C 통신의 경우 Arduino Uno A4로 이동
  • ZCD — Zero Cross Detection — 이 예에서는 이 기능을 사용하지 않습니다.
  • 이벤트 — 이벤트 표시기 — 이 예에서는 이 기능을 사용하지 않습니다.
  • GND — Arduino GND에 연결
  • VIN — Arduino 5V에 연결
  • 3.3v — Arduino 3.3v에 연결
  • GND — Arduino GND에 연결(GND 핀 중 하나만 연결하면 됨)
  • 스케치

    자, 이제 실제 프로그래밍으로 넘어갑니다!

    먼저 스케치부터 설명하겠습니다. setup()에서 먼저 SD 카드 통신을 설정하고 각각의 begin() 메서드를 호출하여 Dr.Wattson 통신을 설정합니다.

    // 카드가 존재하고 초기화 가능한지 확인:if (!SD.begin(CHIP_SELECT)) { Serial.println(F("Card failed, or not present")); // 더 이상 아무것도 하지 않음:} wattson.begin(); // 적절한 주소를 전달합니다. 기본값은 0x74입니다. 

    LED 핀도 OUTPUT으로 초기화합니다.

    // 디지털 핀을 출력으로 초기화합니다. 핀모드(LED, 출력); 

    버튼은 전역적으로 선언되므로 버튼 설정에서 아무 것도 할 필요가 없습니다.

    #define BUTTON_PIN 4 //촉각 버튼 스위치(또는 이와 유사한 것)를 // Arduino 핀 4에서 접지로 연결합니다. #define PULLUP true // 간단하게 유지하기 위해 Arduino의 내부 풀업 저항을 사용합니다.#define INVERT true //스위치가 닫히지 않는 한 풀업 저항은 핀을 high로 유지하므로 // 이것은 부논리입니다. 즉 high입니다. state // 버튼이 눌리지 않았음을 의미합니다. (일반적으로 열린 스위치를 가정합니다.)#define DEBOUNCE_MS 20 //20밀리초의 디바운스 시간은 일반적으로 촉각 버튼 스위치에 적합합니다.Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); //버튼 선언 

    내 데이터 로깅은 DATAXX.CSV와 같은 이름을 가진 파일에서 수행됩니다. 여기서 XX는 숫자(00에서 99까지이므로 100개의 파일)입니다. SD 카드에서 기존 파일 이름을 확인하고 사용하지 않은 최신 파일 이름을 선택합니다(예:DATA15.CSV

    ).
    char filename[] ="DATA00.CSV";setup() { ... // 새 파일 생성 for (uint8_t i =0; i <100; i++) { filename[4] =i /10 + '0'; 파일명[5] =i%10 + '0'; if (!SD.exists(filename)) { Serial.print(F("데이터 파일은 ")); Serial.println(파일명); // 존재하지 않는 경우에만 새 파일을 엽니다. break; // 루프를 떠나십시오! 파일 이름은 이제 우리가 원하는 파일이 될 것입니다. } }...} 

    loop() 함수에서 버튼을 누르면 에너지 데이터를 읽을지 여부를 제어하는 ​​readData 변수를 토글합니다.

    void 루프() { ... myBtn.read(); //버튼 읽기 if (myBtn.wasReleased()) { //버튼에서 손을 떼면 LED 상태 변경 readData =!readData; 디지털 쓰기(LED, 데이터 읽기); } if (readData) { ... // 데이터를 읽고 SD 카드 등에 저장 .......} 

    readData가 토글되면 Wattson 박사의 에너지 데이터를 읽고 시간도 기록합니다.

    <사전><코드> UpbeatLabs_MCP39F521_FormattedData fData; int readMCPretval =wattson.readMCP39F521(&데이터, NULL); 부호 없는 긴 currentMillis =millis();

    SD 카드에 기록:

     // 파일을 사용할 수 있으면 다음과 같이 작성합니다. File dataFile =SD.open(filename, FILE_WRITE); if (dataFile) { dataFile.print(currentMillis); dataFile.print(","); dataFile.print(fData.currentRMS); dataFile.print(","); dataFile.print(fData.activePower); dataFile.print(","); dataFile.print(fData.reactivePower); dataFile.print(","); dataFile.println(fData.appparentPower); // 직렬 포트에도 인쇄:dataFile.close(); } // 파일이 열려 있지 않으면 오류를 표시합니다. else { Serial.print(F("error opening ")); Serial.println(파일명); }  

    버튼을 다시 토글하면 데이터 읽기/녹화가 중지됩니다.

    행동!

    스케치를 컴파일하고 Arduino에 업로드하고 나면 에너지 데이터를 얻는 것이 매우 쉬웠습니다.

    나는 CFL 램프를 선택한 부하를 연결했습니다. 나는 웜 스타트뿐만 아니라 콜드 스타트 ​​관점에서 전류와 에너지 소비를 보고 싶었습니다. 램프를 꽂았지만 켜지지 않았습니다.

    에너지 측정을 시작하기 위해 회로의 버튼을 눌렀습니다. — 기록 중일 때 RED LED가 그렇게 말했습니다! 그런 다음 CFL 램프를 켜고 충분한 데이터를 얻었다고 생각할 때까지 기다렸습니다." 결국 약 14W. 나는 수치가 안정될 때까지 기다렸다. 그런 다음 버튼을 눌러 읽기를 껐습니다.

    이제 SD 카드를 꺼내 데이터를 볼 수 있습니다!

    PS — 추가 장치에서 데이터를 기록하려면 Arduino를 재설정하기만 하면 됩니다 — 데이터를 기록할 다음 사용 가능한 DATAXX.CSV를 선택하므로 데이터를 쉽게 분리할 수 있습니다.

    참고: Arduino 직렬 모니터를 사용하는 대신 Mac 터미널에 내장된 "screen" 명령을 직렬 터미널로 사용합니다. 내 스케치에서 에너지 데이터를 직렬로 인쇄하고 "clearscreen" 명령도 실행하여 출력이 움직이지 않도록 합니다.

    Serial.write("\x1B" "c"); // 일반 터미널에서 화면 지우기 wattson.printMCP39F521Data(&data); 

    이것은 위와 같은 터미널 명령을 수락할 수 있는 일반 터미널에서만 작동하며 불행히도 Arduino 직렬 모니터에서는 작동하지 않습니다. 그러나 일단 시도하면 화면 , Arduino 직렬 모니터로 돌아갈 수 없습니다!

    명령은 다음과 같습니다.

    $ 화면 /dev/tty.usbmodem1411 9600 

    여기서 첫 번째 매개변수는 "직렬 포트"이고 두 번째 매개변수는 Arduino 스케치에서 직렬 연결을 위해 구성한 속도입니다.

    Excel에서 데이터 그리기

    CSV 형식의 파일이기 때문에 Excel에서 로드하고 플롯하는 것이 매우 쉬웠습니다. Excel에서 차트를 만드는 방법에 대한 많은 자습서가 있으므로 여기에서 자세한 내용은 다루지 않겠습니다. 열 헤더가 포함된 행을 삽입했습니다.

    타임스탬프, currentRMS, activePower, reactPower,apparentPower 

    (자기 참고 사항 — 내 Sketch의 향후 개선 사항이 될 것입니다. — CSV에 열 머리글을 직접 추가합니다!)

    위의 데이터 포인트를 선택하여 기록하고 플로팅했습니다. 시간 경과에 따른 전류 소비는 분명히 흥미롭습니다. 왜 activePower, ReactivePower 및 AppearancePower입니까? 장치의 전기적 특성에 따라 저항 부하, 무효 부하 또는 그 사이의 어딘가가 될 수 있으며, 따라서 세 가지 전력 매개변수는 전체 특성과 시간이 지남에 따라 변경되는 경우를 알려줍니다. 아니면...

    콜드 스타트에서 CFL 램프에 대한 결과를 살펴보겠습니다.

    전류는 약 0.21암페어에서 정점을 이루기 전에 결국 약 0.18암페어로 조정됩니다.

    유효 전력은 약 17와트에서 정점을 찍다가 결국 약 14.2와트로 안정됩니다.

    안정되면 CFL을 끄고 잠시 기다렸다가 다시 켭니다(따라서 위 차트의 전류가 떨어짐). CFL이 "워밍업"되면 안정적인 상태로 빠르게 안정되는 것을 볼 수 있습니다.

    결론

    가전 ​​제품과 장치의 에너지 데이터로 할 수 있는 흥미로운 데이터와 실험이 많이 있습니다. 일부 데이터를 손에 넣고 여러분과 공유하게 되어 기뻤습니다!

    Wattson 박사의 목표는 Maker를 위한 양질의 에너지 데이터를 활성화하고 더 쉽게 접근할 수 있도록 하여 당신이 기발하고 기발한 아이디어를 위한 빌딩 블록으로 사용할 수 있도록 하는 것입니다.

    Wattson 박사는 안전하게 사용할 수 있도록 설계되었으며(특히 인클로저와 함께) 보정되어 제공되지만(따라서 고품질 에너지 데이터를 즉시 얻을 수 있음), 진지한 사용자를 위해 더 복잡한 기능도 노출합니다.

    <울>
  • 교정 루틴
  • ZCD(Zero Crossing Detector)
  • 이벤트 알림(과전류, 과전력, 전압 강하/서지 이벤트)
  • 판독 범위를 사용자 정의하는 기능(부하 저항기 및/또는 CT를 수정하고 위에서 언급한 교정 루틴을 사용하여 재교정),
  • 단일 MCU와 함께 여러 Dr. Wattsons 사용(구성 가능한 I2C 주소 지정 변경)
  • 에너지 모니터링에 관심이 있고 Wattson 박사가 마음에 든다면 (https://upbeatlabs-wattson.launchrock.com/)에 가입하여 뉴스와 업데이트를 받아보세요!

    건배,

    스리다르

    다음은 참조용 전체 스케치입니다! 또한 Upbeat Labs drwattson GitHub 리포지토리에서 다른 예제 호스트와 함께 Dr. Wattson 라이브러리를 찾을 수 있습니다.

    <사전><코드>/************************************************ ************************************ Upbeat Labs Dr. Wattson Energy Monitoring Breakout의 스케치 예시입니다. --> https://www.tindie.com/products/UpbeatLabs/dr-wattson-energy-monitoring-board-2/ 이 예는 Dr. Wattson으로부터 에너지 데이터를 가져와 쉼표로 구분된 SD 카드에 쓰는 방법을 보여줍니다. (CSV) 형식. 버튼은 데이터 수집을 전환하는 데 사용되므로 준비가 되면 데이터를 기록할 수 있습니다. 버튼이 측정을 토글하면 스케치는 에너지 데이터에 대한 모듈을 폴링하고 인쇄하기 시작합니다. 값을 보기 쉽도록 화면과 같은 프로그램을 사용하여 Serial 출력을 표시합니다. 직렬은 일반 터미널에서 화면을 지우는 데 필요한 문자를 씁니다. 즉, 직렬 출력이 제자리에 유지되고 시간이 지남에 따라 업데이트됩니다. 입력 전원을 켜서 전압 RMS를 확인하면 라인 주파수 값이 적절한 값으로 변경됩니다. 출력에 연결된 부하를 켜서 현재 RMS, 역률, 유효 전력, 무효 전력 및 피상 전력 값의 변화를 확인합니다. 이 모든 값은 CSV 형식으로 SD 카드에 기록되며 Excel과 같은 프로그램에서 데이터를 보고 플롯하는 데 사용할 수 있습니다. 파일 이름은 DATAnn.CSV 형식입니다. 설정 시 이미 존재하지 않는 새 파일 이름이 선택되므로 파일은 DATA00.CSV, DATA01.CSV, DATA02.CSV 등이 됩니다. 로깅은 DATA99.CSV까지 새 파일로 회전합니다. 통신은 I2C를 통해 이루어집니다. 인터페이스에는 2개의 핀이 필요합니다. 보드당 4개의 선택 가능한 I2C 주소 가능성이 있습니다(2개의 솔더 점퍼를 통해 선택 가능(각 핀을 하이 또는 로우로 선택). 이에 따라 4개의 가능한 주소가 있습니다:I2C 주소 SJ1 SJ2 0x74 LOW LOW 0x75 LOW HIGH 0x76 HIGH LOW 0x77 HIGH HIGH Wattson은 알림에 사용되는 ZCD 또는 이벤트의 두 가지 출력을 가지고 있으므로 일반적으로 외부에서 인터럽트 가능한 핀(예:Arduino Uno의 핀2 또는 핀3)에 연결됩니다. 이 예에서 ZCD와 이벤트는 그렇지 않습니다. 버튼은 핀 4에 연결됩니다. * SD 카드는 다음과 같이 SPI 버스에 연결됩니다. ** MOSI - 핀 11 ** MISO - 핀 12 ** CLK - 핀 13 ** CS - 핀 10 LED가 핀 9에 연결됨 Written Upbeat Labs LLC용 Sridhar Rajagopal 작성 BSD 라이선스 위의 모든 텍스트는 재배포 시 포함되어야 합니다.*/#include #include "UpbeatLabs_MCP39F521.h#include #include //https://github.com/JChristensen/Button#define BUTTON_PIN 4 //촉각 버튼 스위치(또는 이와 유사한 것) 연결 // Arduino 핀 4에서 to ground.#define PULLUP true //간단하게 유지하기 위해 Arduino의 내부 풀업 저항을 사용합니다.#define INVERT true //풀업 저항은 //스위치가 닫히지 않는 한 핀을 높게 유지하므로 이것은 부논리입니다. 즉, 높은 상태는 // 버튼이 눌려지지 않았음을 의미합니다. (일반적으로 열린 스위치를 가정합니다.)#define DEBOUNCE_MS 20 //20밀리초의 디바운스 시간은 일반적으로 촉각 버튼 스위치에 적합합니다.Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); //버튼 선언#define LED 9 // LED(220ohm 저항을 통해)를 핀 9(양극)에서 GND(음극)로 연결합니다. #define CHIP_SELECT 10UpbeatLabs_MCP39F521 wattson =UpbeatLabs_MCP39F521();bool readData =false;char 파일 이름[] ="DATA00.CSV"; void setup() { Serial.begin(9600); //시리얼 통신 켜기 Serial.println(F("**Upbeat Labs Dr. Wattson Example Sketch**")); Serial.println(F("Upbeat Labs Dr. Wattson Energy Data SD 카드 로깅 예제 스케치")); Serial.println(F("****************************************** ***********************")); // 디지털 핀을 출력으로 초기화합니다. 핀모드(LED, 출력); 핀모드(CHIP_SELECT, OUTPUT); // 카드가 존재하고 초기화 가능한지 확인:if (!SD.begin(CHIP_SELECT)) { Serial.println(F("*** SD 카드가 실패했거나 존재하지 않음 ***")); // 더 이상 아무것도 하지 않음:} wattson.begin(); // 적절한 주소를 전달합니다. 기본값은 0x74입니다. // 새 파일 생성 for (uint8_t i =0; i <100; i++) { filename[4] =i/10 + '0'; 파일명[5] =i%10 + '0'; if (!SD.exists(filename)) { Serial.print(F("데이터 파일은 ")); Serial.println(파일명); // 존재하지 않는 경우에만 새 파일을 엽니다. break; // 루프를 떠나십시오! 파일 이름은 이제 우리가 원하는 것이 될 것입니다. } } Serial.println(F("**initialization complete.**"));}void loop() { myBtn.read(); //버튼 읽기 if (myBtn.wasReleased()) { //버튼에서 손을 떼면 LED 상태 변경 readData =!readData; 디지털 쓰기(LED, 데이터 읽기); } if (readData) { UpbeatLabs_MCP39F521_Data 데이터; UpbeatLabs_MCP39F521_FormattedData fData; int readMCPretval =wattson.read(&데이터, NULL); 부호 없는 긴 currentMillis =millis(); if (readMCPretval ==UpbeatLabs_MCP39F521::SUCCESS) { // 출력하기 Serial.write("\x1B" "c"); // 일반 터미널에서 화면을 지웁니다. wattson.convertRawData(&data, &fData); printMCP39F521Data(&fData); // 파일을 사용할 수 있으면 다음과 같이 씁니다. File dataFile =SD.open(filename, FILE_WRITE); if (dataFile) { dataFile.print(currentMillis); dataFile.print(","); dataFile.print(fData.currentRMS); dataFile.print(","); dataFile.print(fData.activePower); dataFile.print(","); dataFile.print(fData.reactivePower); dataFile.print(","); dataFile.println(fData.appparentPower); // 직렬 포트에도 인쇄:dataFile.close(); } // 파일이 열려 있지 않으면 오류를 표시합니다. else { Serial.print(F("error opening ")); Serial.println(파일명); } } else { Serial.print(F("오류!")); Serial.println(readMCPretval); } }} 무효 printMCP39F521Data(UpbeatLabs_MCP39F521_FormattedData *data){ Serial.print(F("전압 =")); Serial.println(데이터->전압RMS, 4); Serial.print(F("현재 =")); Serial.println(데이터->currentRMS, 4); Serial.print(F("라인 주파수 =")); Serial.println(데이터->lineFrequency, 4); Serial.print("아날로그 입력 전압 ="); Serial.println(데이터->analogInputVoltage, 4); Serial.print(F("역률 =")); Serial.println(data->powerFactor, 4); Serial.print(F("유효 전력 =")); Serial.println(data->activePower, 4); Serial.print(F("무효 전력 =")); Serial.println(데이터->반응력, 4); Serial.print(F("피상 전력 =")); Serial.println(data->apparentPower, 4);}
    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 코드 스니펫 #1
  • 코드 스니펫 #3
  • 코드 스니펫 #4
  • 코드 스니펫 #5
  • 코드 스니펫 #7
  • 코드 스니펫 #11
  • 코드 스니펫 #1일반 텍스트
    // 카드가 있고 초기화할 수 있는지 확인합니다. if (!SD.begin(CHIP_SELECT)) { Serial.println(F("카드가 실패했거나 존재하지 않음")); // 더 이상 아무것도 하지 않음:} wattson.begin(); // 적절한 주소를 전달합니다. 기본값은 0x74입니다.
    코드 스니펫 #3일반 텍스트
    #define BUTTON_PIN 4 //촉각 버튼 스위치(또는 이와 유사한 것)를 // Arduino 핀 4에서 접지로 연결합니다. #define PULLUP true // 간단하게 유지하기 위해 Arduino의 내부 풀업 저항을 사용합니다.#define INVERT true //스위치가 닫히지 않는 한 풀업 저항은 핀을 high로 유지하므로 // 이것은 부논리입니다. 즉 high입니다. state // 버튼이 눌리지 않았음을 의미합니다. (일반적으로 열린 스위치를 가정합니다.)#define DEBOUNCE_MS 20 //20밀리초의 디바운스 시간은 일반적으로 촉각 버튼 스위치에 적합합니다.Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); //버튼 선언
    코드 스니펫 #4일반 텍스트
    char filename[] ="DATA00.CSV";setup() { ... // 새 파일 생성 for (uint8_t i =0; i <100; i++) { filename[4] =i/10 + '0'; 파일명[5] =i%10 + '0'; if (!SD.exists(filename)) { Serial.print(F("데이터 파일은 ")); Serial.println(파일명); // 존재하지 않는 경우에만 새 파일을 엽니다. break; // 루프를 떠나십시오! 파일 이름은 이제 우리가 원하는 파일이 될 것입니다 } }...}
    코드 스니펫 #5일반 텍스트
    <사전> myBtn.read(); //버튼 읽기 if (myBtn.wasReleased()) { //버튼에서 손을 떼면 LED 상태 변경 readData =!readData; 디지털 쓰기(LED, 데이터 읽기); } if (readData) { ... // 데이터를 읽어 SD 카드 등에 저장 ....
    코드 스니펫 #7일반 텍스트
     // 파일을 사용할 수 있으면 다음과 같이 씁니다. File dataFile =SD.open(filename, FILE_WRITE); if (dataFile) { dataFile.print(currentMillis); dataFile.print(","); dataFile.print(data.currentRMS); dataFile.print(","); dataFile.print(data.activePower); dataFile.print(","); dataFile.print(data.reactivePower); dataFile.print(","); dataFile.println(data.appparentPower); // 직렬 포트에도 인쇄:dataFile.close(); } // 파일이 열려 있지 않으면 오류를 표시합니다. else { Serial.print(F("error opening ")); Serial.println(파일명); } 
    코드 스니펫 #11일반 텍스트
    <사전>/************************************************ ***** 이것은 Upbeat Labs Dr. Wattson Energy Monitoring Breakout의 예시 스케치입니다. 통신은 I2C를 통해 발생합니다. 인터페이스에는 2개의 핀이 필요합니다. 보드당 4개의 선택 가능한 I2C 주소 가능성이 있습니다(2개의 솔더 점퍼를 통해 선택 가능(각 핀을 하이 또는 로우로 선택). 이에 따라 4개의 가능한 주소가 있습니다:I2C 주소 SJ1 SJ2 0x74 LOW LOW 0x75 LOW HIGH 0x76 HIGH LOW 0x77 HIGH HIGHDr. Wattson에는 알림에 사용되는 ZCD 또는 이벤트의 두 가지 출력이 있으므로 일반적으로 외부에서 인터럽트 가능한 핀(예:Arduino Uno의 핀2 또는 핀3)에 연결됩니다. 이 예에서 ZCD 및 이벤트는 사용되지 않습니다. .Button은 핀 4에 연결됩니다. * SD 카드는 다음과 같이 SPI 버스에 연결됩니다. ** MOSI - 핀 11 ** MISO - 핀 12 ** CLK - 핀 13 ** CS - 핀 10 LED는 핀 9에 연결됨 Upbeat Labs LLC용 Sridhar Rajagopal. BSD 라이선스. 위의 모든 텍스트는 재배포 시 포함되어야 합니다. */ #include #include "MCP39F521.h#include #include / /https://github.com/JChristensen/Button#define BUTTON_PIN 4 //촉각 버튼 스위치(또는 이와 유사한 것) 연결 // Arduino 핀 4에서 접지로 . #define PULLUP true // 간단하게 유지하기 위해 Arduino의 내부 풀업 저항을 사용합니다.#define INVERT true //스위치가 닫히지 않는 한 풀업 저항은 핀을 high로 유지하므로 // 이것은 부논리입니다. 즉 high입니다. state // 버튼이 눌리지 않았음을 의미합니다. (일반적으로 열린 스위치를 가정합니다.)#define DEBOUNCE_MS 20 //20밀리초의 디바운스 시간은 일반적으로 촉각 버튼 스위치에 적합합니다.Button myBtn(BUTTON_PIN, PULLUP, INVERT, DEBOUNCE_MS); //버튼 선언#define LED 9 // LED(220ohm 저항을 통해)를 핀 9(양극)에서 GND(음극)로 연결합니다.#define CHIP_SELECT 10MCP39F521 wattson =MCP39F521();bool readData =false;char 파일 이름[ ] ="DATA00.CSV"; 무효 setup() { Serial.begin(9600); //시리얼 통신 켜기 Serial.println(F("**Upbeat Labs Dr. Wattson Example Sketch**")); // 디지털 핀을 출력으로 초기화합니다. 핀모드(LED, 출력); 핀모드(10, 출력); // 카드가 있고 초기화 가능한지 확인:if (!SD.begin(CHIP_SELECT)) { Serial.println(F("Card failed, or not present")); // 더 이상 아무것도 하지 않음:} wattson.begin(); // 적절한 주소를 전달합니다. 기본값은 0x74입니다. // (uint8_t i =0; i <100; i++) { filename[4] =i/10 + '0'; 파일명[5] =i%10 + '0'; if (!SD.exists(filename)) { Serial.print(F("데이터 파일은 ")); Serial.println(파일명); // 존재하지 않는 경우에만 새 파일을 엽니다. break; // 루프를 떠나십시오! 파일 이름은 이제 우리가 원하는 것입니다. } } Serial.println(F("**초기화 완료.**")); } int// 이것은 MCP39F521Data의 모습입니다, 참고로!//typedef struct MCP39F521Data {// uint16_t systemStatus;// uint16_t systemVersion;// uint16_t voltageRMS;// uint16_t voltageRMS;// uint16_t lineFrequency1;//t; / uint32_t currentRMS;// uint32_t activePower;// uint32_t reactPower;// uint32_t 겉보기전력;// MCP39F521Data; 무효 루프() { myBtn.read(); //버튼 읽기 if (myBtn.wasReleased()) { //버튼에서 손을 떼면 LED 상태 변경 readData =!readData; 디지털 쓰기(LED, 데이터 읽기); } if (readData) { MCP39F521Data 데이터; int readMCPretval =wattson.readMCP39F521(&데이터, NULL); 부호 없는 긴 currentMillis =millis(); if (readMCPretval) { // 내용을 출력합니다. Serial.write("\x1B" "c"); // 일반 터미널에서 화면을 지웁니다. wattson.printMCP39F521Data(&data); // 파일을 사용할 수 있으면 다음과 같이 작성합니다. File dataFile =SD.open(filename, FILE_WRITE);if (dataFile) { dataFile.print(currentMillis); dataFile.print(","); dataFile.print(data.currentRMS); dataFile.print(","); dataFile.print(data.activePower); dataFile.print(","); dataFile.print(data.reactivePower); dataFile.print(","); dataFile.println(data.appparentPower); // 직렬 포트에도 인쇄:dataFile.close(); } // 파일이 열려 있지 않으면 오류를 표시합니다. else { Serial.print(F("error opening ")); Serial.println(파일명); } } else { Serial.println(F("오류!")); } }}
    깃허브
    https://github.com/JChristensen/Buttonhttps://github.com/JChristensen/Button
    Upbeat Labs Dr. Wattson 에너지 모니터링 보드 라이브러리
    Wattson Energy Monitoring BoardDr. Wattson 박사와 함께 사용하기 위한 라이브러리 Wattson은 Arduino, Raspberry Pi 및 기타 메이커 친화적인 마이크로컨트롤러용 에너지 모니터링 브레이크아웃 보드입니다. 고품질 AC 에너지 측정을 다음 프로젝트에 쉽게 통합!Microchip의 단상 전력 모니터링 칩인 MCP39F521을 기반으로 하는 보드는 광범위한 전압을 견딜 수 있도록 설계되었으므로 Raspberry Pi 또는 기타 3.3v MCU도 마찬가지로 쉽게 사용할 수 있습니다. 이 장치는 사전 보정(1mA에서 최대 4A까지 측정 가능)으로 제공되므로 몇 가지 간단한 명령으로 처음부터 품질 측정을 시작할 수 있습니다. 추가 CT 또는 기타 구성 요소가 필요하지 않습니다. 고급 사용자라면 풍부한 라이브러리에서 다양한 기능을 사용할 수 있을 뿐만 아니라 필요에 맞게 하드웨어를 조정하고 라이브러리.https://github.com/upbeatlabs/drwattson

    회로도


    제조공정

    1. 클라우드와 클라우드가 IT 세계를 변화시키는 방식
    2. 예방 유지보수 일정을 수립하고 최적화하는 방법
    3. TensorFlow로 Variational Autoencoder를 구축하는 방법
    4. 온도 및 습도 데이터 로거
    5. Arduino Temp. 3.2 디스플레이가 있는 모니터 및 실시간 시계
    6. DHT11로 Blynk에서 온도와 습도를 읽는 방법
    7. 홈 모니터
    8. Arduino 기반 스마트 에너지 모니터
    9. GPS 데이터 로거, 실시간 곡선, 최대 높이 및 최대 속도
    10. Arduino 및 Processing IDE를 사용하여 나침반을 만드는 방법