Electoday 4.0

ไมโครคอนโทรลเลอร์ => Microchip PIC => Topic started by: NarisPCBAssembly on April 30, 2017, 07:36:55 pm

Title: สอบถามพี่ๆหน่อยครับเกี่ยวกับวัดค่า EC sensor
Post by: NarisPCBAssembly on April 30, 2017, 07:36:55 pm
พอดีผมจะทำโปรเจค ปลูกผักไฮโดรและได้Sensor วัดค่า EC มาแล้ว โดยใช้ PIC16F877A

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

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

https://www.dfrobot.com/wiki/index.php/Analog_EC_Meter_SKU:DFR0300
Title: Re: สอบถามพี่ๆหน่อยครับเกี่ยวกับวัดค่า EC sensor
Post by: avr_lover on May 02, 2017, 08:42:32 am
ศึกษา ADC conversion + DS1820 interface แล้วประยุกต์ได้เลยครับ ค่าที่วัดต้องชดเชยผลจากอุณภูมิด้วยครับ
Title: Re: สอบถามพี่ๆหน่อยครับเกี่ยวกับวัดค่า EC sensor
Post by: chobui7 on May 06, 2017, 08:35:38 am
ที่ต้องวัด Temp ด้วยเพราะว่า ค่าที่ได้ มีการเปลี่ยนแปลงตาม Temp เลยต้องวัดเพื่อลดเชยในการวัดด้วยครับ
Title: Re: สอบถามพี่ๆหน่อยครับเกี่ยวกับวัดค่า EC sensor
Post by: NarisPCBAssembly on May 11, 2017, 12:08:15 am
ศึกษา 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 เลยอ่าครับ


Title: Re: สอบถามพี่ๆหน่อยครับเกี่ยวกับวัดค่า EC sensor
Post by: NarisPCBAssembly on May 11, 2017, 04:51:47 am
(https://scontent.fbkk2-3.fna.fbcdn.net/v/t34.0-12/18448133_869895613148642_274853536_n.jpg?oh=635a1aa349da1b619e4f6a2f9f6666a3&oe=591607AC)
(https://scontent.fbkk2-3.fna.fbcdn.net/v/t34.0-12/18387105_869895626481974_1588223178_n.jpg?oh=6b19dd22ad71b7131f709eb68267f679&oe=59161495)
ค่าที่ได้ผมออกมาตามนี้ไม่รู้มันถูกรึป่าว แถม ค่าที่วัดจากเซนเซอร์มันแกว่งยุ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);
     
     
     
 
      }

   }



Title: Re: สอบถามพี่ๆหน่อยครับเกี่ยวกับวัดค่า EC sensor
Post by: avr_lover on May 11, 2017, 08:01:13 am
adc V-ref ต่อกับ 5V แล้วใช่ไหมครับ บอร์ดสำเร็จหรือทำเองครับ เป็นไปได้ print ค่า ADC ออกมาดูครับ ว่าเฉพาะ adc read แกว่งไหม ถ้าแกว่ง อาจต้องดู vcc กับ vref ว่าแรงดันนิ่งไหม มีสัญญาณรบกวนหรือเปล่า แล้วคงต้องอ่าน adc หลายๆครั้งและหาค่าเฉลี่ยที่อ่านได้แล้วค่อยเอามาคำนวณจะทำให้นิ่งขึ้นครับ
Original เขา มีบรรทัดนี้อยู่ครับ

 // calculate the average:
    AnalogAverage = AnalogValueTotal / numReadings;
Title: Re: สอบถามพี่ๆหน่อยครับเกี่ยวกับวัดค่า EC sensor
Post by: NarisPCBAssembly on May 11, 2017, 08:20:50 am
adc V-ref ต่อกับ 5V แล้วใช่ไหมครับ บอร์ดสำเร็จหรือทำเองครับ เป็นไปได้ print ค่า ADC ออกมาดูครับ ว่าเฉพาะ adc read แกว่งไหม ถ้าแกว่ง อาจต้องดู vcc กับ vref ว่าแรงดันนิ่งไหม มีสัญญาณรบกวนหรือเปล่า แล้วคงต้องอ่าน adc หลายๆครั้งและหาค่าเฉลี่ยที่อ่านได้แล้วค่อยเอามาคำนวณจะทำให้นิ่งขึ้นครับ
Original เขา มีบรรทัดนี้อยู่ครับ

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

เป็นบอร์ดสำเร็จครับผม ต่อเข้ากับแหล่งจ่ายคอนโทรลเลอร์5V ตอนอ่านADC ธรรมดามีแกว่งอยู่ครับผม
คำนวนตรงนี้คือ Analog รวมทั้งหมดเค้าหมายถึง 1023 ใช่มั้ยครับแล้วนำมาหารกับ ADC ที่อ่านได้
Title: Re: สอบถามพี่ๆหน่อยครับเกี่ยวกับวัดค่า EC sensor
Post by: avr_lover on May 12, 2017, 08:15:03 am
ไม่ใช่ครับ ลองวัดทั้งหมดหลายๆรอบ แยกใส่ array เช่นอ่านทั้งหมด 5 รอบ เอาค่าที่ได้ทั้งหมดมาบวกกันแล้วหารด้วย 5 เป็นต้นครับ  :)
Title: Re: สอบถามพี่ๆหน่อยครับเกี่ยวกับวัดค่า EC sensor
Post by: NarisPCBAssembly on May 12, 2017, 02:39:42 pm
ไม่ใช่ครับ ลองวัดทั้งหมดหลายๆรอบ แยกใส่ array เช่นอ่านทั้งหมด 5 รอบ เอาค่าที่ได้ทั้งหมดมาบวกกันแล้วหารด้วย 5 เป็นต้นครับ  :)
ได้แล้วครับ แต่ค่าก็ยังมีคลาดเคลื่อนอยู่แต่อยู่ในระดับที่รับได้ครับ มีคำถามอีกครับผม อันนี้ไม่รู้เลย ถ้า ผมต้องการเขียนปุ่มกดมาเซ็ตค่าเป็นเอาไปคุมการผสมนี้ก็ เขียน ยังไงอ่ะครับ ถ้าฟิกค่าแล้วไปคุมได้นะ แต่ อยากให้มันเซตได้อ่าครับ ขอบคุณครับ
Title: Re: สอบถามพี่ๆหน่อยครับเกี่ยวกับวัดค่า EC sensor
Post by: avr_lover on May 15, 2017, 08:20:12 am
define ตัวแปรที่เก็บใน flash ขึ้นมาครับ พอเริ่ม boot ให้เรียกค่าจาก flash มาเก็บใส่ ตัวแปรปรกติ แล้วนำเอาตัวแปรนั้นไปใช้เป็นค่า setting เปรียบเทียบ ระหว่างการทำงานปรกติ หากมีการกดปุ่มตั้งค่าให้โดเข้าไปยังโปรแกรมส่วนตั้งค่า หากตั้งค่าเสร็จ ให้save ค่าที่ตั้งลง flash แล้วกลับเข้าสู่การทำงานปรกติครับ วิธีนี้ค่าจะไม่หายครับ