0 đánh giá

Tự làm bãi đỗ xe điều khiển qua Ethernet với Arduino

Nêú bạn gặp vấn đề với các đề tài nghiên cứu nhỏ thì bạn có thể làm đề tài này, nó rất đơn giản. Ý tưởng như sau, bạn sẽ làm 1 bãi đỗ xe nhỏ, có cảm biến xe vào và 1 cổng đóng mở. Tất cả các trạng thái đóng mở và có xe được hiển thị qua trình duyệt web của bạn.

Bước 1: Linh kiện sử dụng

1. Arduino Uno

2. Ethernet shield

3. Cảm biến siêu âm (HC-SR04)

4. Động cơ bước (SG-90)

5. Cảm biến khoảng cách dùng hồng ngoại (GP2Y0A41SK0F)

6. Board ráp

7. Dây nối

Bước 2: Cách nối mạch
khoere_noi-mach-1-7863814160.jpg khoere_noi-mach-2-4829801660.jpg khoere_noi-mach-3-5263888859.jpg khoere_noi-mach-4-6284806779.jpg khoere_noi-mach-5-4769883309.jpg khoere_noi-mach-6-8046624935.jpg khoere_noi-mach-7-9032549941.jpg khoere_noimach-8-3943519415.jpg khoere_noi-mach-9-485000316.jpg

Bạn tiến hành nối mạch và cài đặt lắp ráp mô hình như ảnh phía trên.

Địa chỉ IP được gán là 192.168.1.177

Nếu địa chỉ IP này bạn đã gán cho thiết bị khác rồi thì bạn đổi lại nhé,nếu ko đơn giản bạn khởi động lại modern.

Bước 3: Lập trình

/*
 Hệ thống bãi đậu xe với Ethernet (Web Server) trong Arduino
*/

#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>

#if defined(WIZ550io_WITH_MACADDRESS) // WIZ550io는 MAC주소가 내장되어 있는 모듈입니다.
;
#else
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; // mac 주소 입력
#endif

//#define __USE_DHCP__ // DHCP사용 시 Define

// Static IP 설정
IPAddress ip(192,168,1,177);  // 로컬 네트워크에서 독립적인 IP를 사용해야 합니다.
IPAddress gateway( 192, 168, 1, 1 );
IPAddress subnet( 255, 255, 255, 0 );
// fill in your Domain Name Server address here:
IPAddress myDns(8, 8, 8, 8); // google puble dns

// 소켓을 80번 포트로 생성
// 위 함수로 Socket을 생성하고 클라이언트 접속을 기다리는 대기모드로 진입한다.
// HTTP를 사용할 땐 기본적으로 80번 포트 사용.
// IANA(Internet Assigned Numbers Authority)에서 HTTP는 포트를 80번을 사용하자고 권유하였음.
// 하지만 사용자가 원하는 대로 포트 설정 가능하다.
// https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt
EthernetServer server(80);

void check_led_status();

#define close_led 5
#define open_led 3
#define trig 8 // 초음파센서의 송신부를 8번핀으로 설정합니다.
#define echo 9 // 초음파센서의 수신부를 9번핀으로 설정합니다.

// 적외선 센서 
int pinNum = A1; //아날로그 0번핀 사용
int distance = 0; //거리값 변수 생성
// 초음파 센서
float distance2 = 0; //거리값 변수 생성

Servo servo; 

void setup() {
  servo.attach(7);
  Serial.begin(9600);
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(close_led, OUTPUT);
  pinMode(open_led, OUTPUT);
  pinMode(pinNum, INPUT); //A1번핀을 INPUT으로 설정
  servo.write(95);
  digitalWrite(close_led, LOW);
  digitalWrite(open_led, HIGH);
   while (!Serial) {
    ; // 시리얼 포트가 연결 될 때까지 기다림, 레오나르도 보드의 경우만에만 필요
  }
  
// 이더넷 디바이스 초기화
#if defined __USE_DHCP__ // DHCP 사용 시 (네트워크 정보 DHCP에서 할당받음)
#if defined(WIZ550io_WITH_MACADDRESS) // WIZ550io에 할당된 MAC 주소를 사용할 경우
  Ethernet.begin();
#else
  Ethernet.begin(mac); // MAC이 없는 이더넷 디바이스의 경우
#endif  
#else // Static 주소로 사용 시 (네트워크 정보 사용자가 임의로 지정)
#if defined(WIZ550io_WITH_MACADDRESS) 
  Ethernet.begin(ip, myDns, gateway, subnet);
#else
  Ethernet.begin(mac, ip, myDns, gateway, subnet);
#endif  
#endif 

  // 서버 연결 시작
  server.begin();
  Serial.println(Parking Control System);
  Serial.print(server is at );
  Serial.println(Ethernet.localIP()); // 설정된 IP 시리얼 메세지로 출력
}

void loop() { 
  EthernetClient client = server.available(); // 클라이언트로 부터 받은 Data size를 리턴
  // loop에서 반복문으로 돌면서 클라이언트가 연결될 때 까지 대기
  if (client) { // 클라이언트와 연결되면 1이 된다. (칩 내부적으로 ESTABLISHED 상태가 된다) 그리고 Data Size를 읽는다.
    Serial.println(new client);   
    boolean currentLineIsBlank = true;
    String buffer = ; // 문자열 버퍼 선언
    // 예외처리를 위한 서버의 현재 소켓 상태를 읽는다.
    // LISTEN, CLOSE, FIN_WAIT, CLOSE_WAIT 상태라면 Connection이라 판단하지 않는다.
    while (client.connected()) {
      
      // 적외선
      int data = analogRead(pinNum); //적외선 거리 센서로 부터 측정값을 읽어온다
      int volt = map(data, 0, 1023, 0, 5000); //측정한 volt값을 0에서 5000사이의 값으로 변환
      distance = (21.61/(volt-0.1696))*1000; //측정값을 통해 거리를 계산

      long start = millis();
      digitalWrite(trig, LOW);
      digitalWrite(echo, LOW);
      delayMicroseconds(2);
      digitalWrite(trig, HIGH);
      delayMicroseconds(10);
      digitalWrite(trig, LOW);
          unsigned long duration = pulseIn(echo, HIGH);
    
      distance2 = duration / 29.0 / 2.0;
          
      if (client.available()) { // 
        char c = client.read(); //
        buffer += c;  //
        Serial.write(c); //
        
        if (c == 
 && currentLineIsBlank) { // 
          client.println(HTTP/1.1 200 OK);
          client.println(Content-Type: text/html);
          client.println(Connection: close);
          client.println(Refresh: 5);
          client.println();
          
          // 서버에 지정되어 있는 데이터 클라이언트로 전송
          // client.println(<!DOCTYPE HTML>); // HTML5 사용시
          // HTML 시작
          client.println(<html>);  // HTML 언어로 코드 작성
          client.println(<body>);

          if (distance > 10) {
            client.println(Parking is <font color=blue>Empty</font>);
          } 
          else {
            client.println(Parking is <font color=red>Full</font>);
          }

          client.println(<br />);
          client.println(<br />);

          if(distance2 > 7){
            client.println(<font color=red>There is not a car in front of door !!</font>);
          }
          else if (distance2 < 7) {
            client.println(<font color=green>There is a car in front of door !!.</font>);
          }

          client.println(<br />);
          client.println(<br />);

          if (digitalRead(open_led) == LOW) {   // LED PORT가 1이면 LED ON, 아니면 LED OFF
            client.println(<font color=blue>Door is open</font>); // LED ON
          } 
          else {
            client.println(<font color=red>Door is close</font>); // LED OFF
          }
          client.println(<br />);
          client.println(<FORM method=get action=/parking.htm>);
          client.println(<P> <INPUT type=radio name=status value=1>Door is OPEN);
          client.println(<P> <INPUT type=radio name=status value=0>Door is CLOSE);
          client.println(<P> <INPUT type=submit value=Submit> </FORM>);
          client.println(</body>);
          client.println(</html>);
          /*
          if(distance2 > 20){
            servo.write(0);
            digitalWrite(close_led, LOW);
            digitalWrite(open_led, HIGH);
          }
          else if (distance2 < 20) {
            servo.write(90);
            digitalWrite(close_led, HIGH);
            digitalWrite(open_led, LOW);
          }*/
          // HTML 종료
          break;
        }
        if (c == 
) {        
          currentLineIsBlank = true;
          buffer=;
        }
        // LED ON 
        else if ( c == r) { 
          if(buffer.indexOf(GET /parking.htm?status=1)>=0){
            // HTTP
            client.println(HTTP/1.1 200 OK);
            client.println(Content-Type: text/html);
            client.println();
            // HTML
            client.println(<html>);
            client.println(<body>);
            
            if(distance2 > 20){
              client.println(<font color=red>There is not a car in front of door.</font>);
            }
            else if (distance2 < 20) {
              client.println(<font color=green>There is a car in front of door.</font>);
            }
             
            client.println(<br />);
            client.println(<a href=/parking.htm>Go to control-page</a>); // Main 페이지로 리턴 
            client.println(</body>);
            client.println(</html>);
            servo.write(10);
            digitalWrite(close_led, HIGH);
            digitalWrite(open_led, LOW);
            // HTML DONE
            currentLineIsBlank = false;
            break;
          }

          // LED OFF
          if(buffer.indexOf(GET /parking.htm?status=0)>=0){ // GET /led.cgi?status=0 데이터를 받으면
            // HTTP
            client.println(HTTP/1.1 200 OK);
            client.println(Content-Type: text/html);
            client.println();
            // HTML
            client.println(<html>);
            client.println(<body>);
                
            if(distance2 > 20){
              client.println(<font color=red>There is not a car in front of door.</
														
(!) Nếu có bất kỳ thắc mắc nào cần hỏi vui lòng đặt câu hỏi tại HỏiHay.Net, Cộng đồng Hỏi đáp Hỏi Hay sẽ trả lời bạn.
1,641 lượt xem ^tháng ^ngày, ^năm
admin 2,030 điểm

Please log in or register to Comment this Media.