Thứ Tư, 19 tháng 6, 2019

PLC lập trình 16 đèn sáng dần và tắt dần bằng ngôn ngữ LAD

PLC lập trình 16 đèn sáng dần và tắt dần bằng ngôn ngữ LAD.
***Nhấp vào ảnh để xem ảnh lớn! 
Cấu trúc gồm các thành phần:
1. Timer S_ODT: Có chức năng đếm thời gian. Trong bài này thực hiện 16 đèn sáng dần và tắt dần nên chọn t = 32s
- S: Chân S lên mức 1 thì S_ODT hoạt động (khởi động timer)
- TV: Đặt giá trị thời gian theo cú pháp (S5T#32S), với 32 là số giây
- R: Chân reset, R lên mức 1 timer không hoạt động
- Q: Ngõ ra
- BI: Đếm theo mã nhị phân

2. Move chuyển dữ liệu:
- MW0 lấy ngõ ra từ timer, sử dụng phép so sánh để có được thời gian trễ 1s
- IN: là giá trị đặt trước để chuyển dữ liệu ra ngõ ra
+ Network 2: 1000000000000000 tương đương 8000
+ Network 3: 1100000000000000 tương đương C000
Cứ như vậy thực hiện các MOV còn lại, cuối sáng dần sẽ là đầu tắt dần.
Chúc các bạn thành công!

Chủ Nhật, 7 tháng 1, 2018

Vườn tưới cây sử dụng cảm biến DHT11 với Arduino và hiển thị thời gian thực lên LCD

Thư viện hỗ trợ DHT11 theo đoạn code bên dưới:
http://www.mediafire.com/file/kqv5fhsmo8vtdcd/dht11.rar
Nếu nhiệt độ lớn hơn 40 thì kích relay đóng.


Code:

#include <Wire.h>
#include "DHT.h" //Khai báo thư viện DHT11
#include <LiquidCrystal.h> //Khai báo thư viện LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define DHTPIN 6 //Khai báo chân tín hiệu DHT11
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

const byte DS1307 = 0x68;
const byte NumberOfFields = 7;
int second, minute, hour, day, wday, month, year;

void setup()
{
  //LCD
  lcd.begin(16, 2);
  Serial.begin(9600);

  //DS1307
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
  Wire.begin();
  setTime(21, 30, 45, 6, 04, 12, 17); // 21:30:45 T6 04-12-2017

  //DHT11
  Serial.begin(19200);
  Serial.println("DHTxx test!");
  dht.begin();
  pinMode(7,OUTPUT);
}

void loop()
{
  readDS1307();
  digitalClockDisplay();
  delay(1000);
  // Đọc nhiệt độ, độ ẩm mất khoảng 250ms
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h))
  {
    Serial.println("Failed to read from DHT");
  }
  else
  {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");
    lcd.setCursor(11, 0);// cot  hang
    lcd.print("H");
    lcd.setCursor(12, 0);// cot  hang
    lcd.print("=");
    lcd.setCursor(13, 0);// cot  hang
    lcd.print(round(h));
    lcd.setCursor(15, 0);// cot  hang
    lcd.print("%");
    lcd.setCursor(11, 1);// cot  hang
    lcd.print("T");
    lcd.setCursor(12, 1);// cot  hang
    lcd.print("=");
    lcd.setCursor(13, 1);// cot  hang
    lcd.print(round(t));
    lcd.setCursor(15, 1);// cot  hang
    lcd.print("C");
    if(round(t)>=40)
    digitalWrite(7,HIGH);
    else
    digitalWrite(7,LOW);
  }
}

void readDS1307()
{
        Wire.beginTransmission(DS1307);
        Wire.write((byte)0x00);
        Wire.endTransmission();
        Wire.requestFrom(DS1307, NumberOfFields);
        second = bcd2dec(Wire.read() & 0x7f);
        minute = bcd2dec(Wire.read() );
        hour   = bcd2dec(Wire.read() & 0x3f); // chế độ 24h.
        wday   = bcd2dec(Wire.read() );
        day    = bcd2dec(Wire.read() );
        month  = bcd2dec(Wire.read() );
        year   = bcd2dec(Wire.read() );
        year += 2000;  
}

int bcd2dec(byte num)
{
        return ((num/16 * 10) + (num % 16));
}

int dec2bcd(byte num)
{
        return ((num/10 * 16) + (num % 10));
}

void digitalClockDisplay(){
    // digital clock display of the time
    Serial.print(hour);
    printDigits(minute);
    printDigits(second);
    Serial.print(" ");
    Serial.print(day);
    Serial.print(" ");
    Serial.print(month);
    Serial.print(" ");
    Serial.print(year);
    Serial.println();
    lcd.setCursor(0, 0);// cot  hang
    lcd.print(hour);
    lcd.setCursor(2, 0);// cot  hang
    lcd.print(":");
    lcd.setCursor(3, 0);// cot  hang
    lcd.print(minute);
    lcd.setCursor(5, 0);// cot  hang
    lcd.print(":");
    lcd.setCursor(6, 0);// cot  hang
    lcd.print(second);
    lcd.setCursor(0, 1);// cot  hang
    lcd.print(day);
    lcd.setCursor(2, 1);// cot  hang
    lcd.print("/");
    lcd.setCursor(3, 1);// cot  hang
    lcd.print(month);
    lcd.setCursor(5, 1);// cot  hang
    lcd.print("/");
    lcd.setCursor(6, 1);// cot  hang
    lcd.print(year);
}

void printDigits(int digits)
{
    // các thành phần thời gian được ngăn chách bằng dấu :
    Serial.print(":");
    if(digits < 10)
    Serial.print('0');
    Serial.print(digits);
}

//cài đặt thời gian cho DS1307
void setTime(byte hr, byte min, byte sec, byte wd, byte d, byte mth, byte yr)
{
        Wire.beginTransmission(DS1307);
        Wire.write(byte(0x00)); // đặt lại pointer
        Wire.write(dec2bcd(sec));
        Wire.write(dec2bcd(min));
        Wire.write(dec2bcd(hr));
        Wire.write(dec2bcd(wd)); // day of week: Sunday = 1, Saturday = 7
        Wire.write(dec2bcd(d));
        Wire.write(dec2bcd(mth));
        Wire.write(dec2bcd(yr));
        Wire.endTransmission();
}

Thứ Sáu, 22 tháng 12, 2017

Arduino kết hợp với cảm biến mưa (Cơ bản)

1. Giới thiệu: Module Cảm biến mưa là một thiết bị đơn giản dễ dàng kết hợp với Arduino, Về nguyên lí hoạt động Module mình không giới thiệu lại, trên mạng có rất nhiều rồi.

2. Thực hiện: Kết nối phần cứng như sơ đồ nguyên lí sau:
***Nhớ kết nối LCD vào!

***Kiểm tra code bằng mô phỏng trên Proteus.



3. Copy đoạn code mình đã viết bên dưới, sau đó dán vào IDE và biên dịch.
4. Đổ chương trình xuống và chạy thực nghiệm.
***Kết quả chạy mô phỏng.


CODE:

int CBM=A1;
int LED=8;
float mua=0;
#include<LiquidCrystal.h>
#include<Wire.h>
LiquidCrystal lcd(12,11,5,4,3,2);
void setup(){
lcd.begin(16,2);
Serial.begin(9600);
pinMode(LED,OUTPUT);
}
void loop()
{
mua=analogRead(CBM);
Serial.println("Có mưa");
if(mua<1000)
{
  lcd.setCursor(0,0);
  lcd.print("TROI DANG MUA");
  lcd.setCursor(0,1);
  lcd.print("GIA TRI:");
  lcd.setCursor(9,1);
  lcd.print(mua);
  digitalWrite(LED,HIGH);
}
else
{
  lcd.setCursor(0,0);
  lcd.print("GIA TRI CAM BIEN");
  lcd.setCursor(8,1);
  lcd.print(mua);
  digitalWrite(LED,LOW);
}
delay(1000);
}
//mail: tranduylinhvlute@gmail.com
Chúc các bạn thành công.

Arduino với cảm biến chuyển động PIR HC-SR501

1. Giới thiệu: Mạch cảm biến chuyển động PIR có thể áp dụng vào mạch bật tắt đèn tự động, mạch báo chuông khi có người.
Cảm biến chuyển động PIR:

2. Thực hiện:

Bước 1: Kết nối phần cứng như hình vẽ (chân tín hiệu và chân xuất tín hiệu ra LED có thể thay đổi, trong đoạn code sửa lại là được).




Bước 2: Copy đoạn code sau và dán vào IDE hoặc các bạn có thể tự viết theo lưu đồ giải thuật. Đơn giản mà phải không.



Bước 3: Biên dịch code và đổ xuống phần cứng kiểm tra thực nghiệm.

CODE:

int cambien = 8;
int giatri;

void setup() {
  pinMode(9,OUTPUT);
  Serial.begin(9600);
}

void loop() {
  giatri = digitalRead(cambien); //Đọc cảm biến
  if (giatri == LOW)
  {
    Serial.println("Không có chuyển động"); //In ra màn hình (Nếu giá trị cảm biến LOW, không có chuyển động)
    digitalWrite(9,LOW);//LED tắt
  }
  else
  {
    Serial.println("Phát hiện chuyển động"); //In ra màn hình (Nếu giá trị cảm biến HIGH, có chuyển động)
    digitalWrite(9,HIGH);//LED sáng
  }
  delay(1000);
}
//mail: tranduylinhvlute@gmail.com
Chúc các bạn thành công!

Phát hiện chuyển động Camera chụp lại ảnh người đi qua sau đó lưu vào thẻ nhớ.

Arduino kết hợp với Camera RS232 PTC06, Cảm biến chuyển động PIR và Module đọc/ghi thẻ nhớ Micro SD.
1. Giới thiệu:
Đề tài: Nghiên cứu và thiết kế thi công mạch điều khiển Camera giám sát bằng Arduino.
Đây cũng là đề tài mình nghiên cứu đồ án môn học, mặc dù không thành công lắm, nhưng vẫn chia sẽ cho mọi người.
***Nhược điểm: Camera chụp ảnh mờ, chứ mô hình hoạt động khá tốt.
2. Thực hiện thôi nào:
Bước 1: Kết nối phần cứng như sơ đồ nguyên lí.
Bước 2: Thư viện hỗ trợ: Các thư viện bên dưới tùy phiên bản IDE có phiên bản sẽ có sẵn, có phiên bản sẽ không có. Nếu không có các bạn tìm trên google và tải xuống thêm vào.
1. Softwareserial
2. Newsoftwareserial
3. SD
4. SPI
Tải thư viện hỗ trợ cho Camera RS232 PTC06 theo link bên dưới:

http://www.mediafire.com/file/tfnpzimuxjst0y6/Adafruit-VC0706-Serial-Camera-Library-master.zip

Bước 3: Copy đoạn code mẫu sau dán vào IDE.
Bươc 4: Biên dịch chương trình và đổ xuống phần cứng chạy thực  nghiệm.

***Chú ý: Nếu Arduino không nhận Camera trên Serial Port máy tính, thì chỉnh lại thư viện trong Cpp.
***Lưu đồ giải thuật:

CODE:
#include <Adafruit_VC0706.h>
#include <SPI.h>
#include <SD.h>
#include <SoftwareSerial.h>      
#define chipSelect 10

SoftwareSerial cameraconnection = SoftwareSerial(2, 3); // 2-tx and 3-rx
Adafruit_VC0706 cam = Adafruit_VC0706(&cameraconnection);

void setup() {
pinMode(8,INPUT_PULLUP);
pinMode(6,OUTPUT);
#if !defined(SOFTWARE_SPI)
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  if(chipSelect != 53) pinMode(53, OUTPUT); // CS trên Mega
#else
  if(chipSelect != 10) pinMode(10, OUTPUT); // CS trên UNO
#endif
#endif

  Serial.begin(9600);
  Serial.println("Kiểm tra Camera chụp!");

  // Tìm kiếm thẻ nhớ, nếu thẻ tồn tại có thể khởi tạo
  if (!SD.begin(chipSelect)) {
    Serial.println("Thẻ hỏng hoặc không tồn tại");
  // Nếu thẻ hỏng thì dừng lại
    return;
  }
}


void loop() {

  if ( digitalRead (8) > 0 )
  {
    digitalWrite(6,HIGH);
    // Thử tìm Camera
  if (cam.begin()) {
    Serial.println("Tìm kiếm Camera:");
  } else {
    Serial.println("Không tìm được Camera?");
    return;
  }
  // In thông tin của Camera
  char *reply = cam.getVersion();
  if (reply == 0) {
    Serial.print("Phiên bản hỏng");
  } else {
    Serial.println("-----------------");
    Serial.print(reply);
    Serial.println("-----------------");
  }

  // Đặt kích thước hình ảnh 640x480, 320x240 hoặc 160x120
  // Kích thước ảnh càng lớn tốn nhiều thời gian truyền tệp

  //cam.setImageSize(VC0706_640x480);        // Lớn nhất
  //cam.setImageSize(VC0706_320x240);        // Trung bình
  cam.setImageSize(VC0706_160x120);          // Nhỏ

  // Đọc kích thước ảnh từ Camera
  uint8_t imgsize = cam.getImageSize();
  Serial.print("Kích thước ảnh: ");
  if (imgsize == VC0706_640x480) Serial.println("640x480");
  if (imgsize == VC0706_320x240) Serial.println("320x240");
  if (imgsize == VC0706_160x120) Serial.println("160x120");

  Serial.println("Chụp trong...");
  delay(250);

  if (! cam.takePicture())
    Serial.println("Chụp hỏng!");
  else
    Serial.println("Ảnh đã được chụp!");

  // Tạo một hình ảnh với tên theo mẫu IMAGExx.JPG
  char filename[13];
  strcpy(filename, "IMAGE00.JPG");
  for (int i = 0; i < 100; i++) {
    filename[5] = '0' + i/10;
    filename[6] = '0' + i%10;
    // Tạo nếu không tồn tại, không mở hiện tại, viết, đồng bộ sau khi viết
    if (! SD.exists(filename)) {
      break;
    }
  }

  // Mở file để viết
  File imgFile = SD.open(filename, FILE_WRITE);

  // Nhận kích thước hình ảnh đã chụp
  uint16_t jpglen = cam.frameLength();
  Serial.print("Đang lưu...");
  Serial.print(jpglen, DEC);
  Serial.print(" byte image.");

  int32_t time = millis();
  // Đọc tất cả dữ liệu
  byte wCount = 0; // Đang đếm
  while (jpglen > 0) {
   // Đọc 64 byte ở một thời điểm
    uint8_t *buffer;
    uint8_t bytesToRead = min(64, jpglen); // Thay đổi từ 32 đến 64 cho một tốc độ nhưng có thể không làm việc với tất cả các thiết lập!
    buffer = cam.readPicture(bytesToRead);
    imgFile.write(buffer, bytesToRead);
    if(++wCount >= 64) {
      Serial.print('.');
      wCount = 0;
    }
    //Serial.print("Read ");  Serial.print(bytesToRead, DEC); Serial.println(" bytes");
    jpglen -= bytesToRead;
  }
  imgFile.close();
  digitalWrite(6, LOW);
  time = millis() - time;
  Serial.println("Xong!");
  Serial.print(time);
  Serial.println(" ms.");// Chụp tốn thời gian bao nhiêu mili giây
}
}
//mail: tranduylinhvlute@gmail.com
Chúc các bạn thành công.

Arduino kết hợp với cảm biến nhiệt độ-độ ẩm DHT11 và hiển thị lên màn hình LCD 16x2

1. Giới thiệu: Cảm biến nhiệt độ độ ẩm có thể kết hợp được với Arduino, mạch này có thể ứng dụng nhiều vào thực tế. Các bạn có thể vận dụng vào tưới nước cho vườn rau.
Ví dụ: _Khi nhiệt độ hơn 35 độ C thì Arduino kích relay mở động cơ bơm nước.
           _Khi độ ẩm <60% thì Arduino kích relay mở động cơ bơm nước.
           _Khi nhiệt độ lớn 35 độ C và độ ẩm <60% thì Arduino xuất tín hiệu ra tại một chân náo đó kích relay, mở động cơ bơm nước.

Ở đây mình không giới thiệu lại phần cứng DHT11

Nào bắt đầu thôi:

2. Thực hiện:
Bước 1: Kết nối mạch như sơ đồ nguyên lí.

Bước 2: Tải thư viện hỗ trợ DHT11.
http://www.mediafire.com/file/kqv5fhsmo8vtdcd/dht11.rar
Bước 3: Copy code sau đó dán vào IDE.
Bước 4: Biên dịch code và đổ chương trình chạy thực nghiệm.

3. Code:

#include "DHT.h"
#define DHTPIN 6     
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() 
{
  lcd.begin(16,2);
  Serial.begin(9600); 
  Serial.println("DHTxx test!");
  dht.begin();
}
void loop() 
{
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(t) || isnan(h)) 
  {
    Serial.println("Failed to read from DHT");
  } 
  else 
  {
    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" *C");
    lcd.setCursor(4, 0);
    lcd.print("Do am");
    lcd.setCursor(9, 0);
    lcd.print(":");
    lcd.setCursor(10, 0);
    lcd.print(round(h));
    lcd.setCursor(12, 0);
    lcd.print("%");
    lcd.setCursor(2, 1);
    lcd.print("Nhiet do");
    lcd.setCursor(10, 1);
    lcd.print(":");
    lcd.setCursor(11, 1);
    lcd.print(round(t));
    lcd.setCursor(14, 1);
    lcd.print("C");
  }
}
//mail: tranduylinhvlute@gmail.com

Thứ Ba, 19 tháng 12, 2017

Arduino với DS1307 hiển thị thời gian thực lên màn hình LCD 16x2

Để ngắn gọn hơn và đi vào chủ đề chính mình không giới thiệu lại phần cứng hỗ trợ!

Bước 1: Kết nối như sơ đồ nguyên lí.
Đối với module thời gian thực DS1307 mặc dù nó có nhiều chân, nhưng ở đây mình chỉ sử dụng:
Chân Vcc
Chân GND
Chân SDA và SCL
***Chú ý: Module thời gian thực DS1307 đã tích hợp sẵn PIN.

Bước 2: Viết Code chạy thực nghiệm.

***Copy đoạn code bên dưới và dán vào chương trình IDE và nhớ thêm đúng thư viện hỗ trợ bên dưới link nhé!

Thư viện hỗ trợ.

1. RTClib-master
http://www.mediafire.com/file/dbctizgv7l4kcxl/RTClib-master.rar

2. LCD(LiquidCrystal)

Code tham khảo:

#include <LiquidCrystal.h>
#include <Wire.h>
#include "RTClib.h"
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup ()
{
  while (!Serial);
  lcd.begin(16,2);
  Serial.begin(57600);
  if (! rtc.begin())
  {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning())
  {
    Serial.println("RTC is NOT running!");
 
  }
}

void loop ()
{
    DateTime now = rtc.now();
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");
    DateTime future (now + TimeSpan(7,12,30,6));
    Serial.print(" now + 7d + 30s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    Serial.println();
    delay(3000);

    lcd.setCursor(0, 0);// cot  hang
    lcd.print(future.hour(), DEC);
    lcd.setCursor(2, 0);// cot  hang
    lcd.print(":");
    lcd.setCursor(3, 0);// cot  hang
    lcd.print(future.minute(), DEC);
    lcd.setCursor(5, 0);// cot  hang
    lcd.print(":");
    lcd.setCursor(6, 0);// cot  hang
    lcd.print(future.second(), DEC);
    lcd.setCursor(0, 1);// cot  hang
    lcd.print(future.day(), DEC);
    lcd.setCursor(2, 1);// cot  hang
    lcd.print("/");
    lcd.setCursor(3, 1);// cot  hang
    lcd.print(future.month(), DEC);
    lcd.setCursor(5, 1);// cot  hang
    lcd.print("/");
    lcd.setCursor(6, 1);// cot  hang
    lcd.print(future.year(), DEC);
 }
//Email: cuối web.