วันศุกร์ที่ 8 กุมภาพันธ์ พ.ศ. 2562

ส่วนประกอบงานวิชา เขียนโปรแกรม ตัวอย่างงานที่ 15

ส่วนประกอบงานวิชา  เขียนโปรแกรม ตัวอย่างงานที่ 15

ใบรายงานผลการปฏิบัติงาน


รูปที่ 5 การติดตั้งใช้งานจริง

โครงงานเครื่องนับจำนวนรถยนต์

เนื่องจากปัจจุบันมีการใช้รถยนต์ส่วนบุคคลเป็นจำนวนมากในการเดินทางไปในสถานที่ต่างๆ เช่น ห้างสรรพสินค้า สถานที่ท่องเที่ยว เป็นต้น ทำให้เกิดปัญหาในการหาสถานที่จอดรถซึ่งผู้ขับขี่รถยนต์ไม่สามารถทราบได้ว่าสถานที่จอดรถที่นั้นมีรถเต็มแล้วหรือไม่ ซึ่งจะทำให้เกิดปัญหาการจราจรติดขัดบริเวณทางเข้า– ออกลานจอดรถ และเป็นผลให้สิ้นเปลืองเชื้อเพลิงโดยไม่จำเป็น
ดังนั้น เพื่อไม่ให้ผู้ขับขี่รถเสียเวลาในการวนหาที่จอดรถ จึงได้ทำการออกแบบเครื่องจำลองการนับจานวนรถ เข้า – ออก ที่มีต้นทุนการผลิตต่ำสามารถทำงานได้อย่างมีประสิทธิภาพ และสามารถดูข้อมูลการนับจำนวนรถที่เข้ามาจอดในลานจอดรถผ่านทางจอแสดงผล LCD เพื่อสามารถนำไปประยุกต์ใช้งานในสถานที่จอดรถจริง โดยสามารถแสดงข้อมูลจานวนรถที่อยู่ในสถานที่จอดรถ ทำให้ผู้ที่ใช้บริการลานจอดรถสามารถรับรู้ปริมาณจำนวนรถภายในลานจอดรถได้และนำข้อมูลการใช้บริการอยู่มาเก็บสถิติการใช้บริการจอดรถ

คุณสมบัติการทำงานของเครื่องนับจำนวนรถยนต์

  1. สามารถนับรถยนต์เข้า-ออกได้
  2. สามารถเพิ่มจำนวนรถยนต์สูงสุดในโรงรถได้
  3. มีการบอกสถานะว่าที่จอดรถยนต์เต็มหรือไม่เต็ม
  4.  มีหน้าจอแสดงข้อมูลจานวนรถยนต์และสถานะที่จอดรถยนต์

การต่อวงจรสำหรับวงจรเครื่องนับจำนวนรถยนต์

รูปที่ 1 วงจรเครื่องนับจำนวนรถยนต์
รูปที่ 1 วงจรเครื่องนับจำนวนรถยนต์

ส่วนประกอบของวงจร

ประกอบไปด้วย
  1. บอร์ด STM32F4
  2. ชุดเปรียบเทียบแรงดัน R-OPAMP
  3. สวิตซ์กดติด-ปล่อยดับ
  4. โฟโตทรานซิสเตอร์และหลอดอินฟาเรด
การต่อการใช้งานของวงจรจะประกอบไปด้วยชุดเซนเซอร์ 2 ชุด โดยแต่ละชุดจะต่อ Output เข้าบอร์ด STM32F4 ขา PA2และ PA3 ตามลำดับ และต่อชุดสวิตซ์ Up – Down โดยขาของสวิตซ์ขาหนึ่งจะต่อกับไฟตรง 3V และอีกข้างต่อกับบอร์ด STM32F4 ขา PC3 และ PA4 ตามลำดับและ จอ LCD การต่อเข้าบอร์ด STM32F4 จะต่อตามรูปที่ 1

โปรแกรม Simulink ของเครื่องนับจำนวนรถยนต์

รูปที่ 2 โปรแกรม Simulink ของเครื่องนับจานวนรถยนต์
รูปที่ 2 โปรแกรม Simulink ของเครื่องนับจำนวนรถยนต์
การเขียนโปรแกรมจะเป็นการรับค่าจากเซนเซอร์ 2 ชุดโดยชุดแรกรับเข้าขา PA2 และอีกชุดเข้าขา PA3 โดยรับเป็นสัญญาณ Digital เพื่อรับค่า 0 และ 1 เข้ามาใน Chart ของ Stateflow เพื่อมาเข้าเงื่อนไขการนับรถเข้า – ออก โดยเมื่อรถเข้าจะส่งสัญญาณ Digital เป็น 1 ออก out และเมื่อรถออก out2 จะเป็น 1 เพื่อส่งไปยังบล๊อก Function3 เพื่อเข้าเงื่อนไขการนับจานวนรถยนต์
ต่อมาส่วนของการเพิ่มจานวนรถสูงสุดจะเป็นการกดสวิตซ์ Up – Down โดยสัญญาณการกดสวิตซ์สองตัวโดยจะส่งเข้าขา PC3 เป็น Up และขา PA4 เป็น Down โดยสัญญาณส่งออกมาเป็น Digital เนื่องจากเป็นการเปิด-ปิดสวิตซ์เมื่อการสวิตซ์แล้วสัญญาณจะถูกส่งเข้าบล๊อก Function1 เพื่อเข้าเงื่อนไขการนับโดยสัญญาณ Out ของ Function1 จะถูกส่งไปเก็บค่าในตัวแปร cn2 เพื่อส่งค่าสัญญาณไปยังบล๊อก Function3 เพื่อเข้าเงื่อนไขการตรวจสอบสถานะการเต็มของจำนวนรถยนต์ระหว่างค่าจำนวนรถยนต์เข้า-ออกและจำนวนรถยนต์สูงสุด เพื่อส่งสัญญาณให้บล๊อก Switch ทำงานเมื่อมีค่าสัญญาณ 1 เข้ามา เมื่อมีค่าสัญญาณ 1 เข้ามาในบล๊อก Switch จะทำให้เกิดการเปลี่ยนทางการทำงานโดยเมื่อรถยนต์เต็ม บล๊อก Function3 จะส่งค่า 1 ออกมาเพื่อให้ Switch ทำงานเพื่อโชว์สถานะโรงรถยนต์ “FULL” บนจอ LCD แต่ถ้าในโรงรถยนต์ยังมีที่ว่าง บล๊อก Function3 จะส่งค่า 0 ออกมา Switch จะไม่ทำงานสถานะโรงรถยนต์ “NOT FULL” บนจอ LCD โดยบนจอ LCD ในบรรทัดที่ 1 จะโชว์ค่าจำนวนรถยนต์สูงสุด “MAX CAR : . . . . . ” และในบรรทักที่ 2 จะโชว์ค่าจำนวนรถยนต์เข้า – ออก “CAR : . . . . . ” และบรรทัดที่ 3 จะโชว์สถานะของโรงรถยนต์

การเขียนโค้ด M-File

โค้ดในบล็อก Function1

Proj15_003

โค้ดในบล๊อก Function3

Proj15_004

ส่วนประกอบงานวิชา เขียนโปรแกรม ตัวอย่างงานที่ 14

ส่วนประกอบงานวิชา  เขียนโปรแกรม ตัวอย่างงานที่ 14

ใบรายงานผลการปฏิบัติงาน

 ARDUINO PLANT WATERING SYSTEM



Software


#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

char auth[] = "YourAuthToken";
char ssid[] = "YourNetworkName";
char pass[] = "YourPassword";

WidgetLED standbyLed(V4);
WidgetLED workingLed(V5);

//Stepper motor pins
#define step1 14 //D5
#define step2 12 //D6
#define step3 13 //D7
#define step4 15 //D8
//Pump pin
#define pump 5 //D9
//Limit switch
#define limitSwitch 4 //D10

int steps = 0 ;
int direction = 0 ;
int totalStaps = 0 ;
int stepsCount = 0 ;

//Data from Blynk App
int onOffTimer = 0 ;
int test = 0 ;
int timerState1 = 0 ;
int timerState2 = 0 ;
int pumpPower = 0 ;
int distance = 0 ;
int instantWatering = 0 ;
int limitSwitchState = 0 ;


void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  //Stepper motor
  pinMode(step1, OUTPUT);
  pinMode(step2, OUTPUT);
  pinMode(step3, OUTPUT);
  pinMode(step4, OUTPUT);
  //Pump
  pinMode(pump, OUTPUT);
  //Limit switch
  pinMode(limitSwitch, INPUT);
  stopMotor();
}

void loop()
{
  Blynk.run();
  stepCalculate(distance) ;
  if (onOffTimer == 1){ //Turn on timer
    if (timerState1 == 1 || timerState2 == 1){ //Time to watering
      standbyLed.off();
      workingLed.on();
      analogWrite(pump, pumpPower);
      goWork(totalStaps);
      analogWrite(pump, 0);
      backHome();
      standbyLed.on();
      workingLed.off();

    }
  }
  if (instantWatering == 1){ //Press instantwatering button
    standbyLed.off();
    workingLed.on();
    analogWrite(pump, pumpPower);
    goWork(totalStaps);
    analogWrite(pump, 0);
    backHome();
    standbyLed.on();
    workingLed.off();
  }
  if (test == 1){ // Press test button
    standbyLed.off();
    workingLed.on();
    goWork(totalStaps);
    backHome();
    standbyLed.on();
    workingLed.off();
  }
}

BLYNK_WRITE(V0) {
  onOffTimer = param.asInt();
}
BLYNK_WRITE(V1) {
  test = param.asInt();
}
BLYNK_WRITE(V2) {
  timerState1 = param.asInt();
}
BLYNK_WRITE(V3) {
  timerState2 = param.asInt();
}
BLYNK_WRITE(V6) {
  pumpPower = param.asInt();
}
BLYNK_WRITE(V7) {
  distance = param.asInt();
}
BLYNK_WRITE(V8) {
  instantWatering = param.asInt();
}

void stepCalculate(int distance){
  totalStaps = (distance*(4076/4)) ;
}

void backHome(){
  limitSwitchState = digitalRead(limitSwitch);
  while(limitSwitchState == 0){
    stepper(0) ;
    delay(1);
    limitSwitchState = digitalRead(limitSwitch);
  }
  stopMotor() ;
  limitSwitchState = digitalRead(limitSwitch);
}

void goWork(int totalStaps){
  while(stepsCount < totalStaps){
    stepper(1);
    delay(1);
    stepsCount ++ ;
  }
  stopMotor() ;
  stepsCount = 0 ;
}

void stepper(int direction){
  for (int x=0; x<1; x++){
    Blynk.run();
    switch(steps){
      case 0:
      digitalWrite(step1, LOW);
      digitalWrite(step2, LOW);
      digitalWrite(step3, LOW);
      digitalWrite(step4, HIGH);
      break;
      case 1:
      digitalWrite(step1, LOW);
      digitalWrite(step2, LOW);
      digitalWrite(step3, HIGH);
      digitalWrite(step4, HIGH);
      break;
      case 2:
      digitalWrite(step1, LOW);
      digitalWrite(step2, LOW);
      digitalWrite(step3, HIGH);
      digitalWrite(step4, LOW);
      break;
      case 3:
      digitalWrite(step1, LOW);
      digitalWrite(step2, HIGH);
      digitalWrite(step3, HIGH);
      digitalWrite(step4, LOW);
      break;
      case 4:
      digitalWrite(step1, LOW);
      digitalWrite(step2, HIGH);
      digitalWrite(step3, LOW);
      digitalWrite(step4, LOW);
      break;
      case 5:
      digitalWrite(step1, HIGH);
      digitalWrite(step2, HIGH);
      digitalWrite(step3, LOW);
      digitalWrite(step4, LOW);
      break;
      case 6:
      digitalWrite(step1, HIGH);
      digitalWrite(step2, LOW);
      digitalWrite(step3, LOW);
      digitalWrite(step4, LOW);
      break;
      case 7:
      digitalWrite(step1, HIGH);
      digitalWrite(step2, LOW);
      digitalWrite(step3, LOW);
      digitalWrite(step4, HIGH);
      break;
      default:
      digitalWrite(step1, LOW);
      digitalWrite(step2, LOW);
      digitalWrite(step3, LOW);
      digitalWrite(step4, LOW);
      break;
    }
    if(direction == 0){
      steps++ ;
    }
    if(direction == 1){
      steps-- ;
    }
    if(steps > 7){
      steps = 0 ;
    }
    if(steps < 0){
      steps = 7 ;
    }
  }
}

void stopMotor(){
  digitalWrite(step1, LOW);
  digitalWrite(step2, LOW);
  digitalWrite(step3, LOW);
  digitalWrite(step4, LOW);
}

ส่วนประกอบงานวิชา เขียนโปรแกรม ตัวอย่างงานที่ 13

ส่วนประกอบงานวิชา  เขียนโปรแกรม ตัวอย่างงานที่ 13

ใบรายงานผลการปฏิบัติงาน

หุ่นยนต์เดินตาม เปลวไฟ Fire Extinguisher


SOFTWARE

// Motor A pins (enableA = enable motor, pinA1 = forward, pinA2 = backward)
int enableA = 3;
int pinA1 = 6;
int pinA2 = 7;
 
//Motor B pins (enabledB = enable motor, pinB2 = forward, pinB2 = backward)
int enableB = 5;
int pinB1 = 8;
int pinB2 = 9;
 
int sensor[5] = {0, 0, 0, 0, 0};
 
void setup()
{
  pinMode(enableA, OUTPUT);
  pinMode(pinA1, OUTPUT);
  pinMode(pinA2, OUTPUT);
 
  pinMode(enableB, OUTPUT);
  pinMode(pinB1, OUTPUT);
  pinMode(pinB2, OUTPUT);
 
  enableMotors();
  analogWrite(enableA, 120);  // ปรับค่าความเร็วของหุ่นยนต์
  analogWrite(enableB, 120);  // ปรับค่าความเร็วของหุ่นยนต์
 
  delay(2000);
 
}
 
void loop()
{
 
 
 
  sensor[0] = analogRead(A1);
  sensor[1] = analogRead(A2);
  sensor[2] = analogRead(A3);
  sensor[3] = analogRead(A4);
  sensor[4] = analogRead(A5);
 
  if ((sensor[0] > sensor[1]) && (sensor[0] > sensor[2]) && (sensor[0] > sensor[3]) && (sensor[0] > sensor[4]))
    turnLeft(200);
  else if ((sensor[1] > sensor[0]) && (sensor[1] > sensor[2]) && (sensor[1] > sensor[3]) && (sensor[1] > sensor[4]))
    turnLeft(100);
  else if ((sensor[2] > sensor[0]) && (sensor[2] > sensor[1]) && (sensor[2] > sensor[3]) && (sensor[2] > sensor[4]))
    forward(1);
  else if ((sensor[3] > sensor[0]) && (sensor[3] > sensor[1]) && (sensor[3] > sensor[2]) && (sensor[3] > sensor[4]))
    turnRight(100);
  else if ((sensor[4] > sensor[0]) && (sensor[4] > sensor[1]) && (sensor[4] > sensor[2]) && (sensor[4] > sensor[3]))
    turnRight(200);
 
  else
    coast(100);
}
 
//Define high-level H-bridge commands
 
void enableMotors()
{
  motorAOn();
  motorBOn();
}
 
void disableMotors()
{
  motorAOff();
  motorBOff();
}
 
void forward(int time)
{
  motorAForward();
  motorBForward();
  delay(time);
}
 
void backward(int time)
{
  motorABackward();
  motorBBackward();
  delay(time);
}
 
void turnLeft(int time)
{
  motorABackward();
  motorBForward();
  delay(time);
}
 
void turnRight(int time)
{
  motorAForward();
  motorBBackward();
  delay(time);
}
 
void coast(int time)
{
  motorACoast();
  motorBCoast();
  delay(time);
}
 
void brake(int time)
{
  motorABrake();
  motorBBrake();
  delay(time);
}
//Define low-level H-bridge commands
 
//enable motors
void motorAOn()
{
  digitalWrite(enableA, HIGH);
}
 
void motorBOn()
{
  digitalWrite(enableB, HIGH);
}
 
//disable motors
void motorAOff()
{
  digitalWrite(enableB, LOW);
}
 
void motorBOff()
{
  digitalWrite(enableA, LOW);
}
 
//motor A controls
void motorAForward()
{
  digitalWrite(pinA1, HIGH);
  digitalWrite(pinA2, LOW);
}
 
void motorABackward()
{
  digitalWrite(pinA1, LOW);
  digitalWrite(pinA2, HIGH);
}
 
//motor B controls
void motorBForward()
{
  digitalWrite(pinB1, HIGH);
  digitalWrite(pinB2, LOW);
}
 
void motorBBackward()
{
  digitalWrite(pinB1, LOW);
  digitalWrite(pinB2, HIGH);
}
 
//coasting and braking
void motorACoast()
{
  digitalWrite(pinA1, LOW);
  digitalWrite(pinA2, LOW);
}
 
void motorABrake()
{
  digitalWrite(pinA1, HIGH);
  digitalWrite(pinA2, HIGH);
}
 
void motorBCoast()
{
  digitalWrite(pinB1, LOW);
  digitalWrite(pinB2, LOW);
}
 
void motorBBrake()
{
  digitalWrite(pinB1, HIGH);
  digitalWrite(pinB2, HIGH);
}