สอบถามพี่ๆหน่อยครับเกี่ยวกับวัดค่า EC sensor

  • 9 Replies
  • 1488 Views
พอดีผมจะทำโปรเจค ปลูกผักไฮโดรและได้Sensor วัดค่า EC มาแล้ว โดยใช้ PIC16F877A

ผมอยากทราบ ถ้าผมจะดึงค่าตัว Sensor ตัวนี้ออกมา ผมต้องเขียนยังไงบ้างครับ

อันนี้เป็น Sensor ที่ผมใช้ คือเค้าต้องเอาเปรียบเทียบกับอุณหภูมิใช่มั้ยครับ

https://www.dfrobot.com/wiki/index.php/Analog_EC_Meter_SKU:DFR0300

ศึกษา ADC conversion + DS1820 interface แล้วประยุกต์ได้เลยครับ ค่าที่วัดต้องชดเชยผลจากอุณภูมิด้วยครับ

ที่ต้องวัด Temp ด้วยเพราะว่า ค่าที่ได้ มีการเปลี่ยนแปลงตาม Temp เลยต้องวัดเพื่อลดเชยในการวัดด้วยครับ

ศึกษา ADC conversion + DS1820 interface แล้วประยุกต์ได้เลยครับ ค่าที่วัดต้องชดเชยผลจากอุณภูมิด้วยครับ
ก็คือ ถ้าผม เขียน อ่านค่า ADC ออกมาได้แล้วเช่น

Ds18B20_temp; /// คือTemp ของDS ที่ผมเขียนวัดได้แล้ว

float EC;
float Temp;

EC=Read_ADC; //อ่านค่า Analog ของเซนเซอร์

float Temp=1.0+0.0185*(Ds18B20_temp(แทนด้วยเซนเซอร์วัดของเรา)-25.0); 

แค่นี้คือได้แล้วใช่มั้ยครับ เพราะว่าค่าที่วัดได้มันได้เท่าปากกาวัด EC เลยอ่าครับ





ค่าที่ได้ผมออกมาตามนี้ไม่รู้มันถูกรึป่าว แถม ค่าที่วัดจากเซนเซอร์มันแกว่งยุ2ค่าครับ 284.02กับ325.37ประมาณนี้ครับ

ช่วยดูให้หน่อยครับว่าโค้ดผมถูกมั้ยครับ
#include <16F887.h>
#device adc=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#use delay(clock=8000000)
#include <lcd.c>
#include <touch.c> // Read 1 wire

BYTE ReadTemp_DS18B20(void)
{
   BYTE i, buffer[9];
   BYTE temp,sign;

   if (touch_present())
   {
      touch_write_byte(0xCC);
      touch_write_byte (0x44);
      delay_ms(100);
      touch_present();
      touch_write_byte(0xCC);
      touch_write_byte (0xBE);

      for(i=0; i<9;i++)
      buffer = touch_read_byte();

  } 
    temp = (buffer[1]<<4)|(buffer[0]>>4);
    if(buffer[1]&0xF0) temp=(-1)*temp;
   
    return(temp);

}

void main(void)
{
   BYTE DS18B20_temp;
   
   SETUP_ADC(ADC_CLOCK_INTERNAL|ADC_CLOCK_DIV_8);
   SETUP_ADC_PORTS(sAN0|VSS_VDD);
   float averageVoltage;
   float CoefficientVolatge;
   float ECcurrent;
   float TempCoefficient;
   float ECcurrent1;
   
   lcd_init();
   

   while(TRUE)
   {
     
    DS18B20_temp=ReadTemp_DS18B20();
    SET_ADC_CHANNEL(0);
    averageVoltage=READ_ADC();
    averageVoltage=(float)5000/1024*averageVoltage;
    TempCoefficient=(float)1.0+0.0185*(DS18B20_temp-25.0);
    CoefficientVolatge=(float)averageVoltage/TempCoefficient;
    ECcurrent=(float)CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge+CoefficientVolatge/10;


     
       lcd_putc("\f");
        lcd_gotoxy(3,1);
       printf(lcd_putc,"Temp :%d %cC",DS18B20_temp,0xDF);
     
     
      lcd_gotoxy(3,2);
       printf(lcd_putc,"EC :%f  ",  ECcurrent);
         delay_ms(1000);
     
     
     
 
      }

   }




adc V-ref ต่อกับ 5V แล้วใช่ไหมครับ บอร์ดสำเร็จหรือทำเองครับ เป็นไปได้ print ค่า ADC ออกมาดูครับ ว่าเฉพาะ adc read แกว่งไหม ถ้าแกว่ง อาจต้องดู vcc กับ vref ว่าแรงดันนิ่งไหม มีสัญญาณรบกวนหรือเปล่า แล้วคงต้องอ่าน adc หลายๆครั้งและหาค่าเฉลี่ยที่อ่านได้แล้วค่อยเอามาคำนวณจะทำให้นิ่งขึ้นครับ
Original เขา มีบรรทัดนี้อยู่ครับ

 // calculate the average:
    AnalogAverage = AnalogValueTotal / numReadings;

adc V-ref ต่อกับ 5V แล้วใช่ไหมครับ บอร์ดสำเร็จหรือทำเองครับ เป็นไปได้ print ค่า ADC ออกมาดูครับ ว่าเฉพาะ adc read แกว่งไหม ถ้าแกว่ง อาจต้องดู vcc กับ vref ว่าแรงดันนิ่งไหม มีสัญญาณรบกวนหรือเปล่า แล้วคงต้องอ่าน adc หลายๆครั้งและหาค่าเฉลี่ยที่อ่านได้แล้วค่อยเอามาคำนวณจะทำให้นิ่งขึ้นครับ
Original เขา มีบรรทัดนี้อยู่ครับ

 // calculate the average:
    AnalogAverage = AnalogValueTotal / numReadings;

เป็นบอร์ดสำเร็จครับผม ต่อเข้ากับแหล่งจ่ายคอนโทรลเลอร์5V ตอนอ่านADC ธรรมดามีแกว่งอยู่ครับผม
คำนวนตรงนี้คือ Analog รวมทั้งหมดเค้าหมายถึง 1023 ใช่มั้ยครับแล้วนำมาหารกับ ADC ที่อ่านได้

ไม่ใช่ครับ ลองวัดทั้งหมดหลายๆรอบ แยกใส่ array เช่นอ่านทั้งหมด 5 รอบ เอาค่าที่ได้ทั้งหมดมาบวกกันแล้วหารด้วย 5 เป็นต้นครับ  :)