ผมมีเรื่องรบกวนจะถามครับ คือเกี่ยวกับการเขียนโปรแกรมเพื่อควบคุมกระบวนการปรับค่า พีเอช ของน้ำ
คอนเซ็ปต์ก็ธรรมดา ๆ ครับ วัดค่าพีเอชในน้ำ เพื่อเอามาประมวลผลว่า ควรจะเติมสารเท่าไหร่ยังไง
เช่น วัดค่า 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 ของร้านนั้นที่ซื้อมาด้วยกัน เลยอาจจะถูกแปลงเพื่อตัวพีเอชตัวนี้แล้ว(แต่ก็ไม่น่าจะเกี่ยวเนาะ)
ผมมึนแล้วตอนนี้ รบกวนช่วยด้วยครับ #ด่วนที่สุด !!!
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 ของร้านนั้นที่ซื้อมาด้วยกัน เลยอาจจะถูกแปลงเพื่อตัวพีเอชตัวนี้แล้ว(แต่ก็ไม่น่าจะเกี่ยวเนาะ)
ผมมึนแล้วตอนนี้ รบกวนช่วยด้วยครับ #ด่วนที่สุด !!!