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

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

부품 및 소모품

볼트 IoT 볼트 와이파이 모듈 1개
아두이노 우노 1개
아두이노 나노 R3 1개
nRF24L01 2개
DC 모터 12V 2개
DFRobot 12V 납산 배터리용 솔라 파워 매니저 1개
스파크펀 듀얼 H-브리지 모터 드라이버 L298 1개
점퍼 와이어 (일반) 1세트
LM35 온도 센서 1개
DFRobot 그래비티: 아날로그 정전 용량식 토양 수분 센서 (내식성) 1개
SG90 마이크로 서보 모터 1개
조이스틱, 10kΩ 1개

필요한 도구 및 장비

앱 및 온라인 서비스

프로젝트 소개

안녕하세요 여러분

이 프로젝트는 농부들에게 도움이 될 지구용 로버에 관한 것으로, 주로 세 가지 모듈로 구성됩니다.

모듈 1: 하드웨어 연결

DC 모터 고려 시 완전한 설정의 하드웨어 연결입니다.

두 개의 DC 모터와 모터 드라이버가 필요합니다. 모터 드라이버에는...

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

V+, EN1, EN2를 브레드보드 한 지점에 연결하고 모터 네 와이어를 1, 2 핀의 네 입력에 연결합니다. 다음으로 모터 드라이버 출력 핀을 아두이노에 연결하고 배터리는 다음 다이어그램과 같이 연결합니다.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

이제 볼트(Bolt)에 연결합니다. 같은 네 핀을 볼트의 디지털 핀(0, 1, 2, 3)에 연결합니다.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

토양 센서는 볼트의 디지털 4핀에 연결합니다. 마지막으로 온도 센서를 볼트 아날로그 핀(A0)에 연결합니다.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

이제 모든 그라운드와 V+(온도 센서, 수분 센서), EN1, EN2를 아두이노 5V에 연결하고, 이 모든 핀에 필요한 전압의 배터리를 공급합니다.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

모듈 2: nRF24L01 연결

NRF 연결:

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

위 다이어그램은 무선 통신용 nRF 모듈입니다. 이 다이어그램도 근거리에서 자동차 제어를 위해 회로에 포함되어야 합니다.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

아두이노와 nRF 최종 연결:

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

이제 조이스틱 연결:

두 개의 조이스틱 사용:

  1. 자동차 방향 제어
  2. 서보 제어
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

모듈 3: 최종 코딩

1) 아두이노 코딩:

송신기 (트랜스미터):

#include <SPI.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>

RF24 radio(7, 8); // CSN, CE
const byte address[6] = "00001";

int x_key = A1;
int y_key = A0;
int p_key = A3;
int q_key = A2;
int x_pos, y_pos, p_pos, q_pos;

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.setChannel(87);
  radio.setDataRate(RF24_250KBPS);
  radio.stopListening();
  Serial.begin(9600);
  pinMode(x_key, INPUT);
  pinMode(y_key, INPUT);
  pinMode(p_key, INPUT);
  pinMode(q_key, INPUT);
}

int pos;
void loop() {
  x_pos = analogRead(x_key);
  y_pos = analogRead(y_key);
  p_pos = analogRead(p_key);
  q_pos = analogRead(q_key);
  Serial.println(x_pos);
  Serial.println(y_pos);
  Serial.println(p_pos);
  Serial.println(q_pos);
  
  if (p_pos > 400 && p_pos < 600 && q_pos > 400 && q_pos < 600) {
    if (x_pos > 400 && x_pos < 600 && y_pos > 400 && y_pos < 600) {
      pos = 100; radio.write(&pos, sizeof(pos));
    }
    if (x_pos > 400 && x_pos < 600 && y_pos < 400) {
      pos = 200; radio.write(&pos, sizeof(pos));
    }
    if (x_pos > 400 && x_pos < 600 && y_pos > 600) {
      pos = 300; radio.write(&pos, sizeof(pos));
    }
    if (y_pos > 400 && y_pos < 600 && x_pos < 400) {
      pos = 400; radio.write(&pos, sizeof(pos));
    }
    if (y_pos > 400 && y_pos < 600 && x_pos > 600) {
      pos = 500; radio.write(&pos, sizeof(pos));
    }
    Serial.println(pos);
    delay(100);
  } else if (p_pos < 400 || p_pos > 600) {
    if (p_pos < 400) { pos = 600; radio.write(&pos, sizeof(pos)); }
    if (p_pos > 600) { pos = 700; radio.write(&pos, sizeof(pos)); }
    delay(100);
  }
}

수신기 (리시버):

#include <SPI.h>
#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>
#include <Servo.h>

Servo servo;
RF24 radio(7, 8); // CSN, CE
const byte address[6] = "00001";
int servo_pin = 9;
int sensor_pin = A0;
int output_value;

void setup() {
  Serial.begin(9600);
  radio.begin();
  servo.attach(servo_pin);
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.setChannel(87);
  radio.setDataRate(RF24_250KBPS);
  radio.startListening();
}

int pos;
void loop() {
  if (radio.available()) {
    radio.read(&pos, sizeof(pos));
    Serial.println(pos);
    if (pos == 100) {
      digitalWrite(6, LOW); digitalWrite(5, LOW);
      digitalWrite(4, LOW); digitalWrite(3, LOW);
    } else if (pos == 200) {
      digitalWrite(6, HIGH); digitalWrite(5, LOW);
      digitalWrite(4, HIGH); digitalWrite(3, LOW); delay(10);
    } else if (pos == 300) {
      digitalWrite(6, LOW); digitalWrite(5, HIGH);
      digitalWrite(4, LOW); digitalWrite(3, HIGH); delay(10);
    } else if (pos == 400) {
      digitalWrite(6, LOW); digitalWrite(5, HIGH);
      digitalWrite(4, HIGH); digitalWrite(3, LOW); delay(10);
    } else if (pos == 500) {
      digitalWrite(6, HIGH); digitalWrite(5, LOW);
      digitalWrite(4, LOW); digitalWrite(3, HIGH); delay(10);
    } else if (pos == 600) {
      servo.write(90); delay(10);
    } else if (pos == 700) {
      servo.write(180); delay(10);
    }
  } else {
    Serial.println("connection lost");
  }
}

텔레그램 메시지 수신용 (서버 코드):

repl.it 같은 서버에 로그인 후 코드 업로드

main.py

import requests
import json
import time
from boltiot import Bolt
import conf

mybolt = Bolt(conf.bolt_api_key, conf.device_id)

def get_sensor_value_from_pin(pin):
    try:
        response = mybolt.digitalRead(pin)
        data = json.loads(response)
        if data["success"] != 1:
            print("Request not successful")
            print("Response:", data)
            return -999
        sensor_value = int(data["value"])
        return sensor_value
    except Exception as e:
        print("Error getting sensor value:", e)
        return -999

def send_telegram_message(message):
    """텔레그램으로 메시지 전송"""
    url = "https://api.telegram.org/" + conf.telegram_bot_id + "/sendMessage"
    data = {"chat_id": conf.telegram_chat_id, "text": message}
    try:
        response = requests.request("GET", url, params=data)
        print("Telegram response:", response.text)
        telegram_data = json.loads(response.text)
        return telegram_data["ok"]
    except Exception as e:
        print("Telegram alert error:", e)
        return False

while True:
    # 1단계: 센서 값 읽기
    sensor_value = get_sensor_value_from_pin("4")
    print("Current sensor value:", sensor_value)
    # 2단계: 요청 실패 시 건너뛰기
    if sensor_value == -999:
        print("Request unsuccessful. Skipping.")
        time.sleep(10)
        continue
    # 3단계: 임계값 초과 시 알림
    if sensor_value >= conf.threshold:
        print("Current temperature value:")
        message = "The moisture value is just greater than threshold"
        telegram_status = send_telegram_message(message)
        print("Telegram status:", telegram_status)
    # 4단계: 대기
    time.sleep(100)

conf.py

"""텔레그램 알림 설정"""
bolt_api_key = "XXXX"        # 볼트 클라우드 API 키
device_id = "XXXX"           # 디바이스 ID (BOLTXXXX 형태)
telegram_chat_id = "@XXXX"   # 텔레그램 채널 ID (@ 뒤에 붙여넣기)
telegram_bot_id = "botXXXX"  # 텔레그램 봇 ID (bot 뒤에 붙여넣기)
threshold = 0                # 알림 발송 임계값

본인의 봇과 API 값 입력

텔레그램을 이용한 알림 메시징

텔레그램이란?

텔레그램은 왓츠앱과 유사한 메시징 앱입니다. 메시지와 파일 송수신 가능. 무료 사용. 안드로이드/iOS/윈도우 폰, PC, 맥에서 접속 가능.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

텔레그램 용어

텔레그램 채널이란?

채널은 텔레그램에서 왓츠앱의 그룹과 같습니다. 대규모 청중에게 메시지 브로드캐스트하는 도구. 무제한 구독자, 영구 URL 공개 가능, 각 게시물별 조회 수 확인 가능.

봇(Bot)이란?

봇은 텔레그램 내부에서 실행되는 서드파티 애플리케이션. 사용자는 메시지, 명령, 요청을 봇에 보낼 수 있습니다. 우리는 봇을 이용해 채널에 알림을 보냅니다.

이 프로젝트에서 배우는 것

센서 값이 설정한 임계값을 초과하면 텔레그램으로 휴대폰에 알림을 보내는 방법을 배웁니다.

필요한 것

텔레그램 설정

텔레그램 가입/로그인 단계
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
채널 만들기
텔레그램 채널이란?

채널은 텔레그램에서 왓츠앱의 그룹과 같습니다. 대규모 청중에게 메시지 브로드캐스트하는 도구. 무제한 구독자, 영구 URL 공개 가능, 각 게시물별 조회 수 확인 가능.

채널 생성 단계
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
봇 만들기
봇이란?

봇은 텔레그램 내부에서 실행되는 서드파티 애플리케이션. 사용자는 메시지, 명령, 요청을 봇에 보낼 수 있습니다. 우리는 봇을 이용해 채널에 알림을 보냅니다.

새 봇 생성

텔레그램은 "봇파더(BotFather)"라는 봇으로 새 봇 생성을 돕습니다. 다른 봇을 생성하고 관리하는 단일 봇입니다.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
봇을 채널에 추가
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

이제 트윌리오(Twilio)와 메일건(Mailgun) 네트워크 설정

LM35 온도 센서 값을 구글 어시스턴트로 언제든 SMS와 이메일로 휴대폰에서 수신.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

IoT 프로젝트 센서 값을 언제든 확인해야 할 때 뭐하시나요? 클라우드에 로그인해 확인하죠. 간단하죠? 하지만 매시간 또는 몇 분마다, 하루에 여러 번 확인해야 한다면 좀(아주) 번거롭죠? 이제 "센서 값 보내줘"라고 구글 어시스턴트에게 말하면 SMS와 이메일로 센서 값을 받는 세상을 상상해 보세요. 더 이상 상상이 아닙니다. 여러분이 직접 몇 단계로 구현할 수 있습니다. 계속 읽어보세요.

이 프로젝트에서는 LM35 센서의 온도 값을 구글 어시스턴트 명령으로 SMS와 이메일로 받습니다.

1단계: 하드웨어 설정

LM35 센서를 이름이 보이게 손에 쥐세요. 왼쪽부터 세 핀은 VCC, 출력, GND. 세 핀을 암-수 와이어에 연결. 왼쪽부터 세 와이어를 볼트 와이파이 모듈의 5V, A0, GND 핀에 연결. 와이파이 모듈을 5V 전원에 연결. 활성 인터넷 연결 확인.

2단계: 인테그로맷에서 IFTTT 모듈 만들기

인테그로맷 계정 로그인. 가입 안 했다면 여기서 계정 생성. 로그인 후 오른쪽 위 "새 시나리오 만들기" 클릭. IFTTT, HTTP, 메일건, 트윌리오 선택 후 "계속" 클릭. 흰 원 클릭 후 목록에서 IFTTT 선택, 메뉴에서 "데이터 수신" 선택. 이 모듈은 나중에 다룰 IFTTT 애플릿과 연결 필수. "추가" 클릭 후 웹훅 추가, 적절한 이름 주고 "저장". 이제 URL 또는 링크 생성. 저장해 두세요.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

3단계: 인테그로맷에서 HTTP 모듈 만들기

모듈에 붙은 "+" 기호 클릭해 새 모듈 추가. "HTTP" 선택 후 "요청하기" 선택. 볼트 IoT 클라우드에서 센서 값 수신용. URL에 https://cloud.boltiot.com/remote/your-bolt-iot-api-key/analogRead?pin=A0&deviceName=BOLTXXXXXXX 붙여넣기. "your-bolt-iot-api-key"와 "BOLTXXXXXXX"를 볼트 IoT 클라우드에서 찾을 수 있는 본인 자격증명으로 교체. 메서드는 "GET"로 두고 "확인".

위 링크로 볼트 IoT 클라우드에서 센서 값 가져옵니다. 출력은 {"value": "XXX", "success": "1"} 형태. XXX가 센서 값.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

4단계: 인테그로맷에서 메일건 모듈 만들기

다시 "+" 클릭, "Flow Control" 검색 후 선택, "라우터" 선택. 흰 원 두 개 생성. 첫 번째 흰 원 클릭, "메일건" 선택 후 "이메일 보내기". 여기서는 메일건으로 온도 이메일 수신. 이미 메일건 계정이 있으면 API 키와 도메인 이름을 메일건 계정에서 쉽게 찾기 가능. 계정 없으면 아래 대체 단계 참조. 요청된 세부 정보 입력. 수신자 메일(본인 이메일) 입력. "보낸 사람" 필드에 test@yourdomainname 입력. "내용" 섹션에서 센서 값이 아닌 온도 값 작성 필요. 센서 값을 온도 값으로 변환하려면 10.24로 나눔. XXX 형태 센서 값 얻으려면 다른 문자 제거 위해 "substring" 함수 사용. 대화상자 옆 "A" 기호 클릭 후 "substring" 선택.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

첫 번째 괄호 안 공간에 별표 아래 "데이터" 옵션 클릭 후 "11"과 "14"를 두 번째, 세 번째 공간에 입력. 엄밀히 말해 센서 값 가져오는 올바른 방법은 아니지만 핵으로 사용. 올바른 방법 아시는 분은 댓글로 알려주세요.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트
어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

나중에 "XXX"만 캡처하기 위함. 이 숫자를 10.24로 나눔.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

시나리오 저장 전 "스케줄링" 켜기 (화면 하단)하고 "시나리오 실행"을 "즉시"로 선택. 최종 시나리오는 이렇습니다.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

6단계: IFTTT에서 새 애플릿 만들기

IFTTT 계정 로그인. 가입 안 했다면 여기서 계정 생성. 로그인 후 "내 애플릿" 섹션에서 "새 애플릿" 클릭. "+this" 클릭 후 검색창에서 "구글 어시스턴트" 검색 선택. 다음 화면에서 "간단한 구문 말하기" 선택. 원하는 동작 트리거할 명령어 입력.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

"트리거" 클릭 후 "+that". 검색창에서 "웹훅" 검색 선택, 다음 화면에서 "웹 요청 만들기" 선택. URL 필드에 2단계 인테그로맷 IFTTT 모듈 생성 후 얻은 링크 붙여넣기. 이 단계는 구글 어시스턴트에게 명령 말할 때 인테그로맷 시나리오 실행 위해 필수. 이후 메서드에서 "POST" 선택, "액션 만들기" 클릭. 애플릿 적절한 이름 주고 "마침" 선택.

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

자, 이제 휴대폰 꺼내 "오케이 구글, 온도 센서 값 보내줘"라고 말해보세요. 마법이 일어납니다.

회로도

LM35 센서에 암-수 와이어 연결

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

볼트 와이파이 모듈에 암-수 와이어 연결

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

최종 연결

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

이제 모든 것 업로드하고 확인하세요.

궁금한 점은 댓글로 문의하세요.

감사합니다....................................

코드

최종 수신기 아두이노

#include <SPI.h> #include <nRF24L01.h> #include <printf.h> #include <RF24.h> #include <RF24_config.h> #include <Servo.h>
Servo servo;
RF24 radio(7, 8); // CSN, CE
const byte address[6] = "00001";
int servo_pin = 9;
int sensor_pin = A0;
int output_value;
void setup() {
  Serial.begin(9600);
  radio.begin();
  servo.attach(servo_pin);
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.setChannel(87);
  radio.setDataRate(RF24_250KBPS);
  radio.startListening();
}
int pos;
void loop() {
  if (radio.available()) {
    radio.read(&pos, sizeof(pos));
    Serial.println(pos);
    if (pos == 100) { digitalWrite(6, LOW); digitalWrite(5, LOW); digitalWrite(4, LOW); digitalWrite(3, LOW); }
    else if (pos == 200) { digitalWrite(6, HIGH); digitalWrite(5, LOW); digitalWrite(4, HIGH); digitalWrite(3, LOW); delay(10); }
    else if (pos == 300) { digitalWrite(6, LOW); digitalWrite(5, HIGH); digitalWrite(4, LOW); digitalWrite(3, HIGH); delay(10); }
    else if (pos == 400) { digitalWrite(6, LOW); digitalWrite(5, HIGH); digitalWrite(4, HIGH); digitalWrite(3, LOW); delay(10); }
    else if (pos == 500) { digitalWrite(6, HIGH); digitalWrite(5, LOW); digitalWrite(4, LOW); digitalWrite(3, HIGH); delay(10); }
    else if (pos == 600) { servo.write(90); delay(10); }
    else if (pos == 700) { servo.write(180); delay(10); }
  } else { Serial.println("connection lost"); }
}

최종 송신기 아두이노

#include <SPI.h> #include <nRF24L01.h> #include <printf.h> #include <RF24.h> #include <RF24_config.h>
RF24 radio(7, 8); // CSN, CE
const byte address[6] = "00001";
int x_key = A1; int y_key = A0; int p_key = A3; int q_key = A2;
int x_pos, y_pos, p_pos, q_pos;
void setup() {
  radio.begin(); radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN); radio.setChannel(87);
  radio.setDataRate(RF24_250KBPS); radio.stopListening();
  Serial.begin(9600);
  pinMode(x_key, INPUT); pinMode(y_key, INPUT);
  pinMode(p_key, INPUT); pinMode(q_key, INPUT);
}
int pos;
void loop() {
  x_pos = analogRead(x_key); y_pos = analogRead(y_key);
  p_pos = analogRead(p_key); q_pos = analogRead(q_key);
  Serial.println(x_pos); Serial.println(y_pos);
  Serial.println(p_pos); Serial.println(q_pos);
  if (p_pos > 400 && p_pos < 600 && q_pos > 400 && q_pos < 600) {
    if (x_pos > 400 && x_pos < 600 && y_pos > 400 && y_pos < 600) { pos = 100; radio.write(&pos, sizeof(pos)); }
    if (x_pos > 400 && x_pos < 600 && y_pos < 400) { pos = 200; radio.write(&pos, sizeof(pos)); }
    if (x_pos > 400 && x_pos < 600 && y_pos > 600) { pos = 300; radio.write(&pos, sizeof(pos)); }
    if (y_pos > 400 && y_pos < 600 && x_pos < 400) { pos = 400; radio.write(&pos, sizeof(pos)); }
    if (y_pos > 400 && y_pos < 600 && x_pos > 600) { pos = 500; radio.write(&pos, sizeof(pos)); }
    Serial.println(pos); delay(100);
  } else if (p_pos < 400 || p_pos > 600) {
    if (p_pos < 400) { pos = 600; radio.write(&pos, sizeof(pos)); }
    if (p_pos > 600) { pos = 700; radio.write(&pos, sizeof(pos)); }
    delay(100);
  }
}

회로도

어스 아날라이저: 환경 모니터링을 위한 고급 IoT 센서 키트

제조공정

  1. 블루투스 제어 아두이노 스파이봇(Spybot) 만들기
  2. 플릭모트(FlickMote): 스마트 홈을 위한 제스처 제어 IR 리모컨
  3. DIY 아두이노 TV B-Gone: 모든 TV를 끄는 만능 리모컨
  4. 아두이노로 만드는 대형 LED 마스터 시계 (알람 기능 포함, 12m 거리에서도 식별 가능)
  5. 아두이노와 블루투스로 만드는 스마트 물건 찾기 'Find Me'
  6. 아두이노 프로젝트를 위한 최적화된 전원 솔루션
  7. 아두이노 틱택토 게임 - MAX7219 LED 매트릭스와 골판지 케이스
  8. 스마트 아두이노 4족 보행 로봇 제작: 단계별 완벽 가이드
  9. 볼트 IoT와 아두이노 우노로 구현하는 무선 LED 밝기 제어 (PWM 6채널)
  10. 게이밍용 커스텀 아두이노 조이스틱 스티어링 휠 만들기