อุปกรณ์
- บอร์ด Arduino Uno
- ตัวต้านทาน 220โอห์ม 1ตัว
- ตัวต้านทาน 10kโอห์ม 1ตัว
- 7-Segment 8หลัก (ใช้แสดงผลค่า)
หลักการทำงาน
- ขออธิบายแบบเข้าใจง่าย แล้วกันนะครับ
- บนบอร์ด arduino ขา 11 ต่อกับ R10k ทำหน้าที่ ชาร์จประจุให้กับ C ที่จะนำมาวัด, ขา 13 ต่อกับ R220 ทำหน้าที่ ดิทชาร์จ คลายประจุกับตัวเก็บประจุหลังจากจบขั้นตอนวัด, ขา A0 รับค่า analog การชาร์จ ในโปรแกรมเมื่อมีการเริ่มวัดจะจับเวลาไปเรื่อยๆ จนกว่าค่า analog ที่ขา A0 จะมีค่ามากกว่า 648 ถึงจะทำงานโค้ดบรรทัดถัดๆไป ซึ่งเวลาที่จับก็จะหลุดนับ แล้วนำไปเข้าสูตรคำนวณ C = T / R โดยผลลัพธ์ที่ได้จะเป็นหน่วย ไมโครฟารัด(uF) จากนั้นแสดงผลค่า serial.println ในพอร์ต 9600 ถัดมาเราข้ามไปที่บรรทัดท้ายๆเลยครับ
- จะเห็นโค้ดส่วนที่ digitalwrite LOW ไปที่ขา 11, 13 เพื่อ ดิทชาร์จ ประจุ C
- ส่วนการแสดงผล เราเพียงแค่ไปหา จอ หรือ 7segment มาเพิ่มโค้ดเข้าไปนิดหน่อยก็สามารถใช้งานได้แล้วครับ
ต่อวงจรแบบแรก อ่านค่าผ่าน serial port
Code:#define analogPin 0
#define chargePin 13
#define dischargePin 11
#define resistorValue 10000.0F
unsigned long startTime;
unsigned long elapsedTime;
float microFarads;
float nanoFarads;
void setup(){
pinMode(chargePin, OUTPUT);
digitalWrite(chargePin, LOW);
Serial.begin(9600);
}
void loop(){
digitalWrite(chargePin, HIGH);
startTime = millis();
while(analogRead(analogPin) < 648){
}
elapsedTime= millis() - startTime;
microFarads = ((float)elapsedTime / resistorValue) * 1000;
Serial.print(elapsedTime);
Serial.print(" mS ");
if (microFarads > 1){
Serial.print((long)microFarads);
Serial.println(" microFarads");
}
else{
nanoFarads = microFarads * 1000.0;
Serial.print((long)nanoFarads);
Serial.println(" nanoFarads");
delay(500);
}
digitalWrite(chargePin, LOW);
pinMode(dischargePin, OUTPUT);
digitalWrite(dischargePin, LOW);
while(analogRead(analogPin) > 0){
}
pinMode(dischargePin, INPUT);
}
ต่อวงจรแบบที่ 2 อ่านค่าผ่าน 7-Segment
ต้องทำการ Import ไลบรารี่ LedControl โหลดที่ : https://www.arduinolibraries.info/libraries/led-control
Code:
#include "LedControl.h"
#define analogPin 0
#define chargePin 13
#define dischargePin 11
#define resistorValue 10000.0F
unsigned long startTime;
unsigned long elapsedTime;
float microFarads;
float nanoFarads;
LedControl lc = LedControl(7, 6, 5, 1);
void setup() {
pinMode(12, INPUT);
pinMode(chargePin, OUTPUT);
digitalWrite(chargePin, LOW);
Serial.begin(9600);
lc.shutdown(0, false);
lc.setIntensity(0, 7);
lc.clearDisplay(0);
}
void meter_run(){
digitalWrite(chargePin, HIGH);
startTime = millis();
while(analogRead(analogPin) < 648){ }
elapsedTime= millis() - startTime;
microFarads = ((float)elapsedTime / resistorValue) * 1000;
Serial.print(elapsedTime);
Serial.print(" mS ");
if (microFarads >= 100){
String capacitanceString = String(long(microFarads));
int numChars = capacitanceString.length();
Serial.println(numChars);
lc.shutdown(0, true);
lc.clearDisplay(0);
lc.shutdown(0, false);
lc.setChar(0, 0, 'F', false);
for (int i = 0; i < capacitanceString.length(); i++) {
char digit = capacitanceString[i];
Serial.println(microFarads);
if (numChars == 3){
if(i==0){
lc.setChar(0, 5, digit, false);
}
else if(i==1){
lc.setChar(0, 4, digit, false);
}
else if(i==2){
lc.setChar(0, 3, digit, false);
}
}
if (numChars >= 4){
if(i==0){
lc.setChar(0, 6, digit, false);
}
else if(i==1){
lc.setChar(0, 5, digit, false);
}
else if(i==2){
lc.setChar(0, 4, digit, false);
}
else if(i==3){
lc.setChar(0, 3, digit, false);
}
}
}
}
else if (microFarads >= 1 & microFarads < 100){
String capacitanceString = String((microFarads));
int numChars = capacitanceString.length();
Serial.println(numChars);
lc.shutdown(0, true);
lc.clearDisplay(0);
lc.shutdown(0, false);
delay(100);
for (int i = 0; i < capacitanceString.length(); i++) {
char digit = capacitanceString[i];
Serial.println(microFarads);
if (numChars >= 3 & numChars <= 5){
if(i==0){
lc.setChar(0, 6, digit, false);
}
else if(i==1){
lc.setChar(0, 5, digit, false);
}
else if(i==2){
lc.setChar(0, 4, digit, false);
}
else if(i==3){
lc.setChar(0, 3, digit, false);
}
else if(i==4){
lc.setChar(0, 2, digit, false);
}
else if(i==5){
lc.setChar(0, 1, digit, false);
}
lc.setChar(0, 0, 'F', false);
}
}
delay(1000);
}
digitalWrite(chargePin, LOW);
pinMode(dischargePin, OUTPUT);
digitalWrite(dischargePin, LOW);
while(analogRead(analogPin) > 0){
}
pinMode(dischargePin, INPUT);
}
void loop(){
meter_run();
}
0 ความคิดเห็น