pH Probe กับ UART รบกวนด้วยครับ

ผมมีเรื่องรบกวนจะถามครับ คือเกี่ยวกับการเขียนโปรแกรมเพื่อควบคุมกระบวนการปรับค่า พีเอช ของน้ำ
คอนเซ็ปต์ก็ธรรมดา ๆ ครับ วัดค่าพีเอชในน้ำ เพื่อเอามาประมวลผลว่า ควรจะเติมสารเท่าไหร่ยังไง
เช่น วัดค่า pH = 2 ซึ่งเป็นกรด ก็จะทำการเติมสารที่เป็นเบสให้น้ำเพื่อให้มีค่าเป็นกลาง อยุ่ระหว่าง 6.5-8.5
โดยการเปิดโซลินอยวาว เป็นเวลา ... วินาที อะไรทำนองนั้นครับ

แต่ประเด็นคือ pH Probe ที่ผมใช้วัดสัญญาณที่มันออกมาจาก
นี่ตัว pH ครับ http://www.atlas-scientific.com/product_pages/probes/ph_probe.html
pH probe นี้อ่ะ มีค่าอ่อนมาก ซึ่งเค้าก็มีโมดูลคู่มาให้ครับ ตัวนี้ครับ http://www.atlas-scientific.com/product_pages/circuits/ezo_ph.html
Data sheet ของโพรบก็บอกเอาไว้ว่า ไม่สามารถวัดค่าได้ด้วย Meter หรือ การต่อ A/D Converter
จะต้องใช้โมดูลนี้ส่ง Data เข้าพอต Tx Rx ของ Controller ซึ่งผมใช้ PIC887 (บ้าจริง น่าจะเลือก Arduino แต่แรกตอนนี้เปลี่ยนไม่ทันแล้ว)
โดยการใช้ UART ครับ ตอนแรก ผมก็เอาเอาต์พุตจากโมดูลนี้ ไปผ่านซีเรียลพอต เพื่ออ่านคือผ่านโปรแกรม Terminal ในคอมพิวเตอร์ครับ
ก็เซ็ต Buad Rate ไปเรื่อยครับ(ตอนแรกไม่รู้อะไรเลย มึนมาก) เจอภาษาต่างดาวมากมาย จนเจอ Buad Rate ที่ 38400 ครับ อ่านค่าออกมา(เกือบ)เป๊ะ
ตามค่า pH Buffer เช่น จุ่มโพรบลงในบัฟเฟอร์ 4.00 ก็อ่านได้ 3.78  3. 80 อะไรแบบนี้ครับ

โอเคตอนนี้ได้ค่าที่ต้องการมาแล้ว ไหนลอง UART จาก PIC887 บ้างสิ ผมก็ต่อ TX RX ของโมดูลเข้ากับ RX TX ของ PIC887 แล้วเขียนโปรแกรม
ทำการ Initial UART และ LCD ตามสเต็ปเด็กน้อยครับ ผมก็ลอง Print "Hello world" ออก LCD ดูก่อน เพื่อให้มั่นใจว่า เราไม่ได้ต่อ LCD ผิดน้าาาา..

พอ LCD โอเค ผมก็เริ่มเขียน UART โดยปรับค่า รีจิสเตอร์ เพื่อเซ็ต TX RX Buad Rate เป็นค่าที่ผมใช้ครับ ดังนี้...

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <pic.h>    // Include header file for MCU
#define _XTAL_FREQ    20000000    // Define Frequency 20.0 MHz for function __delay_ms
__CONFIG(HS & WDTDIS & LVPDIS);    // Config. High speed clock,Disable watchdog and Disable LVP
#include <lcd887.h>    // Include Library for LCD display
void Delay_ms(unsigned int tick)
{
     while(tick--)    // Loop counter delay time
     {
      __delay_ms(1);    // Delay 1 ms
     }    
}
void usart_init()
{
    // Set Tx
    SYNC = 0; // Asynchronous Mode
    BRGH = 1; // Hight Buad Rate
    TX9 = 0 ;    // Set 8 data bit transmitter
    TXEN = 1;    // Enable transmittion
    // Set Rx
    RX9 = 0 ;    // Set 8 data bit Reciever
    CREN = 1;    // Enable reciption
    SPEN = 1;    // Enable USART transmition/reciption
    // Set Buad Rate
    BRG16 = 1; // Buad Rate = 16 bit

    SPBRG = 0x81; // X = 129 or 0B10000001
    SPBRGH = 0x02; // High Buad Rate
}

void usart_putc(char c)
{
    while(!TRMT);    // Wait transmition ready
    TXREG = c;        // Send byte
}
void usart_puts(char *s)
{
    while(*s)    // Loop for send string
    {
        usart_putc(*s++);    // Send byte from string
    }
}
unsigned char usart_getc()
{
    while(!RCIF);    // Wait data reciption
    return(RCREG);    // Return data
}
//---------------------------------------------------------------------
void main()
{
    lcd_init();        // Initial LCD    
    char pH;    //
    usart_init();    // Initial USART
    while(1)    // Infinite loop
    {

        pH = usart_getc();    // Get Data to pH
        lcd_puts(0x82,"pH = "); // Print "pH = "
        inttolcd(0x88,pH); // Print pH value
    }
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////

ซึ่งค่าที่ออกมาจาก LCD มันไม่ใช่ค่า pH สิครับ มันเป็นตัวเลขอะไรก็ไม่รู้ เช่น 120 234 12 233  255 ..  ตอนแรกผมก็คิดว่า อ๋อ 0-255 ก็เราใช้ 8 bit นี่เนอะ 2 ยกกำลัง 8 ก็ได้เท่านี้แหละ เข้าสูตรแปลงกลับก็ได้แล้ว แต่แล้ว!!! ผมก็ต้องผงะ 5555+ เมื่อเจอเลข 560 924 740 โผล่มาแจมด้วย ทีนี้ผมก็มึนเลย ก็ลองกลับไปอ่านหนังสือดูว่า เอ๊ เราเซ็ตอะไรผิดรึป่าว หรือ เลขที่ออกจากโปรแกรม Terminal อะ เพราะมันผ่านจากตัว Module UART ของร้านนั้นที่ซื้อมาด้วยกัน เลยอาจจะถูกแปลงเพื่อตัวพีเอชตัวนี้แล้ว(แต่ก็ไม่น่าจะเกี่ยวเนาะ)

ผมมึนแล้วตอนนี้ รบกวนช่วยด้วยครับ #ด่วนที่สุด !!!
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่