วันพฤหัสบดีที่ 27 กุมภาพันธ์ พ.ศ. 2563

Module:Control:IFR 520



MOSFET Module 

สวิตซ์ปิดเปิดไฟเหมือน Relay แต่เป็น Solid state (ไม่มีส่วนที่เคลื่อนไหว) มันทำงานที่ความถี่สูงได้เหมาะกับเอาไปใช้งาน PWM ด้วย

MOS Module (IRF520)

รุ่นนี้ถูกดีเลยซื้อมาลอง ในภาพมันตัวคล้ายๆกันกับตัวที่ผมใช้ไม่ใช่ภาพมันตรงๆ
ฝั่งไมโครคอนโทรลเลอร์
SIG 5V ดิจิตอลเพื่อสั่งเปิดปิด(ลอง 3.3V แล้วโวลต์จะตกเมื่อต่อโหลดกระแสคงไม่พอ)
VCC ไฟเลี้ยง 5V อาจจะไม่ต้องต่อก็ได้
GND ต่อกราวด์

ฝั่งแหล่งจ่ายไฟ
VIN แหล่งจ่ายไฟ ได้ถึง 24V (สูงสุด 5A ถ้า 1Aขึ้นไปควรต่อฮีตซิงค์)
GND กราวด์ของแหล่งจ่ายไฟ

ฝั่งอุปกรณ์
V- ต่อขั้วลบของโหลดหรืออุปกรณ์
V+ ต่อขั้วบวกของโหลดหรืออุปกรณ์


ตอนซื้อมาเวปจีนบอกว่าใช้กับลอจิก 3.3v แต่ลองแล้วไม่ได้ รุ่นนี้เหมาะกับ Arduino ที่ใช้ลอจิก 5V


F53955 Module 

เหมือน IRF520 รับกระแสและโวลต์ได้สูงกว่าราคาแพงกว่า ของยี่ห้อ DIY MORE แพงหน่อยแต่ใช้ได้ทั้ง 3.3และ 5V


ฝั่งไมโครคอนโทรลเลอร์ ตรงที่เป็น 2 เข็มขึ้นมา
+ ดิจิตอลเพื่อสั่งเปิดปิด 3.3-12V
- ต่อกราวด์ของแหล่งจ่ายไฟ

ฝั่งแหล่งจ่ายไฟ อยู่ตรงหางลูกศร
+ แหล่งจ่ายไฟ ได้ถึง 5-36V (สูงสุด 22A ถ้า 5Aขึ้นไปควรต่อฮีตซิงค์)
- กราวด์ของแหล่งจ่ายไฟ

ฝั่งอุปกรณ์ ตรงหัวลูกศร
+ ต่อขั้วบวกของโหลดหรืออุปกรณ์
- ต่อขั้วลบของโหลดหรืออุปกรณ์











วันพุธที่ 15 มกราคม พ.ศ. 2563

Module:Environment:MCU-811 CCS811

Air Quality Sensor Module CCS811

เซนเซอร์วัดคุณภาพอากาศ วัดก๊าซคาร์บอนไดออกไซด์ และ สารประกอบอินทรีย์ระเหยง่าย (Volatile Organic Compounds) การเชื่อมต่อเป็นแบบ i2c ใช้ address 0x5A

VCC ต่อ 3.3
GDN ต่อ Ground
SCL ต่อ 22
SDA ต่อ 21
WAK  ต่อ  Ground (ต้องต่อ Ground เพื่อ Wakeup Sensor)

ภาพจาก Adafruit


ให้ติดตั้ง Adafruit CCS811 Library แล้วลองตัวอย่าง
File->Examples->Adafruit_CCS811->CCS811_test


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "Adafruit_CCS811.h"
Adafruit_CCS811 ccs;
void setup() {
  Serial.begin(9600);
  Serial.println("CCS811 test");
  if(!ccs.begin()){
    Serial.println("Failed to start sensor! Please check your wiring.");
    while(1);
  }
  // Wait for the sensor to be ready
  while(!ccs.available());
}
void loop() {
  if(ccs.available()){
    if(!ccs.readData()){
      Serial.print("CO2: ");
      Serial.print(ccs.geteCO2());
      Serial.print("ppm, TVOC: ");
      Serial.print(ccs.getTVOC());
      Serial.print("ppb, Temp: ");
      Serial.print(ccs.calculateTemperature());
      Serial.println();
    }
    else{
      Serial.println("ERROR!");
      while(1);
    }
  }
  delay(500);
}


ค่าของอุณหภูมินำมาใช้งานอะไรไม่ค่อยได้เท่าไหร่เท่าที่ทดสอบมันแกว่งไปมาง
แนะนำให้ทำการ burn-in โดยการใช้งาน 48ช.ม. ก่อนวัดค่าจริง และก่อนใช้งานทุกครั้งควรเปิดทิ้งไว้  20 นาทีก่อน เพราะความไวของเซนเซอร์จะเปลี่ยนแปลงตอนเริ่มใช้งานแรกๆ

Note


สารประกอบอินทรีย์ระเหยง่าย (VOCs) ในบรรยากาศจัดเป็นอากาศพิษ (Toxic Air) ซึ่งในชีวิตประจำวันเราได้รับสารชนิดนี้จากผลิตภัณฑ์หลายอย่าง เช่า สีทาบ้าน
ควันบุหรี่ น้ำยาฟอกสี สารตัวทำละลายในการพิมพ์ อู่พ่นสีรถยนต์ โรงงานอุตสาหกรรม น้ำยาซักแห้ง น้ำยาสำหรับย้อมผมและดัดผม สารกำจัดศัตรูพืช
สารที่เกิดจากการเผาไหม้และปนเปื้อนในอากาศ น้ำดื่ม อาหาร และเครื่องดื่ม

เพิ่มเติม
Adafruit CCS811 Air Quality Sensor

วันเสาร์ที่ 7 ธันวาคม พ.ศ. 2562

ESP32:Coding:Network:ThingSpeak

วิธีการเก็บค่า Sensor บน ThingSpeak

  ThingSpeak เป็นบริการเก็บข้อมูลโดยอิงกับเวลา เก็บไปเรื่อยๆเพื่อสร้างกราฟ สามารถนำไปวิเคราห์ด้วยโปรแกรม MathLAB ได้ ถ้าเก็บข้อมูลไม่มากนักใช้ได้ฟรี ก่อนใช้งานควรอ่านข้อจำกัดของบริการฟรีให้เรียบร้อย หลักๆคืออย่าส่งข้อมูลถี่จนเกินไป แนะนำให้ส่งทุกๆ 15นาทีหรือห่างกว่านั้น ในตัวอย่างจะส่งทุกๆหนึ่งนาที (6000 มิลลิวินาที)
    ไปที่ https://thingspeak.com/ ทำการ Sign Up ให้เรียบร้อยแล้ว สร้าง Channel แล้วเปิดใช้งาน field1 กับ field2 เพื่อเก็บค่า Hall และ Temperature นำค่า API Key มาใส่ในโค้ดด้านล่าง  ค่า "SSID" และ "password" ให้แก้เป็น Wifi ที่เราเชื่อมต่อ API ย่อมาจาก Application Programming Interface สำหรับคนไม่รู้จักดูความหมายได้ที่นี้
    ตัวอย่างนี้จะใช้เซนเซอร์ภายใน ESP32 อ่านค่าอุณหภูมิจากและสนามแม่เหล็ก(Hall) ค่าอุณหภูมิจะเป็นอุณหภูมิของ ESP32 ซึ่งจะสูงกว่าอุณหภูมิห้อง ตัวอย่างดัดแปลงมาจากเวปนี้ (แนะนำให้เข้าไปอ่านดู) สามารถเข้าไปดูวิธีการเซ็ตอัป ThingSpeak สำหรับตัวอย่างนี้ได้
การส่งข้อมูลด้านล่างจะเป็นแบบ Method GET คือส่งค่าผ่าน URL
สามารถทดสอบแบบง่ายๆโดยการใส่ลิงค์นี้ลงบนเว็บ เบราว์เซอร์
https://api.thingspeak.com/update.json?api_key=API_KEY&field1=1234&field2=35
แล้วไปดูกราฟ ใน Private View
ตรง #ifdef __cplusplus , extern "C" { , และ #endif สำหรับคนที่ไม่เชี่ยวชาญภาษา C++ อาจจะงงหน่อย นำไปใช้ก่อนแล้วกันมันจำเป็นสำหรับการเรียกใช้ฟังก์ชั่น temprature_sens_read() ซึ่งเป็นฟังก์ชั่นของระบบ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#ifdef __cplusplus
extern "C" {
#endif
uint8_t temprature_sens_read();
#ifdef __cplusplus
}
#endif
uint8_t temprature_sens_read();

#include <WiFi.h>
String apiKey = "API_KEY";  //ใส่ API Key ที่ได้รับจาก ThingSpeak
const char *ssid =  "SSID"; // Wifi ที่เชื่อมต่อ และรหัสผ่าน
const char *pass =  "password";
const char* server = "api.thingspeak.com";
WiFiClient client;
void setup() {
  Serial.begin(9600);
  delay(10);
  Serial.println("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) 
  {
      delay(500);
      Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
}

void loop() {
  //ใช้ GET method ฟอร์แม็ตเป็นดังข้างล่าง
  //https://api.thingspeak.com/update.json?api_key=API_KEY_HERE&field1=1234&field2=35
  int h = hallRead();
  float t = ((temprature_sens_read()-32)/1.8); //changing temperature parameter to celsius
  if (client.connect(server,80))
  {
    Serial.println("ThingSpeak  connected");      
    String url = "/update.json?api_key="+apiKey +"&field1=";
    url += String(h);
    url += "&field2=";
    url += String(t);

    Serial.print("Requesting URL: ");
    Serial.println(url);
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + server + "\r\n" +
                 "Connection: close\r\n\r\n");
    unsigned long timeout = millis();
    while (client.available() == 0) {
      if (millis() - timeout > 20000) {
        Serial.println(">>> Client Timeout !");
        client.stop();
        return;
      }
    }
    while(client.available()) { //ข้อความที่ตอบกลับจาก server
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }
  }else{
    Serial.println("Connection fail"); 
  }
  Serial.println("");
  client.stop();
  Serial.println("Waiting...");
  delay(60000); //รอหนึ่งนาที(60000 มิลลิวินาที)
}


ตัวอย่างด้านล่างนี้เป็นแบบ Method POST จะการส่งค่าเหมือนการส่งผ่านฟอร์มบนเวป


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#ifdef __cplusplus
extern "C" {
#endif
uint8_t temprature_sens_read();
#ifdef __cplusplus
}
#endif
uint8_t temprature_sens_read();

#include <WiFi.h>
String apiKey = "API_KEY"; //  ใส่ API Key ที่ได้รับจาก ThingSpeakconst char *ssid =  "ssid";          // ชื่อไวไฟที่ต่อ
const char *pass =  "password";   // รหัสผ่าน
const char* server = "api.thingspeak.com";
WiFiClient client;
void setup() 
{
  Serial.begin(9600);
  delay(30);
  Serial.println("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
}
void loop() 
{
  int h = hallRead();
  float t = ((temprature_sens_read()-32)/1.8); //ทำอุณหภูมิเป็นเซลเซียส

  if(client.connect(server,80))              //เชื่อมต่อไปยัง api.thingspeak.com
  {                          
    String postStr = apiKey;
    postStr +="&field1=";
    postStr += String(h);
    postStr += "&field2=";
    postStr += String(t);
    postStr += "\r\n\r\n";

    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(postStr.length());
    client.print("\n\n");
    client.print(postStr);
    
    unsigned long timeout = millis();
    while (client.available() == 0) {
      if (millis() - timeout > 20000) {
          Serial.println(">>> Client Timeout !");
          client.stop();
          return;
      }
    }
    while(client.available()) { //ข้อความที่ตอบกลับจาก server
      String line = client.readStringUntil('\r');
      Serial.print(line);
    } 
    Serial.print("");
    Serial.print("Hall: ");
    Serial.println(h);
    Serial.print("Temperature:");
    Serial.print(t);
    Serial.println(" C");                          
    Serial.println("%. Send to Thingspeak.");
  }else{
    Serial.println(h);
  }
  client.stop();
  Serial.println("Waiting...");
  delay(60000); //รอหนึ่งนาที(60000 มิลลิวินาที)
}

การใช้งานหน้าเวปจะมีลักษณะใช้งานRequest และ Respond
Request เพื่อขอหน้าเวป ด้วย Method GET หรือ POST จะมีการส่งข้อมูลพร้อมไปด้วย
Respond จะส่งหน้าเวปกลับมา หลังประมวลผลข้อมูลที่ส่งไป
ในภายหลังนิยมใช้เวปเซิร์ฟเวอร์เพื่อประมวลผลแทนการสร้างเซิร์ฟเวอร์เฉพาะทางแบบเดิมเลยมีคอนเซ็บของ Web API ขึ้นมา การติดต่อผ่านเวป(โปรโตคอล HTTP) จะต้องมีการส่งค่าบางอย่างไปด้วยจะทำให้ดูมีอะไรซับซ้อนหน่อย หลังจากทำการ Request ก็จะได้ค่าตอบกับมา เช่นสำเร็จ หาหน้าเวปไม่เจอ ฯลฯ ในตัวอย่างจะใช้ client.readStringUntil('\r'); เพื่ออ่านค่าที่ตอบกลับมาทีละบรรทัด ซึ่งจะพิมพ์ออก Serial Monitor ไม่ได้ใช้ทำอะไร เราควรรอให้เวปทำการ Respond เสียก่อนจะเลือกติดต่อเพราะไม่งั้นการ Request อาจจะล้มเหลวได้
    ถ้าใช้ Library Manager ติดตั้งไลบารีของ ThingSpeak  จะมีโค้ดตัวอย่างจะดูง่ายกว่าใช้ WiFiClient ดังที่ใช้ในตัวอย่างหน่อยหนึ่ง แต่เท่าที่ลองใช้มันมีปัญหากับไลบารี่บางตัว เลยแนะนำให้ใช้ดังตัวอย่างข้างต้น


เพิ่มเติม
NETPIE FEED vs ThingSpeak Channel




วันศุกร์ที่ 29 พฤศจิกายน พ.ศ. 2562

ESP32:Coding:Network:Time

Network Time from NTP Server

    อุปกรณ์ไฟฟ้าทั่วๆไป ถ้าขาดไฟฟ้า เช่นปิดอยู่จะไม่สามารถนับเวลาที่เดินไปเรื่อยๆได้ เปิดมาก็ต้องตั้งค่าเวลาใหม่ ถ้าต้องการค่าเวลาต้องต่อกับ Real Time Clock (RTC) ที่มีไฟเลี้ยง เพื่อให้นาฟิกาเดินไปเรื่อยๆ ซึ่งต้องมีค่าใช้จ่ายเพิ่ม และต้องตั้งเวลาใหม่เมื่อแบตเตอรี่หมด ถ้าอุปกรณ์สามารถต่อกับเน็ตเวิร์กได้  ก็จะดึงค่าเวลาจากเน็ตเวิร์กเพื่อตั้งเวลาและนับเวลาต่อไปเรื่อยๆได้ ในอินเตอร์เน็ตจะมีเซิร์ฟเวอร์ NTP ( Network Time Protocol) ใช้บอกเวลาให้เรา เป็นเวลามาตรฐาน Coordinated Universal Time (UTC) ซึ่งเป็นค่าเดียวกันทั่วโลก ในแต่ละท้องถิ่นจำเป็นต้องปรับจากค่านี้ให้ตรงกับเขตเวลาในแต่ละท้องถิ่น ประเทศไทยจะใช้ UTC+7 ก็คือเพิ่มจากเวลามาตรฐาน 7ช.ม. ค่าของโซนเวลาที่เราจะใช้ปรับกับเวลามาตรฐาน (Time Offset) ต้องเป็นหน่วยมิลลิวินาที โดยแปลงจากหน่วยชั่วโมง ยกตัวอย่าง
UTC -5 จะมีค่า -5 * 60 * 60 = -18000
UTC +7 จะมีค่า 7 * 60 * 60 = 25200
บางประเทศจะมีช่วงเวลากลางวันกลางคืนที่แตกต่างกันมากในแต่ละฤดูจำเป็นต้องปรับเวลาท้องถิ่นให้ตรงกับฤดูต่างๆ (Daylight saving time) แต่ประเทศไทยไม่จำเป็นต้องปรับ  เพราะกลางวันกลางคืนแตกต่างกันไม่มากจึงใช้ค่านี้เป็น Daylight Offset เป็น 0 การใช้ดูโค้ดตัวอย่าง
Examples/ESP32/Time/SimpleTime


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <WiFi.h>
#include "time.h"
const char* ssid       = "SSID";
const char* password   = "PASSWORD";
const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 25200; //UTC+7
const int   daylightOffset_sec = 0;//ไทยไม่ต้องปรับ
void setup()
{
  Serial.begin(9600); 
  //connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.println(" CONNECTED"); 
  //ดึงเวลาจากเซิร์ฟเวอร์ NTP แล้วเก็บในระบบ
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime(); //พิมออกมา
  //ไม่จำเป็นต้องใช้ Wifi อีกต่อไป
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}
void loop()
{
  delay(1000);
  printLocalTime();
}
void printLocalTime()
{
  struct tm timeinfo; //ที่เก็บข้อมูลเวลา
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }//แสดงค่าด้วยวิธีต่างๆ
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
  Serial.print(asctime(&timeinfo));
  String date_time = String(timeinfo.tm_year+1900)+"/"+String(timeinfo.tm_mon+1)+"/"+String(timeinfo.tm_mday);
  date_time += " "+String(timeinfo.tm_hour)+":"+String(timeinfo.tm_min)+":"+String(timeinfo.tm_sec);
  Serial.println(date_time);
  Serial.println("");

}

ผลของโปรแกรมผ่าน Serial Monitor

Connecting to oom .... CONNECTED
Tuesday, December 03 2019 06:35:10
Tue Dec  3 06:35:10 2019
2019/12/3 6:35:10

Tuesday, December 03 2019 06:35:11
Tue Dec  3 06:35:11 2019
2019/12/3 6:35:11


หลังจากเรียกฟังก์ชั่น configTime() ค่าของเวลาจะเก็บไว้ในระบบเลย แล้วเราใช้ getLocalTime() เพื่อเรียกใช้


เพิ่มเติม
Getting Date & Time From NTP Server With ESP32
Time structure


วันพฤหัสบดีที่ 21 พฤศจิกายน พ.ศ. 2562

Module:Environment:BME280

Module BME280

    เป็นโมดูลวัดอุณหภูมิความชื้นและความดันอากาศ มีหลายรุ่น หน้าตาหลายแบบ ที่ผมใช้เป็นดังภาพภาพ รองรับการสื่อสารแบบ I2C และ SPI บางรุ่น ที่มี 4 ขารองรับแค่ I2C อย่างเดียว

BME-280 แบบ 6 ขารองรับ SPI และ I2C

รุ่นที่คล้ายกันมากคือ BMP280 (ดู P กับ E)จะถูกกว่าไม่สามารถวัดความชื้นได้ หน้าตาแทบเหมือนกันบางทีคนขายก็เอา BMP280 มาขายเป็น BME280 ดูยากมากเพราะที่แตกต่างกันคือเซเซอร์ที่เป็นกล่องเงินๆตัวเล็กๆที่อยู่ตรงกลาง ต้องใช้แว่นขยายดูเบอร์ ถ้าโค้ดเป็นตัว U ก็เป็น BME280 ของแท้  วิธีการดูในรายละเอียดผมใส่ในลิงค์ด้านล่าง ลองโปรแกรมเลยก็ได้ถ้าถูกรุ่นถึงจะใช้งานได้  ให้ติดตังไลบารี ให้เรียก Library Manager ขึ้นมา โดยเข้าไปที่ Sketch > Incude Library > Manage Libraries …
ค้น BME280 ติดตั้งของ Adafruit
VCC ต่อ 3.3v
GND ต่อ Ground
SCL ต่อ 22
SDA ต่อ 21

ขณะนี้ไลบารี่ของ Adafruit รุ่น 2.0.x มีปัญหาในการใช้งานโค้ดด้านล่างอาจจะไม่สามารถใช้งานได้ แนะนำให้ใช้ 1.1.0  ลงมา


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25) //ความกดอากาศที่ระดับน้ำทะเล
Adafruit_BME280 bme;                   // ตัวอย่างใช้การเชื่อมต่อ I2C
unsigned long delayTime;
void setup() {
    Serial.begin(9600);
    if (!bme.begin()) {
        Serial.println("Invalid BME280 sensor, check wiring, address, sensor ID!");
        Serial.print("SensorID was: 0x"); Serial.println(bme.sensorID(),16);
        while(1);
    }
}
void loop() { 
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");
    Serial.print("Pressure = ");
    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa");
    Serial.print("Approx. Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");
    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");
    Serial.println();
    delay(1000);
}



เราสามารถหาค่าความสูงจากระดับน้ำทะเลได้เป็นของแถม เมื่อเทียบความดันอากาศ ณ ตำแหน่งที่เราวัดกับความดันอากาศที่ระดับน้ำทะเล ซึ่งจะมีค่า 101,325 Pa (1,013.25 hPa; 1,013.25 mbar)มีค่าเท่ากับ 760 mm Hg, 29.9212 inches Hg หรือ 14.696 psi

เพิ่มเติม


วันอาทิตย์ที่ 17 พฤศจิกายน พ.ศ. 2562

Module:Environment:DHT11/DHT22(AM2302)

Module DHT11/DHT22(AM2302)

โมดูล DHT22/AM2302



    เป็นโมดูลสำหรับวัดอุณหภูมิและความชื้น ให้ค่าออกเป็นดิจิตอล เป็นเซนเซอร์รุ่นยอดนิยม DHT11 และ DHT22 การใช้งานเหมือนกันการวางขาก็เหมือนกัน แต่ความละเอียดในการวัดต่างกัน
เซนเซอร์เปล่าๆ ต้องต่อตัวต้นทาน 10K วงจร Pullup ถ้าเป็นโมดูก็พร้อมใช้งานเลย
เซนเซอร์ DHT22


1 3-5V
2 ต่อขาดิจิตอลอินพุตของบอร์ด ต่ด 10k Ohm pull-up resistor
3 ไม่ได้ใช้
4 GND

ถ้าเป็นโมดูลจะเห็นแค่สามขา ตัดขา 3 ออก

DHT11
DHT22
Temperature range0 to 50 ºC +/-2 ºC-40 to 80 ºC +/-0.5ºC
Humidity range20 to 90% +/-5%0 to 100% +/-2%
ResolutionHumidity: 1%
Temperature: 1ºC
Humidity: 0.1%
Temperature: 0.1ºC
Operating voltage3 – 5.5 V DC3 – 6 V DC
Current supply0.5 – 2.5 mA1 – 1.5 mA
Sampling period1 second2 seconds
ติดตั้งไลบารี DHT sensor ( by Adafruit) ผ่าน Library Manager ก่อนใช้โค้ดด้านล่าง แก้ค่า DHTPIN และเลือก DHTTYPE ว่าจะใช้ DHT11 หรือ DHT22 โค้ดเอามาจาก DHTtest ที่มากับตัวอย่าง

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// ESP32: อ่านค่าเซนเซอร์ DTHxx 
#include "DHT.h" ติดตั้ง DHT sensor library by Adafruit ก่อน
#define DHTPIN 12     // ขา GPIO ที่อ่านค่า

// เลือกว่าจะใช้ตัวไหนให้เอาคอมเมนต์ออก
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  Serial.println(F("DHTxx test!"));
  dht.begin();
}
void loop() {
  delay(2000); //พักรอเล็กน้อยระหว่างอ่านค่า
  //ใช้เวลาอ่าน  0.25 วินาที อาจจะถึง 2 วินาที
  float h = dht.readHumidity();       //ความชื้น 
  float t = dht.readTemperature();    //อุณหภูมิเป็นเซลเซียส (Default)
  float f = dht.readTemperature(true);//อุณหภูมิเป็นฟาเรนไฮต์(isFahrenheit = true)

  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    return; // อ่านค่าไม่ได้กลับไปอ่านต่อ
  }
  //คำนวณ heat index เป็นฟาเรนไฮต์ (default)
  float hif = dht.computeHeatIndex(f, h); 
  //คำนวณ heat index เป็นเซลเซียส (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);
  Serial.print(F("Humidity: "));
  Serial.print(h);
  Serial.print(F("%  Temperature: "));
  Serial.print(t);
  Serial.print(F("°C "));
  Serial.print(f);
  Serial.print(F("°F  Heat index: "));
  Serial.print(hic);
  Serial.print(F("°C "));
  Serial.print(hif);
  Serial.println(F("°F"));
}



เพิ่มเติม
Arduino library for DHT11, DHT22, etc Temperature & Humidity Sensors



Module:RTC

Module Real Time Clock

    Real Time Clock(RTC) อุปกรณ์ไฟฟ้าทุกตัวถ้าจะตัองการใช้ค่าเวลา ต้องมีนาฬิกาอยู่ใน ถ้าถอดปลักออกอุปกรณ์หยุดทำงาน แต่นาฬิกาต้องเดินต่อไป ดังนั้นต้องมีแบตเตอรี่เป็นไฟเลี้ยง(เฉพาะนาฬิกา)  เมื่อเปิดเครื่องขึ้นมาใหม่ก็ยังเห็นเวลาที่ถูกต้อง คอมพิวเตอร์และโน้ตบุ๊กที่ใช้่เป็นเวลานานหลายปีเวลาจะไม่ถูกต้อง ก็ต้องเปลี่ยนแบ็ตเตอรี่ซึ่งจะเป็นถ่านกระดุม สำหรับไมโครคอนโทรลเลอร์ก็เช่นกัน ถ้าต่ออินเตอร์เน็ตตลอดเวลาอาจใช้เวลาจากเน็ตเวิร์กก็ได้ แต่ถ้าไม่ได้ต่อเน็ตเวิร์กอาจจำเป็นต้องใช้ โมดูล RTC มีหลายรุ่นให้เลือกใช้งาน

โมดูล DS3231 for Pi

ใช้การเชื่อมต่อแบบ I2C เป็นรุ่นสำหรับ Raspberry Pi แต่ก็ใช้กับบอร์ดรุ่นอื่นๆที่สนับสนุน I2C ได้ แค่ต่อขาให้ถูก
RTC สำหรับ Raspberry PI
ขาในภาพต้องส่งดูสัญลักษณ์บนบอร์ด ไล่จากซ้ายไปขวา
+  ต่อไฟ 3.3โวลต์
D SDA (ใช้ขา 21)
C SCL (ใช้ขา 22)
NC ไม่ได้ใช้
- ต่อ Ground
ให้ติดตั้ง RTClib ด้วย Library Manager เลือกที่เป็น by Adafruit จะมี Library เพิ่มเติมให้ตอบตกลงไปโปรแกรมจะอ่านค่าเวลาจาก RTC ถ้าไม่ได้ตั้งเวลาไว้เพราะเอาแบตเตอรี่ออก ก็จะตั้งเวลาใหม่โดยใช้ วันเวลาตอนคอมไพล์โค้ด RTC รุ่นนี้จะตั้งเวลามาเรียบร้อยแล้ว แต่อาจจะไม่ตรงนักต้องตั้งใหม่

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <Wire.h> 
#include "RTClib.h"  // by Adafruit 
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup () {
  Serial.begin(9600);
  delay(3000); // wait for console opening
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }
  if (rtc.lostPower()) { //เวลาที่เก็บใน RTC ใช้ไม่ได้ต้องตั้งใหม่
    Serial.println("RTC lost power, lets set the time!");
    // January 21, 2014 at 3am ให้ใช้ rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //เซ็ตวันและเวลา ให้เป็นเวลาของโค้ด
  }
}
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()); // UNIX time เริ่มจาาก  1/1/1970
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");
    
    // คำนวณเวลา ไปข้างหน้า 7 วันกับ 30 วินาที 
    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);
}


Module:Control:IFR 520

MOSFET Module  สวิตซ์ปิดเปิดไฟเหมือน Relay แต่เป็น Solid state (ไม่มีส่วนที่เคลื่อนไหว) มันทำงานที่ความถี่สูงได้เหมาะกับเอาไปใช้งาน PWM ...