สร้างเครื่องตั้งเวลาต้มมาม่าด้วย PIC

เครื่องตั้งเวลาต้มมาม่า

พอดีว่า ESP8266 ไปไม่รุ่งเท่าไหร่ ปวดหัวเรื่องตัวแปรแบบสุดๆ เลยพักมาต้มมาม่ากินก่อน แล้วไปเปิดโทรทัศน์ดู แต่ปรากฏว่าดันลืม ทิ้งไว้ครึ่งชั่วโมง มาม่าอืดหมดเลย เลยคิดว่าจะทำเครื่องแจ้งเตือนขึ้นมาครับ โดยเครื่องแจ้งเตือนตัวนี้จะต้องเลือกเวลาที่แจ้งเตือนได้ด้วย เผื่อบางคนตั้งการอืดๆ หรือพึ่งมาใช้เครื่องตอนต้มไปแล้ว 1 – 2 นาทีครับ

เครื่องนี้พอทำเสร็จแล้วก็มีปัญหาอาการพอบัสเซอร์ทำงานแล้วรีเซ็ตตัวเองเฉยเลย ปวดหัวอยู่พักนึง เปลี่ยนพอร์ตก็แล้ว อะไรก็แล้ว ยังไม่ได้ เลยไปนอนคิดก่อน พอคิดไว้อาจจะเป็นที่ไฟไม่พอ วันนี้เลยตื่นแต่เช้าเลย มาทดลองเปลี่ยน IC 78L05 เป็น 7805 แล้วก็เหมือนเดิม ทีนี้เลยคิดใหม่ว่าอาจจะเป็นเพราะพอบัสเซอร์ทำงานแล้วไฟมันถูกดึงไปใช้จนไฟไม่พอเลี้ยง MCU มันก็เลนรีเซ็ตตัวเองเริ่มใหม่ทุกครั้งหรือเปล่า เลยใส่ C 100uF คร่อมเข้าไป ใช้งานได้ปกติเลยครับ 🙂

วงจร

วงจรเครื่องตั้งเวลาต้มมาม่าด้วย PIC

สาเหตุที่ผมใช่ PIC เพราะว่าก่อนหน้านี้มีโปรเจค VU มิเตอร์ดิจิตอลแบบหยอดน้ำ แต่ว่าลืมดู ซื้อแบบไม่มี ADC มา 10 กว่าตัว (เบอร์ PIC16F628A) พอเห็นมันทิ้งๆไว้ไม่ได้ใช้งาน เลยเอามาใช้กับโปรเจคนี้ครับ

จากวงจรผมไม่ได้ใส่คริสตอลไว้นะครับ (ผมใช้คริสตอล 4MHz นะครับ) เพราะหาในโปรแกรมไม่เจอ (กำลังหัดใช้ Proteus อยู่ครับ) แล้วก็ในรูปด้านบนตอนออกแบบแผ่นปริ้นไม่ได้ใส่ทรานซิสเตอร์ไว้ขับบัสเซอร์ แต่พอเจอปัญหาก็เลยใส่ไว้ใต้ปริ้นครับ

Coding

ผมใช้ mikroC ในการเขียนนะครับ ก๊อบ – วางโค้ด แล้วเบิร์นก็ใช้งานได้แล้วครับ

// MaMa Time by Max Lab

int TimeS = 0, i, t, Ar = 0;

void OnNumber(int number);

void main() {
  // set port
  TRISA = 0x00;
  TRISB = 0x0C;
  PORTA = 0;
  PORTB = 0x02;
  TimeS = 1;

  while(1){
    while(!PORTB.F3){
      if (PORTB.F2){
        delay_ms(200);
        while(PORTB.F2) ;
        TimeS++;
        if (TimeS > 5)
          TimeS = 1;
        OnNumber(TimeS);
      }
    }
    delay_ms(200);
    while(PORTB.F3) ;
    for (i=TimeS;i>=1;i--){
      for (t=0;t<=59;t++){
        OnNumber(i);
        delay_ms(500);
        OnNumber(i-1);
        delay_ms(500);
      }
    }
    PORTB = 0x10;
    while(!PORTB.F3) ;
    delay_ms(200);
    while(PORTB.F3) ;
    PORTB = 0x02;
    TimeS = 1;
    delay_ms(200);
  }
}

void OnNumber(int number){
  switch(number){
    case 1:
      PORTA = 0;
      PORTB = 0x02;
      break;
    case 2:
      PORTA = 0;
      PORTB = 0x03;
      break;
    case 3:
      PORTA = 0x01;
      PORTB = 0x03;
      break;
    case 4:
      PORTA = 0x09;
      PORTB = 0x03;
      break;
    case 5:
      PORTA = 0x0D;
      PORTB = 0x03;
      break;
    default:
      PORTA = 0x00;
      PORTB = 0x00;
      break;
  }
}

ผมคิดว่าใน mikroC น่าจะไม่มีคำสั่งพวกดึงเวลาตั้งแต่เปิดมาจนถึงตอนนี้ว่าผ่านไปนานเท่าไหร่แล้ว ทีแรกเลยว่าจะใช้การอินเตอร์รัพท์เข้ามาใช้ แต่พออ่านตามหนังสือแล้วไม่เข้าใจ พิมพ์โค้ดตามหนังสือก็รันแล้วไม่ได้ผลตามที่หนังสือบอก เลยใช้การวนลูปธรรมดาๆนี่ละครับ เท่าที่ลองทดสอบ เวลาเคลื่อนไปประมาณ 3 – 6 วินาทีครับ อยู่ในช่วงที่ค่อนข้างรับได้
ในฟังก์ชั่น OnNumber() ผมใช้ switch case เพราะใช้เปรียบเทียบตัวแปรเดียว การใช้ if หากต้องการแก้ชื่อตัวแปรจะทำให้ต้องแก้ไปทุก if แล้ว if ก็ค่อนข้างที่ยาวและดูยุ่งยากกว่าด้วยครับ

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *