Thứ Ba, 30 tháng 7, 2019

Cách sử dụng Unix/Linux Shell trong C code

Ok anh em... Sau đây mình có một số example cách sử dụng Unix Shell trong code C...

1. echo and C
#include <stdio.h>
#include <stdlib.h>

#define SHELLSCRIPT "\
#/bin/bash \n\
echo \"hello\" \n\
echo \"how are you\" \n\
echo \"today\" \n\
"

int main()
{
    puts("Will execute sh with the following script :");
    puts(SHELLSCRIPT);
    puts("Starting now:");
    system(SHELLSCRIPT);
    return 0;
}



Để chạy program:
$ cc cprog.c -o cprog

$ ./cprog



2. Lấy thời gian của lệnh ping

ping 192.168.1.1
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
64 bytes from 192.168.1.11: icmp_seq=1 ttl=64 time=0.028 ms
64 bytes from 192.168.1.11: icmp_seq=2 ttl=64 time=0.027 ms
64 bytes from 192.168.1.11: icmp_seq=3 ttl=64 time=0.024 ms
64 bytes from 192.168.1.11: icmp_seq=4 ttl=64 time=0.031 ms
Ok,giờ muốn lấy tổng thời gian thực hiện các ICMP package... How to?

Solution:
ping -c 4 -n google.com | cut -d '=' -s -f4 | cut -d ' ' -f1
Ok,done...
Chú thích như sau:

  1. For the ping command:
    • -c 4: Stop after sending 4 packets
    • -n : Give numeric info only, not the associated names for the host address
  2. For the first cut command:
    • -d '=': Use the delimeter of the = sign
    • -f4 : Select the 4th field
    • -s : Do not print lines not containing delimiters
  3. For the second cut command:
    • -d ' ' : Use the delimeter of a space ' '
    • f1 : Select the first field

Còn 1 số Shell khá hay:
- Hiện thời gian thực:
ping 192.168.1.1 | grep -Po 'time=\K\S+'
Hoặc
ping 192.168.1.1 | perl -lne '/time=(\S+)/ && print $1'
Hoặc dùng Awk
ping 192.168.1.1 | awk -F'[= ]' '/time=/{print $(NF-1)}'


3. Đọc input từ Keyboard
Cái này giống như scanf() hay gets() trong C vậy...

Dữ liệu nhập vào sẽ được save trong biến $REPLY




read -p “ prompt_text”







4. Lưu dữ liệu trên Terminal

Để lưu lại các thao tác cũng như các dữ liệu hiển thị trên Terminal vào 1 File...
dùng: $script [file]
ví dụ:
$ script output.txt
Script started, file is output.txt

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

gõ exit để thoát và lưu vào File output.txt















Chủ Nhật, 28 tháng 7, 2019

Arduino và Module cảm biến bụi (Dust Sensor)

Ứng dụng
Do sự ô nhiễm môi trường không khí ngày càng trầm trọng. Nó trở thành một vấn đề được xã hội vô cùng quan tâm. Ô nhiễm môi trường ảnh hưởng trực tiếp tới sức khỏe mỗi con người. Vì vậy module cảm biến bụi sẽ giúp chúng ta biết được mức độ ô nhiễm môi trường không khí để có thể cải thiện chất lượng không khí. 
- Máy lọc không khí.
- Điều hòa.
- Máy giám sát không khí.
.v.v..
Thông số cơ bản của module 
- Độ nhạy: 0.5V / (100 mg / m3).
- Dải đo: 500μg / m3.
- Nguồn cung cấp: 2.5V ~ 5.5V.
- Dòng hoạt động: 20mA (tối đa).
- Nhiệt độ hoạt động: -10 ℃ ~ 65 ℃.
- Nhiệt độ bảo quản: -20 ℃ ~ 80 ℃.
- Thời gian sử dụng: 5 năm.
- Kích thước: 63.2mm × 41.3mm × 21.1mm.
- Kích thước lỗ khí: 9.0mm.


Sơ đồ kết nối chân
Sơ đồ kết nối
- Chân VCC: kết nối nguồn  2.5V ~ 5.5V.
- Chân GND: đất chung.
- Chân Aout : Analog output.
- Chân I led: Digital input.


Hoạt động
- Kích hoạt các diot hồng ngoại bằng cách thiết lập các pin LED ở mức HIGH.
- Chờ 0.28ms, sau đó bắt đầu để lấy mẫu điện áp từ pin Aout của module. Ghi chú rằng tín hiệu đầu ra sẽ mất 0.28ms để đạt trạng thái ổn định sau khi diot hồng ngoại được kích hoạt.
- Chu kì lấy mẫu là 0.004ms . Khi hoàn tất, thiết lập các pin LED LOW để vô hiệu hóa các diot hồng ngoại.
- Tính nồng độ bụi theo mối quan hệ giữa điện áp đầu ra và nồng độ bụi.
Bảng quan hệ giữa giá trị điện áp ra và nồng độ bụi.
Các tiêu chí chất lượng không khí.


Sensitivity (TYP) = 0.5V/(100ug/m3)... Đọc giá trị Analog trả về từ Sensor ta sẽ xác định được độ bụi không khí.


Ứng dụng minh họa: thiết bị đo và cảnh báo mức độ ô nhiễm trong văn phòng hiển thị thông số trên LCD.

Chuẩn bị phần cứng
Bạn có thể  xem hình sau đây
- Các bạn tham khảo hình sau đây :
-  Cắm dây USB 5V vào Arduino. Như vậy ta đã chuẩn bị xong phần cứng.
Phần lập trình , các bạn mở Arduino IDE lên và copy đoạn code dưới vào.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/****** HE THONG DO MUC O NHIEM CUA MOI TRUONG********
 *    **********************************************
 */
#include<LiquidCrystal.h>                                           // thu vien LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);                                 // cau hinh chan LCD
#define        COV_RATIO                       0.2            //ug/mmm / mv
#define        NO_DUST_VOLTAGE                 400            //mv
#define        SYS_VOLTAGE                     5000           
/*
I/O
*/
const int iled = 2;                                            //pin 2 ket noi voi led cua sensor
const int vout = 1;                                            //analog input
/*
variable
*/
float density, voltage;
int   adcvalue, level;
/*
ham loc
*/
int Filter(int m)
{
  static int flag_first = 0, _buff[10], sum;
  const int _buff_max = 10;
  int i;
  
  if(flag_first == 0)
  {
    flag_first = 1;
    for(i = 0, sum = 0; i < _buff_max; i++)
    {
      _buff[i] = m;
      sum += _buff[i];
    }
    return m;
  }
  else
  {
    sum -= _buff[0];
    for(i = 0; i < (_buff_max - 1); i++)
    {
      _buff[i] = _buff[i + 1];
    }
    _buff[9] = m;
    sum += _buff[9];
    
    i = sum / 10.0;
    return i;
  }
}
int pollution_level (float x){                       // tinh gia muc o nhiem
  if (x <= 35) return 0;
  if (x <= 75) return 1;
  if (x <= 115) return 2;
  if (x <= 150) return 3;
  if (x <= 250) return 4;
  return 5;
  
  }
void setup(void)
{
  pinMode(iled, OUTPUT);                                  // cau hinh chan output
  digitalWrite(iled, LOW);                                     //tin hieu outout, o muc thap
  lcd.begin(16,2);                                                  // khai bao LCD 16x2
  Serial.begin(9600);                                         //khai bao UART , baudrate 9600  
  Serial.print("*********************************** COGE Tech Corp ***********************************\n");
}
void loop(void)
{
  /*
  get adcvalue
  */
  digitalWrite(iled, HIGH);                   //  iled high
  delayMicroseconds(280);
  adcvalue = analogRead(vout);                 // doc gia tri adc
  digitalWrite(iled, LOW);                     //   iled low
  
  adcvalue = Filter(adcvalue);                 //  loc adc
  
  /*
  chuyen muc dien ap (mv)
  */
  voltage = (SYS_VOLTAGE / 1024.0) * adcvalue * 11;
  
  /*
chuyen tu dien ap sang do bui
  */
  if(voltage >= NO_DUST_VOLTAGE)
  {
    voltage -= NO_DUST_VOLTAGE;
    
    density = voltage * COV_RATIO;
  }
  else
    density = 0;
  Serial.print("The current dust concentration is: ");
  Serial.print(density);
  Serial.print(" ug/m3\n"); 
  delay(1000);
  
  level = pollution_level (density);
  switch(level) {                 // hien thi do bui len lcd
    case 0: {                        // muc trong sach
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("Trong sach");
      break;
      }
      case 1:{                              // muc trung binh
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("Muc trung binh");
      break;
        }
      case 2:{                         // muc o nhiem nhe
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("O nhiem nhe");
        break;
        }
       case 3:{                      // muc o nhiem vua
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("O nhiem Vua");
        break;
        }
       case 4: {                    // muc o nhiem nang
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("O nhiem nang ");
         break;
        }
       case 5: {                   // muc o nhiem vo cung nghiem trong
        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("Nghiem trong");
        break;
        }
    }
    lcd.setCursor(0,1);
    lcd.print(density);
    lcd.setCursor(6,1);
    lcd.print("(ug/m3)");
}