Đăng bởi Để lại phản hồi

Hướng dẫn sử dụng cảm biến phao mực nước với Arduino Uno R3

1. Giới thiệu về cảm biến phao mực nước

Cảm biến phao là một thiết bị được sử dụng để phát hiện mức nước trong bồn chứa. cảm biến có thể được sử dụng để điều khiển máy bơm, đèn báo, báo động hoặc các thiết bị khác để cảnh báo mức nước trong quá trình sử dụng. cảm biến phao mực nước là một công tắc BẬT / TẮT điện từ. Nó giúp nhận biết mức nước hiện có trong bể chứa.

Cảm biến phao

1.1 Nguyên lý hoạt động

Công tắc phao sử dụng công tắc từ tính, bao gồm hai tiếp điểm được đựng trong ống thủy tinh. Khi một nam châm đến gần chỗ tiếp xúc, chúng bị hút vào nhau và chạm vào nhau, cho phép dòng điện đi qua. Khi nam châm di chuyển ra xa, các tiếp điểm khử từ và sẽ tách ra (làm đứt mạch).

Nguyên lý hoạt động

Cảm biến phao mà chúng tôi đã sử dụng là Thường mở (NO), tức là khi phao ở điểm thấp, nằm trên đoạn mạch dưới cùng của nó sẽ mở và khi phao ở điểm cao, nó sẽ hoàn thành mạch. Vì vậy, khi mực nước xuống, phao cảm biến sẽ ngắt mạch và đèn led kèm theo sẽ tắt.

2. Phần cứng

  • Arduino UNO: 1
  • Breadboard: 1
  • Cảm biến phao: 1
  • Đèn led: 1
  • Điện trở 1k: 1
  • Dây đực – Đưc: 2

3. Xây dựng phần cứng

kết nối mạch cảm biến phao và Arduino

4. Lập trình với Arduino

// Hướng dẫn của Robo India về Cảm biến nổi từ tính 
// https://www.roboindia.com/tutorials

int  FloatSensor = 2 ;    
int  led = 3 ;            
int  buttonState  =  1 ;  // đọc trạng thái nút bấm

void  setup ( )  
{  
Serial . bắt đầu ( 9600 ) ;  
pinMode ( FloatSensor ,  INPUT_PULLUP ) ;  // Điện trở nội Arduino 
pinMode 10K  ( led ,  OUTPUT ) ;  
}  
void  loop ( )  
{  
buttonState  =  digitalRead ( FloatSensor ) ;  
  if  ( buttonState  ==  HIGH )  
  {  
    digitalWrite ( dẫn,  CAO ) ; 
    Nối tiếp . println (  "MỨC NƯỚC - CAO" ) ;  
  }  
  else  
  {  
    digitalWrite ( led ,  LOW ) ; 
    Nối tiếp . println (  "MỨC NƯỚC - THẤP"  ) ;  
  }  
delay ( 1000 ) ;  
}

5. Kết quả

Sau khi upload mã thành công, bạn có thể xem khi mực nước dâng lên thì đèn led gắn vào sẽ bật và khi mực nước xuống thì đèn led sẽ tắt.

Trân trọng cảm ơn.

Mai Minh Mẫn

Đăng bởi Để lại phản hồi

Đọc dữ liệu cảm biến CO2, Nhiệt độ, HCHO, TVOC từ cảm biến WP06003 thông qua BLE

Đọc dữ liệu của cảm biến nồng độ carbon dioxide (CO2) WP6003 thông qua BLE. WP6003 là một cảm biến giá rẽ. Bạn có thể mua nó tại FUVITECH.

Ngoài CO2, bạn có thể đọc các thông số TVOC, HCHO, nhiệt độ. Tôi có thể đọc dữ liệu bằng ứng dụng điện thoại thông minh, nhưng tôi đọc nó qua BLE vì ứng dụng gốc đi theo cảm biến thì hoạt động không mượt cho lắm.

Cảm biến và app

Chuẩn bị

Bạn hãy thử kết nối thiết bị với BLE Scanner và bạn sẽ thấy địa chỉ của nó với đầu 6003# …. .

Dữ liệu kèm theo

Dữ liệu có tổng cộng 18 byte và có vẻ ở định dạng sau (một số không xác định). TVOC và HCHO có thể ngược lại.

  • 6 byte: Dấu thời gian 0x0a (?), Năm (2 chữ số), tháng, ngày, giờ và phút được thể hiện bằng 1 byte mỗi
  • 2 byte: Nhiệt độ (đơn vị 0,1 ° C)
  • 2 byte: không xác định
  • 2 byte: TVOC (0,001 mg / m3)
  • 2 byte: HCHO (0,001 mg / m3)
  • 2 byte: không xác định (0100)
  • 2 byte: nồng độ CO2 (ppm)

Code Python và Arduino

https://github.com/zu2/wp6003

Code Python

# -*- coding: utf-8 -*-
import Adafruit_BluefruitLE, uuid
from Adafruit_BluefruitLE.services import UART, DeviceInformation
import struct
import atexit
import time
import datetime
 
DEVICE  = '6003#XXXXXXXXXXXXX' # デバイス名
SERVICE = uuid.UUID('0000FFF0-0000-1000-8000-00805F9B34FB')
SENSOR  = uuid.UUID('0000FFF4-0000-1000-8000-00805F9B34FB')
  
provider = Adafruit_BluefruitLE.get_provider()
provider.initialize()
 
def main():
    adapter = provider.get_default_adapter()
    adapter.power_on()
    print('adapter:', adapter.name)
    try:
        print('adapter.start_scan()')
        adapter.start_scan()
        atexit.register(adapter.stop_scan)
        known_uarts = set()
        isnotFound = True
        while(isnotFound):
            found = set(provider.find_devices())
            new = found - known_uarts
            for device in new:
                print('Found device: {0} [{1}]'.format(device.name, device.id))
                if(device.name == DEVICE): 
                    print('connecting...')
                    device.connect()
                    print('connected.')
                    isnotFound = False
                    adapter.stop_scan()
            known_uarts.update(new)
            time.sleep(0.5)
        if device is None:
            raise RuntimeError('Failed to find UART device!')
    finally:
        adapter.stop_scan()
  
    print(device.name)
  
    device.discover([SERVICE],[SENSOR])
    service = device.find_service(SERVICE)
    print('got service',SERVICE)
    sensor = service.find_characteristic(SENSOR)
    print('got characteristic',SENSOR)
  
    def received(data):
        dt_now = datetime.datetime.now()
        print('Notify:',dt_now,' ',data.hex())
        print('Time: 20',data[1],'年',data[2],'月',data[3],'日', data[4],':',data[5])
        print('Temp:',(data[6]*256+data[7])/10,'℃')
        print('TVOC:',(data[10]*256+data[11])/1000,'mg/㎥')
        print('HCHO:',(data[12]*256+data[13])/1000,'mg/㎥')
        print('CO2 :',(data[16]*256+data[17]),'ppm')
 
    sensor.start_notify(received)
    print('start notifications.')
    while (True):
        time.sleep(5)
  
provider.run_mainloop_with(main)

Trả về kết quả:

Chúc các bạn thành công!

Dịch và chỉnh nội dung: FUVITECH. Nguồn zukeran.org

Đăng bởi Để lại phản hồi

Xây dựng trạm thời tiết ứng dụng IoT với ESP32

Hôm nay chúng ta sẽ xây dựng một trạm thời tiết không dây có chức năng đo nhiệt độ, độ ẩm, áp suất khí quyển, ánh sáng và tốc độ gió. Sau đó, dữ liệu được truy cập thông tin qua Thingspeak trên máy tính, máy tính bảng hoặc điện thoại di động có kết nối internet.

Giao diện web Thingspeak

Tôi sẽ sử dụng module LOLIN32 ESP32 Module Thu Phát Wifi Bluetooth. Tôi đã chọn bo mạch cụ thể này vì nó vốn được thiết kế cho các ứng dụng tiêu thụ điện năng thấp và có thể được cấp nguồn trực tiếp bằng pin lithium-ion 3.7V. Nó có một phích cắm pin tích hợp và hỗ trợ sạc qua cổng USB.

Đối với cảm biến, tôi sẽ sử dụng các module cảm biến tích hợp được bán trên thị trường bạn có thể mua chúng tại fuvitech.vn. Chúng tôi cung cấp các thành phần hỗ trợ cần thiết cho cảm biến, vì vậy bạn chỉ cần kết nối cảm biến và bộ vi điều khiển của mình. 

sản phầm hoàn thiện

Các linh kiện cần thiết

Bắt đầu thôi nào!!!!!!

Bước 1: Kết nối các thành phần lại với nhau

Kết nối chúng bằng breadboard

Đối với bất kỳ dự án điện tử nào, bạn nên thử lắp ráp các thành phần trên một breadboard trước tiên để kiểm tra các kết nối và Code.

Tôi đã kết nối cảm biến áp suất với giao thức I2C, cảm biến DHT11 vào chân GPIO 14 theo giao tiếp Onewire, cảm biến ánh sáng vào chân 36 và công tắc từ trường vào chân 0.

Các kết nối khác chỉ là 5V và GND.

Cảm biến áp suất với giao thức I2C

  • VCC – 5V
  • GND – GND
  • SCL – SCL
  • SDA – SDA


Cảm biến DHT11

  • VCC – 5V
  • GND – GND
  • Sig – Pin 14

Cảm biến ánh sáng Analog

  • VCC – 5V
  • GND – GND
  • Sig – Pin 36

Công tắt từ trường

  • VCC – 5V
  • GND – GND
  • Sig – Pin 36

Bước 2: Lập trình code cho ESP32

Giờ đây, các cảm biến đã được kết nối với ESP32, chúng tôi có thể viết Code để lấy kết quả đọc từ các cảm biến và gửi dữ liệu lên Thingspeak. Giữa các lần đọc, chúng tôi sẽ đặt ESP32 vào chế độ ngủ sâu để tiết kiệm điện năng. Thao tác này sẽ tắt các mô-đun giao tiếp WiFi và Bluetooth cũng như CPU.

Code có thể được lập trình trong Arduino IDE. Và dưới đây là chương trình.

Bạn cần tải các thư viện về và giải nén chúng vào Documents > Arduino >Libraries trước khi biên dịch code này:

Bạn cần tải thêm bảng mở rộn Board ESP về theo hướng dẫn này.

Tải xuống Code tại đây

//Weather Station
//The DIY Life by Michael Klements
//11 August 2021

#include <Wire.h>                                                   //Import the required libraries
#include "DHT.h"
#include "Seeed_BMP280.h"
#include <WiFi.h>
#include "ThingSpeak.h"

#define lightSen 36                                                 //Define pin numbers
#define windSen 0
#define uS_TO_S_FACTOR 1000000ULL                                   //Conversion factor for micro seconds to seconds
#define TIME_TO_SLEEP  570                                          //Time ESP32 will go to sleep (in seconds) - 9.5 minutes

DHT dht(14,DHT11);                                                  //DHT and bMP sensor parameters
BMP280 bmp280;

WiFiClient client;                                                  //WiFi connection details
char ssid[] = "WIFI SSID";                                          //WiFi Name
char pass[] = "WIFI PASSWORD";                                      //WiFi Password

unsigned long myChannelNumber = YOUR CHANNEL ID;                    //Thingspeak channel number
const char * myWriteAPIKey = "YOUR WRITE API KEY";                  //Thingspeak API write key

int light = 0;                                                      //Variables to store sensor readings
int temp = 0;
int humid = 0;
int pressure = 0;
int wind = 0;

unsigned long firstMillis = 0;                                       //Timers for the wind speed calculation
unsigned long lastMillis = 0;
unsigned long lastIntTime = 0;
int counter = 0;                                                     //Counter to keep track of the number of wind speed revolutions 

void IRAM_ATTR isr ()                                                //Interrupt routine, run with each reed switch interrupt
{
  unsigned long intTime = millis();
  if(intTime - lastIntTime > 150)                                    //Debounce the reed switch input
  {
    if (counter == 0)
      firstMillis = millis();
    counter++;                                                       //Count each revolution
    lastMillis = millis();
    Serial.println(counter);
  }
  lastIntTime = intTime;                                             //Capture the first and last revolution time
}

void setup()                                                         //Setup function - only function that is run in deep sleep mode
{
  Serial.begin(9600);
  if(!bmp280.init())                                                 //Connect to pressure sensor
  {
    Serial.println("bmp280 init error!");
  }
  pinMode(lightSen, INPUT);                                          //Define pin functions
  pinMode(windSen, INPUT_PULLUP);
  attachInterrupt(windSen, isr, FALLING);                            //Define interrupt pin
  WiFi.begin(ssid, pass);                                            //Connect to WiFi network
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);     //Initialise deep sleep mode parameters
  ThingSpeak.begin(client);                                          //Initialise ThingSpeak
  delay(10000);                                                      //Wait for wind speed readings to be taken
  recLight ();                                                       //Take readings from other sensors
  recTempHumid ();
  recPress ();
  calcWind ();
  counter = 0;
  Serial.print("Light: ");                                           //Display readings on serial monitor
  Serial.println(light);
  Serial.print("Temp: ");
  Serial.println(temp);
  Serial.print("Humidity: ");
  Serial.println(humid);
  Serial.print("Pressure: ");
  Serial.println(pressure);
  Serial.print("Wind: ");
  Serial.println(wind);
  updateThingSpeak ();                                               //Post the data to Thingspeak
  Serial.println("Going to sleep now");
  Serial.flush(); 
  esp_deep_sleep_start();                                            //Enter sleep mode
}

void loop()                                                          //Loop function - unused
{

}

void recLight ()                                                     //Function to record the light level
{
  light = analogRead(lightSen);
}

void recTempHumid ()                                                 //Function to record the temperature and humidity
{
  temp = dht.readTemperature();
  humid = dht.readHumidity();
}

void recPress ()                                                     //Function to record the pressure
{
  pressure = bmp280.getPressure()/100;
}

void calcWind ()                                                     //Function to calculate the wind speed
{
  int ave = 5000;
  if(counter != 0)
    ave = (lastMillis - firstMillis)/counter;
  Serial.print("Average Tick Time: ");
  Serial.println(ave);
  if (ave < 200)
  {
    ave = 200;
    wind = map (ave,200, 4000, 16, 3);
  }
  else if (ave > 4000)
    wind = 0;
  else
  {
    wind = map (ave,200, 4000, 16, 3);
  }
}

void updateThingSpeak ()                                             //Function to post data to Thingspeak
{
  ThingSpeak.setField(1, light);
  ThingSpeak.setField(2, temp);
  ThingSpeak.setField(3, humid);
  ThingSpeak.setField(4, pressure);
  ThingSpeak.setField(5, wind);
  int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  if(x == 200)
  {
    Serial.println("Channel update successful.");
  }
  else
  {
    Serial.println("Problem updating channel. HTTP error code " + String(x));
  }
}

Thay đổi thông tin WIFI

//WiFi connection details
char ssid[] = "WIFI SSID";                                          //WiFi Name
char pass[] = "WIFI PASSWORD";                                      //WiFi Password


Bạn cần điền thông tin tên WIFI cần kết nối thay cho “WIFI SSID” và Pass WIFI thay cho “WIFI PASSWORD” để ESP32 có thể kết nối với Internet.

Tạo API WRITE KEY Thingspeak

Tạo tài khoản ThingSpeak và New Channel để lấy channelID writeAPIKey

Tạo channel mới
Mã Write API Key

Bạn coppy mã write API key được sinh ra ở mục API Keys và cho vào đoạn code. Mã Channel ID nằm ở Channel settings


unsigned long myChannelNumber = YOUR CHANNEL ID;                    //Thingspeak channel number
const char * myWriteAPIKey = "Thay thế mã WRITE API KEY";                  //Thingspeak API write key

Bạn sẽ nhận thấy rằng tất cả mã đều nằm trong hàm setup () và hàm loop () để trống. Điều này là do ESP32 chỉ chạy hàm setup () khi hoạt động ở chế độ ngủ sâu, vì vậy chỉ mã trong hàm này được thực thi mỗi khi thức dậy.

Chu kỳ đánh thức mất khoảng 20-30 giây để hoàn thành bao gồm 10 giây mà ESP32 chờ để đo dữ liệu tốc độ gió.

Sau khi thay đổi các thông tin bạn bắt đầu biên dịch chương trình trên Arduino IDE và nạp code xuống board ESP32.

Bước 3: Hàn dây kết nối các linh kiện với nhau

Để làm cho trạm thời tiết linh hoạt hơn một chút, bạn nên kết nối cố định các dây để kết nối các cảm biến với ESP32.

Tôi cắt các đầu của một bên dây cáp và hàn chúng cùng với hai jumper cái cho công tắc.

Sau khi bạn kết nối các dây cần kiểm tra lại. dùng VOM để kiểm tra từng dây trước khi cấp nguồn và chạy thử lại hệ thống.

Bước 4: Chuẩn bị bộ vỏ bên ngoài cảm biến bằng nhựa in 3D

Bạn có thể tự In mẫu nếu có máy in 3D. Tải file tại đây. Hoặc bạn có thể sử dụng dịch vụ in 3D của chúng tôi.

Tôi đã thiết kế vỏ được in 3D bằng nhựa để vỏ cảm biến có lỗ thông hơi không cần phải lắp ráp thành nhiều lớp. Tôi muốn nó càng nhỏ gọn càng tốt, vì vậy tôi muốn tích hợp các cảm biến và máy đo gió vào một bộ phận duy nhất. Thiết kế mà tôi đưa ra là đặt ESP32 và pin trong đế, với các cảm biến trong ngăn trung tâm có lỗ thông hơi và máy đo gió ở trên cùng.

Tôi vẫn chưa chắc các bản in bằng nhựa 3D sẽ giữ được tốt như thế nào dưới ánh nắng mặt trời. Tôi đã thực hiện một chút nghiên cứu về nó và hầu hết đều nói rằng đó là một ý tưởng và nó chỉ mang tính chất thử nghiệm và nghiên cứu, liệt kê các hư hỏng do tia cực tím làm nhựa giòn có thể dẫn đến hỏng hóc, nhưng tôi cũng đã thấy một vài thử nghiệm trong đó mọi người thực sự để lại các bản in bên ngoài và họ dường như không có bất kỳ thiệt hại nào có thể nhìn thấy được. Bạn hãy thử xem nhé.

Bước 5: Lắp ráp linh kiện vào vỏ.

Tôi gắn các cảm biến lên giá đỡ cảm biến, với cảm biến nhiệt độ và độ ẩm ở một bên, sau đó là cảm biến áp suất và ánh sáng ở bên kia.

Gập chân của công tắc từ 90 độ để nó có thể được đặt ở phía trên cùng của vỏ cảm biến với các chân xuyên vào bên trong. Tôi cho một ít nhựa vào các khoảng trống ở mỗi đầu để bịt kín chúng và bảo đảm không thấm nước.

Máy đo gió được giữ cố định bằng một vít M5x20mm thông qua vỏ từ bên trong. Một đai ốc giữ vít ở một vị trí và một đai ốc thứ hai sau đó giữ hai ổ trục trên trục vít. Vặn đai ốc này để giữ các ổ trục ở đúng vị trí, nhưng đừng siết quá chặt để hạn chế chuyển động quay của chúng.

Đẩy một vài nam châm (4-5) vào một trong những khoảng trống trên đế máy đo gió. Những điều này sẽ kích hoạt công tắc từ trên mỗi vòng quay.

Cuối cùng, lắp máy đo gió lên vòng bi sao cho nó nằm phía trên công tắc từ vài mm.

Cắm dây dẫn vào các cảm biến và kết nối dây nối với công tắc từ. Cắm pin vào ESP32, nhớ sạc pin trước, sau đó đóng vỏ bằng một số vít M3x8mm.

Trạm thời tiết bây giờ sẽ được kết nối với mạng WiFi của bạn và gữi dữ liệu lên Thingspeak, vì vậy nó đã sẵn sàng để gắn ngoài trời.

Cố định nó bên ngoài bằng ba vít thông qua các giá đỡ ở dưới cùng của đế.

Bước 6: Kiểm tra Trạm thời tiết

Tôi rời trạm thời tiết trong vài giờ và sau đó mở Thingspeak của mình lên kiểm tra. Tất cả các cảm biến điều hoạt động tốt và đẩy dữ liệu hiển thị trên biểu đồ.

Tôi cũng đã kiểm tra dòng điện từ pin và thấy rằng hệ thống sử dụng khoảng 30-60mA khi chạy, 120mA khi đăng dữ liệu qua WiFi và dòng điện giảm xuống 1,2mA khi ở chế độ ngủ sâu. Vì vậy, trên pin 2500mAh, bạn sẽ có thời gian hoạt động dưới 2 tháng cho một lần sạc. Bạn cũng có thể thêm một bảng điều khiển năng lượng mặt trời nhỏ vào bộ phận lắp ráp để sạc pin trong ngày.

Hãy cho tôi biết suy nghĩ của bạn về trạm thời tiết trong phần nhận xét và hãy cân nhắc bỏ phiếu cho nó trong cuộc thi Backyard nếu bạn thích nó.

Mai Minh Mẫn. Tham khảo từ instructables

Đăng bởi 1 phản hồi

Sử dụng Arduino tạo máy đo PH chính xác cao

Trong dự án này, chúng tôi sẽ chế tạo một máy đo pH cầm tay bằng cách sử dụng mạch đọc Analog, đầu dò pH Analog của Atlas Scientific và Arduino Uno. Các kết quả đọc sẽ được hiển thị trên màn hình LCD ký tự 20×4

Sản phẩm hoàn thiện

Chuẩn bị linh kiện:

Chuẩn bị dụng cụ

Máy khoan, mũi khoan, mũi khoan cấp , tua vít, cưa lọng, súng bắn keo và keo nến, mỏ hàn và dụng cụ hàn, thước cặp kỹ thuật số, thước kẻ.

Bước 1: Làm vỏ hộp

Bạn sử dụng các dụng cụ chuẩn bị bên trên để tạo hình các lỗ và cắt khung màn hình ở mặt trước như các hình bên trên.

Bước 2: Lắp các thiết bị vào hộp

1) Lắp tấm đế mica vào phần dưới cùng của vỏ. Giữ cố định bằng vít hoặc keo nóng.

2) Gắn cảm biến pH trên tấm đế. Đảm bảo chắt chắn với các điểm dừng bằng vít.

3) Gắn Arduino Uno lên tấm đế. Giữ chặt bằng vít .

4) gắn breadboard mini lên tấm đế.

5) Hàn các hàn rào vào màn hình LCD. Chèn màn hình LCD vào phần trên của vỏ và sử dụng một ít keo nóng để giữ cho màn hình cố định.

Bước 3: Kết nối nối các mạch lại với nhau theo sơ đồ

Nối dây các module như trong sơ đồ trên.

Sử dụng breadboard mini để cấm các điện trở 1kΩ và 220Ω và để phân phối nguồn 5V và chân nối đất của Arduino.

Hai điện trở được sử dụng để chỉnh độ tương phản của màn hình hoặc bạn có thể sử dụng biến trở để chỉnh.

Sản phẩm hoàn thiện sau khi kết nối dây.

Sản phẩm hoàn thiện

Sau khi đấu dây xong:

a) cố định vỏ hộp lại bằng các vít kèm theo.

b) Kết nối đầu dò pH với đầu nối BNC.

Bước 4: Tải thư viện pH và nạp code

a) Tải thư viện Atlas_gravity về theo link tại đây: LINK

Tệp sẽ được lưu dưới dạng “Atlas_gravity.zip”. Trong IDE, Bạn giải nén thư viện ra và duy chuyển thư viện vào Documents > Arduino > libraries

b) Thêm thư viện Màn hình LCD 20X4: Trong Arduino IDE, ở menu chọn Sketch -> Include library -> Manage libraries . Trong thanh tìm kiếm của Trình quản lý thư viện, hãy nhập “liquidcrystal”. Tìm gói có tiêu đề “LiquidCrystal Built-in by Arduino, Adafruit”.  hãy chọn gói và nhấp vào cài đặt .

c) Tiếp theo, chúng ta phải tải code cho máy đo pH tại  LINK này sau đó giải nén và mở code bằng Arduino IDE.

/*
Once uploaded, open the serial monitor, set the baud rate to 9600 and append "Carriage return"
The code allows the user to observe real time pH readings as well as calibrate the sensor.
One, two or three-point calibration can be done.

Calibration commands:
 low-point: "cal,4"
 mid-point: "cal,7"
 high-point: "cal,10"
 clear calibration: "cal,clear"
*/

#include "ph_grav.h"                                  //thư viện Atlas Scientific gravity pH sensor
#include "LiquidCrystal.h"                            //thư viện màn hình LCD 

String inputstring = "";                              //Chuỗi dư liệu giao tiếp với máy tính
boolean input_string_complete = false;                //a flag to indicate have we received all the data from the PC
char inputstring_array[10];                           //a char array needed for string parsing
Gravity_pH pH = A0;                                   //assign analog pin A0 of Arduino to class Gravity_pH. connect output of pH sensor to pin A0
LiquidCrystal pH_lcd(2, 3, 4, 5, 6, 7);               //make a variable pH_lcd and assign arduino digital pins to lcd pins (2 -> RS, 3 -> E, 4 to 7 -> D4 to D7)

void setup() {
  Serial.begin(9600);                                 //enable serial port
  pH_lcd.begin(20, 4);                                //start lcd interface and define lcd size (20 columns and 4 rows)
  pH_lcd.setCursor(0,0);                              //place cursor on screen at column 1, row 1
  pH_lcd.print("--------------------");               //display characters
  pH_lcd.setCursor(0,3);                              //place cursor on screen at column 1, row 4
  pH_lcd.print("--------------------");               //display characters
  pH_lcd.setCursor(5, 1);                             //place cursor on screen at column 6, row 2
  pH_lcd.print("pH Reading");                         //display "pH Reading" 
  if (pH.begin()) { Serial.println("Loaded EEPROM");} 
  Serial.println(F("Use commands \"CAL,4\", \"CAL,7\", and \"CAL,10\" to calibrate the circuit to those respective values"));
  Serial.println(F("Use command \"CAL,CLEAR\" to clear the calibration"));
 }


void serialEvent() {                                  //if the hardware serial port_0 receives a char
  inputstring = Serial.readStringUntil(13);           //read the string until we see a <CR>
  input_string_complete = true;                       //set the flag used to tell if we have received a completed string from the PC
}


void loop() {

  if (input_string_complete == true) {                //check if data received
    inputstring.toCharArray(inputstring_array, 30);   //convert the string to a char array
    parse_cmd(inputstring_array);                     //send data to pars_cmd function
    input_string_complete = false;                    //reset the flag used to tell if we have received a completed string from the PC
    inputstring = "";                                 //clear the string
  }
  Serial.println(pH.read_ph());                       //output pH reading to serial monitor
  pH_lcd.setCursor(8, 2);                             //place cursor on screen at column 9, row 3
  pH_lcd.print(pH.read_ph());                         //output pH to lcd
  delay(1000);
}


void parse_cmd(char* string) {                      //For calling calibration functions
  strupr(string);                                   //convert input string to uppercase

  if (strcmp(string, "CAL,4") == 0) {               //compare user input string with CAL,4 and if they match, proceed
    pH.cal_low();                                   //call function for low point calibration
    Serial.println("LOW CALIBRATED");
  }
  else if (strcmp(string, "CAL,7") == 0) {          //compare user input string with CAL,7 and if they match, proceed
    pH.cal_mid();                                   //call function for midpoint calibration
    Serial.println("MID CALIBRATED");
  }
  else if (strcmp(string, "CAL,10") == 0) {         //compare user input string with CAL,10 and if they match, proceed
    pH.cal_high();                                  //call function for highpoint calibration
    Serial.println("HIGH CALIBRATED");
  }
  else if (strcmp(string, "CAL,CLEAR") == 0) {      //compare user input string with CAL,CLEAR and if they match, proceed
    pH.cal_clear();                                 //call function for clearing calibration
    Serial.println("CALIBRATION CLEARED");
  }
}

d) Biên dịch chương trình trên và nạp xuống board Arduino.

e) Các kết quả đo pH sau đó sẽ được hiển thị trên màn hình LCD 20X4. Bạn cũng có thể xem các kết quả đọc trên Serial port bằng cách nhấn vào biểu tượng góc phải màn hình hoặc đi tới Tools -> Serial Monitor hoặc nhấn Ctrl + Shift + M trên bàn phím của bạn. Đặt tốc độ truyền là 9600.

Bước 5: Hiệu chỉnh cảm biến pH

Lưu ý: Nếu bạn định sử dụng nguồn điện bên ngoài cho Arduino, hãy kết nối nó với Arduino trước khi thực hiện hiệu chuẩn. Điều này sẽ đảm bảo rằng các mức tham chiếu điện áp được đặt thích hợp, điều này sẽ hỗ trợ việc hiệu chuẩn chính xác.

Máy đo pH này có thể được hiệu chuẩn theo hiệu chuẩn một, hai hoặc ba điểm. Phải chuẩn bị dung dịch đệm tiêu chuẩn (pH 4,7 và 10).

Màn hình Serial port được sử dụng cho quá trình hiệu chuẩn. Người dùng sẽ có thể quan sát sự thay đổi dần dần của các máy đo và đợi khi nó ổn định và gửi các lệnh thích hợp.

Dữ liệu hiệu chuẩn được lưu trữ trong EEPROM của Arduino.

Lưu ý rằng phải hiệu chuẩn pH 7 trước.

Các lệnh hiệu chỉnh

Điểm giữa: cal, 7

Điểm thấp: cal, 4

Điểm cao: cal, 10

Xóa hiệu chuẩn và đưa về mặt định: cal, clear

Các bước hiệu chỉnh

a) Tháo chai đựng dung dịch chuẩn và rửa sạch đầu dò pH.

b) Đổ một ít dung dịch có pH = 7 vào cốc. Đảm bảo rằng có đủ để ngập vùng cảm biến của đầu dò.

c) Đặt đầu dò vào cốc và khuấy xung quanh để loại bỏ bong bóng khí bên trong đầu dò. Quan sát kết quả đọc trên màn hình Serial máy tính. Đặt đầu dò trong dung dịch cho đến khi các số đọc ổn định (thay đổi nhỏ từ số đọc này sang số đọc tiếp theo là bình thường)

d) Sau khi các số đọc ổn định, nhập lệnh cal, 7 vào màn hình nối tiếp. Hiệu chuẩn đến pH 7 hiện đã hoàn tất.

Lặp lại các bước cho pH4 và pH10. Nhớ rửa sạch đầu dò khi bạn tiếp tục với các dung dịch đệm khác nhau.

về bù nhiệt độ thì sao?

Cảm biến được sử dụng trong dự án này có độ chính xác +/- 0,2%. Máy đo pH sẽ hoạt động với độ chính xác này trong khoảng nhiệt độ từ 7 – 46 ° C. Ngoài phạm vi này, máy đo sẽ phải được sửa đổi để bù nhiệt độ. Lưu ý: Đầu dò pH chỉ có thể nằm trong phạm vi từ 1 – 60 ° C.

Đây là hướng dẫn cơ bản và cho các bạn đã sử dụng cơ bản về phần mềm Arduino IDE và board Arduino. Các bạn chạy bằng PlatformIO vui lòng liên hệ kỹ thuật của FUVITECH để được hướng dẫn cụ thể.

Mai Minh Mẫn Dịch từ Instructables

Đăng bởi Để lại phản hồi

Tìm hiểu về cảm biến IoT: cách thiết bị IoT thu thập dữ liệu

Cảm biến IoT là mấu chốt của nhiều hệ thống IoT (Internet of Thing) và giúp thu thập các thông số cần thiết cho một hệ thống IoT.

Hầu hết các thiết bị IoT hoạt động bằng cách sử dụng cảm biến để thu thập các thông số mà hệ thống cần nhầm mục đích cho nguồn dữ liệu phong phú. Các cảm biến IoT này nắm bắt và phân tích dữ liệu để hiểu môi trường vật lý xung quanh chúng.

Có nhiều loại cảm biến khác nhau được sử dụng để thực hiện các chức năng khác nhau tùy thuộc vào trường hợp sử dụng. Một số cảm biến được sử dụng phổ biến và phương pháp hoạt động của chúng được thể hiện bên dưới:

Các loại cảm biến IoT

Nhiều loại cảm biến hiện đang được sử dụng cho các ứng dụng khác nhau. Chúng bao gồm cảm biến khoảng cách, cảm biến nhiệt độ, cảm biến hóa học, cảm biến hình ảnh và cảm biến khí, … . Dưới đây là ba loại cảm biến đang được sử dụng rộng rãi trong nhiều ngành:

Cảm biến IoT

Cảm biến tiệm cận

Cảm biến tiệm cận được sử dụng để phát hiện các đối tượng ở khoản cách gần. Các cảm biến này phần lớn được sử dụng trong lĩnh vực xe tự hành và robot tự động cho kho hàng. Cảm biến tiệm cận phát ra bức xạ điện từ, ví dụ như tia hồng ngoại, và phát hiện những thay đổi trong tín hiệu trả về. Một số loại cảm biến tiệm cận bao gồm:

Cảm biến bức xạ điện từ: Những cảm biến này phát hiện các vật thể kim loại trong vùng lân cận của chúng bằng cách sử dụng bức xạ điện từ.

Cảm biến điện dung: Cảm biến điện dung được sử dụng để phát hiện các vật thể kim loại cũng như phi kim loại bằng cách thay đổi biên độ gây ra bởi điện dung của vật thể trong trường tĩnh điện .

Cảm biến quang điện: Cảm biến quang điện sử dụng một chùm ánh sáng để phát hiện sự hiện diện của các vật thể. Vì ánh sáng có thể truyền đi khoảng cách xa, nên những cảm biến này được sử dụng cho mục đích cảm biến tầm xa.

Cảm biến khí GAS

Cảm biến khí được sử dụng để theo dõi sự thay đổi chất lượng không khí và phát hiện sự hiện diện của khí độc hại do rò rỉ hoặc các trường hợp khác.

Chúng chủ yếu được sử dụng trong các ngành công nghiệp dầu khí, sản xuất và dược phẩm, nhà cao tầng, nhà máy, … .

Cảm biến khí bao gồm một vật liệu cảm biến và một lớp điện cực với các điện tử tự do chạy qua chúng. Oxy thu hút các điện cực đến bề mặt của vật liệu cảm biến, dẫn đến một số lượng thấp các electron tự do chảy bên trong vật liệu cảm biến.

Tuy nhiên, nếu không khí tinh khiết được thay thế bằng các khí độc hại như carbon monoxide hoặc propane, các electron được giữ bởi các phân tử oxy sẽ bị đẩy vào bên trong vật liệu cảm biến và cho phép dòng điện chạy qua mạch. Điều này kích hoạt cảm biến phát ra tín hiệu cảnh báo phát hiện sự hiện diện của khí độc hại.

Cảm biến nhiệt độ

Cảm biến nhiệt độ được sử dụng để phát hiện sự thay đổi của nhiệt độ. Chúng được sử dụng trong các thiết bị gia dụng như tủ lạnh, Máy điều hòa và bộ điều nhiệt cũng như trong các ngành công nghiệp như sản xuất, nơi máy móc được yêu cầu hoạt động ở nhiệt độ nhất định.

Cảm biến nhiệt độ có thể cung cấp số liệu nhiệt độ tại thời điểm đo của máy móc và môi trường tự nhiên, giúp máy móc thực hiện các hoạt động ở nhiệt độ tối ưu của chúng. Các cảm biến nhiệt độ được sử dụng phổ biến nhất hoạt động trên nguyên tắc cặp nhiệt điện.

Một cặp nhiệt điện được tạo thành từ hai kim loại khác nhau được ghép với nhau để tạo thành hai chỗ nối (nóng và lạnh). Dòng điện do sự chênh lệch nhiệt độ của hai điểm nối có thể được chuyển đổi thành giá trị nhiệt độ.

Cảm biến IoT cung cấp thông tin quan mà máy móc hoặc con người cần trong thời gian đo lường có thể ảnh hưởng đến hoạt động công việc và đời sống. Chúng có thể giúp ngăn chặn thảm họa hoặc giúp giảm thiểu thiệt hại nếu các hành động nhanh chóng được thực hiện dựa trên dữ liệu do chúng cung cấp. Do đó, cảm biến IoT và thiết bị IoT đang trở nên phổ biến trong môi trường làm việc cũng như gia đình. Sẽ không lâu nữa, chúng sẽ trở thành một phần nội tại trong cuộc sống của chúng ta.

Biên tập: Mai Minh Mẫn
Xem bài viết gốc