นวัตกรรม สิ่งประดิษฐ์ และเทคโนโลยี

กรุณา เข้าสู่ระบบ หรือ สมัครสมาชิก.

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
การค้นหาขั้นสูง  

แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - NAWATTAKAM

หน้า: [1] 2 3 ... 24
1
อุปกรณ์ IO / โมดุลเข็มทิศ GY-271 : QMC5883L
« เมื่อ: เมษายน 20, 2019, 08:52:49 AM »
ดาวส์โหลด LIB : https://github.com/dthain/QMC5883L


โค๊ด
#include <QMC5883L.h>
#include <Wire.h>

QMC5883L compass;

void setup()
{
Wire.begin();

compass.init();
compass.setSamplingRate(50);  /// Hertz

Serial.begin(9600);

}

void loop()
{
 

 //////////////////// compass 
int angle = compass.readHeading();
if(angle==0) {
/* Still calibrating, so measure but don't print */
} else
{
     Serial.print(" Degree ");
     
     if (angle > 337 || angle < 23)  {Serial.print("N : ");}
else if (angle > 22 && angle < 68)   {Serial.print("NE : ");}
else if (angle > 67 && angle < 113)  {Serial.print("E : ");}
else if (angle > 112 && angle < 158) {Serial.print("SE : ");}
else if (angle > 157 && angle < 203) {Serial.print("S : ");}
else if (angle > 202 && angle < 248) {Serial.print("SW : ");}
else if (angle > 247 && angle < 293) {Serial.print("W : ");}
else if (angle > 292 && angle < 338) {Serial.print("NW : ");}

 Serial.println(angle);
   
}
}

กรณีต้องการอ่านค่าสนามแม่เหล้กทั้ง 3 แกน

โค๊ด
int16_t Fx,Fy,Fz,t;
compass.readRaw(&Fx,&Fy,&Fz,&t);

  Serial.print( X: "); Serial.print( Fx);  Serial.print(" ,Y: "); Serial.print(Fy);  Serial.print(" ,Z: "); Serial.print( Fz); 


3
เชื่อมต่อ / UNO แสดงพิกัด GPS + LCD20*4 แบบ I2C
« เมื่อ: เมษายน 04, 2019, 08:50:42 PM »
การต่อขา
- ขา 3.3V ต่อเข้า VCC ของ GPS
- ขา GND ต่อร่วมกันทั้ง LCD และ GPS
- ขา Tx ของ GPS ต่อเข้าขา 10 ของ UNO (ทำขา Rx ด้วย ซอร์ฟแวร์ซีเรียล)
- ขา SCL และ SDA ของ LCD ต่อเข้า ขา SCL และ SDA ของ UNO

* ติดตั้งไลบารี่  TinyGPS++ ก่อน  จาก http://arduiniana.org/libraries/tinygpsplus/

หรือ
นำTinyGPS++.h และ TinyGPS++.cpp ไปไว้โฟลเดอร์เดียวกับไฟล์งาน 
 

ARDUINO UNO
โค๊ด
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h> //ประกาศ Library ของจอ I2C
#include "TinyGPS++.h" //// ไฟล์อยู่ที่เดียวกับไฟล์งาน


LiquidCrystal_I2C lcd(0x27, 20, 4);  /// เลือกใช้จอ LCD แบบ I2C ขนาด 20 *4

SoftwareSerial serial_connection(10, 11); // RX=pin 10, TX=pin 11 

TinyGPSPlus gps;


void setup() {
  Serial.begin(9600);
  serial_connection.begin(9600);

   
lcd.begin();

lcd.setCursor(0,0);   
lcd.print("TIME : ");


lcd.setCursor(0, 1); 
lcd.print("LO   :");

lcd.setCursor(0,2); 
lcd.print("LA   : ");

lcd.setCursor(0,3);   
lcd.print("ALT  : ");


}




void loop() { // run over and over

  while(serial_connection.available())
{
gps.encode(serial_connection.read());
}


if(gps.location.isUpdated())
{

//// แสดงเวลาจากดาวเทียม +7 ตามโซนประเทศไทย และ % (modulo) 24 เพื่อแสดงแค่ 0-23
lcd.setCursor(7,0); 
lcd.print( (gps.time.hour()+7)%24);  lcd.print(":"); lcd.print(gps.time.minute()); lcd.print(":"); lcd.print(gps.time.second());

lcd.setCursor(7,1);   
lcd.print(gps.location.lng(), 6);

lcd.setCursor(7,2);   
lcd.print(gps.location.lat(), 6);


lcd.setCursor(7,3); 
lcd.print(gps.altitude.meters());


}

}



การแสดงผล


ฟังชั่นอื่นๆ ที่น่าสนใจ

โค๊ด
Serial.println(gps.location.lat(), 6); // Latitude in degrees (double)
Serial.println(gps.location.lng(), 6); // Longitude in degrees (double)
Serial.print(gps.location.rawLat().negative ? "-" : "+");
Serial.println(gps.location.rawLat().deg); // Raw latitude in whole degrees
Serial.println(gps.location.rawLat().billionths);// ... and billionths (u16/u32)
Serial.print(gps.location.rawLng().negative ? "-" : "+");
Serial.println(gps.location.rawLng().deg); // Raw longitude in whole degrees
Serial.println(gps.location.rawLng().billionths);// ... and billionths (u16/u32)
Serial.println(gps.date.value()); // Raw date in DDMMYY format (u32)
Serial.println(gps.date.year()); // Year (2000+) (u16)
Serial.println(gps.date.month()); // Month (1-12) (u8)
Serial.println(gps.date.day()); // Day (1-31) (u8)
Serial.println(gps.time.value()); // Raw time in HHMMSSCC format (u32)
Serial.println(gps.time.hour()); // Hour (0-23) (u8)
Serial.println(gps.time.minute()); // Minute (0-59) (u8)
Serial.println(gps.time.second()); // Second (0-59) (u8)
Serial.println(gps.time.centisecond()); // 100ths of a second (0-99) (u8)
Serial.println(gps.speed.value()); // Raw speed in 100ths of a knot (i32)
Serial.println(gps.speed.knots()); // Speed in knots (double)
Serial.println(gps.speed.mph()); // Speed in miles per hour (double)
Serial.println(gps.speed.mps()); // Speed in meters per second (double)
Serial.println(gps.speed.kmph()); // Speed in kilometers per hour (double)
Serial.println(gps.course.value()); // Raw course in 100ths of a degree (i32)
Serial.println(gps.course.deg()); // Course in degrees (double)
Serial.println(gps.altitude.value()); // Raw altitude in centimeters (i32)
Serial.println(gps.altitude.meters()); // Altitude in meters (double)
Serial.println(gps.altitude.miles()); // Altitude in miles (double)
Serial.println(gps.altitude.kilometers()); // Altitude in kilometers (double)
Serial.println(gps.altitude.feet()); // Altitude in feet (double)
Serial.println(gps.satellites.value()); // Number of satellites in use (u32)
Serial.println(gps.hdop.value()); // Horizontal Dim. of Precision (100ths-i32)

4
ปกติ ภาษา Html ในการแสดงพื้นหลังจะใช้คำสั่ง

โค๊ด
<body background=" ภาพ.jpg"> 

แต่ในคำสั่งภาษาซี จะมีปัญหาในการใส่ " ในคำสั่ง print
แก้ไขโดยการใช้ รหัสแอสกีแทน คือ \34 หรือ \" แทน "

ตัวอย่างการใช้ ภาพจาก https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png




โค๊ด
client.println("<html>");

//////////////   แสดง <body background="https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png">

client.print("<body background=");
client.print("\34") ; 
client.print("https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"); 
client.print("\34");
client.println(">");
         
client.println("</body>"); 
client.println("</html>");



5
ดาวส์โหลด LiquidCrystal_I2C.h
ที่ https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library


การต่อขา

NodeMCU V3 - LCD

    VU - VCC
    G - GND
    D1 - SCL
    D2 - SDA


โค๊ด
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); //ถ้าจอไม่แสดงผล ให้ลองเปลี่ยน 0x3F เป็น 0x27

void setup()
{
lcd.begin();
lcd.setCursor(3, 0); // ไปที่ตัวอักษรที่ 3 บรรทัดที่ 0
lcd.print("LCD ESP8266");

lcd.setCursor(1, 1); // ไปที่ตัวอักษรที่ 0 บรรทัดที่ 1
lcd.print("Nawattakam.com");
}

void loop()
{
}




6
ใช้ A0 วัดสัญญาณ ค่า 0-3.3V

โดยใช้ฟังชั่น analogRead(; อ่านค่า จะค่า 0-1023
และใช้ readVolte() แปลงเป็นค่าแรงดัน


โค๊ด
#include <ESP8266WiFi.h>

int adc = A0;

const char* ssid = "3BB_xxxxx"; //// ใส่ชื่อ wifi
const char* password = "YYYYYYY";   //// ใส่พาสเวิร์ด wifi

String readStrings = ""; // สร้างตัวแปรมาเก็บข้อมูลค่าที่ส่งเข้ามา

WiFiServer server(80); //สร้าง object ของ class WiFiServer ขึ้นมาและส่งค่าพารามิเตอร์ 80 เพื่อกำหนดพอร์ต

void setup() {
  Serial.begin(9600); //กำหนด baudrate
  delay(10);

  Serial.println();
  Serial.print("Connecting to ");

  Serial.println(ssid); //แสดงข้อความ Connecting to (ชื่อ SSID ที่เราตั้ง) ผ่านทาง Serial
 
  WiFi.begin(ssid, password); // เริ่มเชื่อมต่อไปยัง ssid และ password ที่เรากำหนด
 
  while (WiFi.status() != WL_CONNECTED) { // ถ้ายังไม่เชื่อมต่อกับ wifi ให้ทำการวน loop ไปเรื่อย ๆ และ print ข้อความ ... ออกมา
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");//เมื่อเชื่อมต่อกับ wifi ได้แล้วให้ แสดง WiFi connected ผ่าน Serial
 
  // Start the server
  server.begin(); //ให้ทำการเริ่ม server
  Serial.println("Server started"); //แสดงข้อความว่า Server started ผ่าน Serial

  // Print the IP address
  Serial.println(WiFi.localIP()); //แสดง IP Address ทาง Serial

pinMode(adc, INPUT);

}

double readVolte() {
//สูตรคำนวน volte = ค่าที่อ่านได้จาก A0 * Vcc สูงสุดคือ 3.3V / ค่าที่อ่านได้สูงสุดจาก A0 คือ 1023;
int val = analogRead(adc);
double cal = val * 3.3 / 983;
return cal;
}


void loop() {


 Serial.println(readVolte());
  // put your main code here, to run repeatedly:
  WiFiClient client = server.available(); // สร้าง object ชื่อ client จาก class WiFiClient ให้เท่ากับ Server.available()
 if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    bool currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
   
       if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 0.5");  // refresh the page automatically every 0.5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.print("analog input ");
          client.print(readVolte());
          client.println(" V <br />");
          client.println("</html>");
        break;
      }
      if (c == '\n') {
        // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
         currentLineIsBlank = false;
      }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
  }

 



7
จาก
https://robotics-za.blogspot.com/2015/06/nodemcu-v2-4-web-server-relay.html



การต่อ
ขา -> LED ขา A -> ตัวต้านทาน -> ขา GND






โค๊ด
#include <ESP8266WiFi.h>

const char* ssid = "3BB_xxx"; //// ใส่ชื่อ wifi
const char* password = "YYYYYYYY";   //// ใส่พาสเวิร์ด wifi

String readStrings = ""; // สร้างตัวแปรมาเก็บข้อมูลค่าที่ส่งเข้ามา

int pin1 = 16; //(D0)
int pin2 = 5; //(D1)
int pin3 = 4; // (D2)
int pin4 = 2; // (D3)

WiFiServer server(80); //สร้าง object ของ class WiFiServer ขึ้นมาและส่งค่าพารามิเตอร์ 80 เพื่อกำหนดพอร์ต

void setup() {
  Serial.begin(9600); //กำหนด baudrate ที่ 115200
  delay(10);
 
  pinMode(pin1,OUTPUT); //เซต pin1 ให้เป็น output
  pinMode(pin2,OUTPUT); //เซต pin2 ให้เป็น output
  pinMode(pin3,OUTPUT); //เซต pin3 ให้เป็น output
  pinMode(pin4,OUTPUT); //เซต pin4 ให้เป็น output
 
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid); //แสดงข้อความ Connecting to (ชื่อ SSID ที่เราตั้ง) ผ่านทาง Serial
 
  WiFi.begin(ssid, password); // เริ่มเชื่อมต่อไปยัง ssid และ password ที่เรากำหนด
 
  while (WiFi.status() != WL_CONNECTED) { // ถ้ายังไม่เชื่อมต่อกับ wifi ให้ทำการวน loop ไปเรื่อย ๆ และ print ข้อความ ... ออกมา
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");//เมื่อเชื่อมต่อกับ wifi ได้แล้วให้ แสดง WiFi connected ผ่าน Serial
 
  // Start the server
  server.begin(); //ให้ทำการเริ่ม server
  Serial.println("Server started"); //แสดงข้อความว่า Server started ผ่าน Serial

  // Print the IP address
  Serial.println(WiFi.localIP()); //แสดง IP Address ทาง Serial

}

void loop() {
  // put your main code here, to run repeatedly:
  WiFiClient client = server.available(); // สร้าง object ชื่อ client จาก class WiFiClient ให้เท่ากับ Server.available()
 
  if(client){ //ถ้ามี client เชื่อมต่อ ให้เข้าทำงานในเงื่อนไข
  Serial.println("Yes client"); // แสดง Yes client ทาง Serial
 
    while(client.connected()){ // ถ้าหาก client กำลังเชื่อมต่อ ให้เข้า loop
       if(client.available()){ // ถ้าเข้าเงื่อนไขนี้แสดงว่ามีข้อมูลผ่านเข้ามา
        char c = client.read(); // สร้างตัวแปร char เพื่อเก็บข้อมูลที่อ่านได้
       
       
       if(readStrings.length() < 100){ // ถ้าหากตัวแปร readStrings มีขนาดไม่เกิน 100 ก็ให้ตัวแปร readStrings เพิ่มข้อมูลจากค่าที่อ่านได้จาก server
         readStrings += c;
       }
   
        if(c=='\n'){// เมื่ออ่านข้อมูลเจอ \n ก็ให้ทำเงื่อนไขต่อไป
            Serial.println(readStrings); // แสดงข้อมูลที่อ่านได้ทั้งหมดแสดงผ่าน Serial
            client.print("HTTP/1.1 200 OK\r\n"); //send new page
            client.print("Content-Type: text/html\r\n\r\n");
            client.print("<!DOCTYPE HTML>\r\n");
            client.print("<HTML>\r\n");//html tag
            client.print("<HEAD>\r\n"); //
//            client.print("<meta http-equiv='refresh' content='10'/>\r\n");
            client.print("<meta name='apple-mobile-web-app-capable' content='yes' />\r\n");
            client.print("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />\r\n");
            client.print("<link rel='stylesheet' type='text/css' href='http://randomnerdtutorials.com/ethernetcss.css' />\r\n");
            client.print("<TITLE>NodeMCU Project</TITLE>\r\n");
            client.print("</HEAD>\r\n");
            client.print("<BODY>\r\n");//ในส่วนของ body คือสิ่งที่จะแสดงไปยังหน้า web
            client.print("<H1>NodeMCU Web Server Proect :D</H1>\r\n"); //สร้างหัวข้อความที่มีขนาด 1
            client.print("<hr />\r\n");//ขีดเส้นใต้
            client.print("<br />\r\n");  //ขึ้นบรรทัดใหม่
            client.print("<H2>Base on ESP8266 ESP-12E</H2>\r\n"); //สร้างหัวข้อความที่มีขนาด 2
            client.print("<br />\r\n");  //ขึ้นบรรทัดใหม่
            client.print("<a href=\"/?button1on\"><font color = \"green\">LED 1 On</font></a>\r\n");//สร้าง link เมื่อคลิกจะส่งค่าไปที่ server อ่านแล้วเอาไปควบคุม relay
            client.print("<a href=\"/?button1off\"><font color = \"red\">LED 1 Off</font></a><br />\r\n");   
            client.print("<br />\r\n");     
            client.print("<a href=\"/?button2on\"><font color = \"green\">LED 2 On</font></a>\r\n");
            client.print("<a href=\"/?button2off\"><font color = \"red\">LED 2 Off</font></a><br />\r\n");   
            client.print("<br />\r\n");
            client.print("<a href=\"/?button3on\"><font color = \"green\">LED 3 On</font></a>\r\n");
            client.print("<a href=\"/?button3off\"><font color = \"red\">LED 3 Off</font></a><br />\r\n");   
            client.print("<br />\r\n");
            client.print("<a href=\"/?button4on\"><font color = \"green\">LED 4 On</font></a>\r\n");
            client.print("<a href=\"/?button4off\"><font color = \"red\">LED 4 Off</font></a><br />\r\n");   
            client.print("<br />\r\n");
            client.print("<br />\r\n");
            client.print("<a href=\"/?buttonallon\"><font color = \"green\">           LED ALL On           </font></a>\r\n");
            client.print("<br />\r\n");
            client.print("<br />\r\n");
            client.print("<a href=\"/?buttonalloff\"><font color = \"red\">           LED ALL off          </font></a>\r\n");
            client.print("<br />\r\n");
            client.print("</BODY>\r\n");
            client.print("</HTML>\n");// ปิด tag
           
            delay(1);
           
            client.stop(); // เมื่อส่งไปแล้วก็ให้ client stop เพื่อหยุดการทำงาน
           
           
            //ส่วนที่เหลือก็จะเป็นเช็คข้อความที่อ่านได้เพื่อไปควบคุม relay แต่ละ channel
            if(readStrings.indexOf("?button1on") > 0){
              Serial.println("1 on");
              digitalWrite(pin1,HIGH);
            }
           
            if(readStrings.indexOf("?button1off") >0){
              Serial.println("1 off");
              digitalWrite(pin1,LOW);
            }
           
            if(readStrings.indexOf("?button2on") >0){
              Serial.println("2 on");
              digitalWrite(pin2,HIGH);
            }
            if(readStrings.indexOf("?button2off")>0){
              Serial.println("2 off");
              digitalWrite(pin2,LOW);
            }
            if(readStrings.indexOf("?button3on")>0){
              digitalWrite(pin3,HIGH);
              Serial.println("3 on");
            }
            if(readStrings.indexOf("?button3off")>0){
              digitalWrite(pin3,LOW);
              Serial.println("3 off");
            }
            if(readStrings.indexOf("?button4on")>0){
              digitalWrite(pin4,HIGH);
              Serial.println("4 on");
            }
            if(readStrings.indexOf("?button4off")>0){
              digitalWrite(pin4,LOW);
              Serial.println("4 off");
            }
            if(readStrings.indexOf("?buttonallon")>0){
              digitalWrite(pin1,HIGH);
              digitalWrite(pin2,HIGH);
              digitalWrite(pin3,HIGH);
              digitalWrite(pin4,HIGH);
            }
            if(readStrings.indexOf("?buttonallof")>0){
              digitalWrite(pin1,LOW);
              digitalWrite(pin2,LOW);
              digitalWrite(pin3,LOW);
              digitalWrite(pin4,LOW);
            }
          readStrings = ""; //เมื่อจบโปรแกรมก็ให้ตัวแปร readStrings เคลียค่าทั้งหมด เพื่อรอรับค่าใหม่
        }//if(c == '\n')
       }//if(client.available())
      }//while(client.connected())
    }//if(client)
}//void loop()

เปิด seraial Monitor เพื่อดู IP ที่ได้รับ
ใช้โปรแกรมเข้าเว็บเช่น Chome เข้าไปที่ IP ที่ได้รับ





8
เมื่อคอมไพล์ NodeMCU ด้วย Arduino IDE แล้วขึ้น

warning: espcomm_send_command: can't receive slip payload data
error: failed reading byte

ให้แก้ไขโดย




9
เซ็นเซอร์ / เซ็นเซอร์ PM2.5 และ PM1.0 # SDS011
« เมื่อ: มีนาคม 27, 2019, 10:54:11 AM »
Arduino

- ต่อขา TxD (ขา1) บอร์ด SDS011  เข้าขา 10 ของ UNO






โค๊ด
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // ->(10) RX  ,  (11) TX->


float p10, p25;
int error;


void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) { }

  mySerial.begin(9600);

}


void PM()
{

 byte buffer;
  int value;
  int len = 0;
  int pm10_serial = 0;
  int pm25_serial = 0;
  int checksum_is;
  int checksum_ok = 0;
  int error = 1;

while (( mySerial.available() > 0) && ( mySerial.available() >= (10-len)))
  {
    buffer =  mySerial.read();
    value = int(buffer);
    switch (len) {
      case (0): if (value != 170) { len = -1; }; break;
      case (1): if (value != 192) { len = -1; }; break;
      case (2): pm25_serial = value; checksum_is = value; break;
      case (3): pm25_serial += (value << 8); checksum_is += value; break;
      case (4): pm10_serial = value; checksum_is += value; break;
      case (5): pm10_serial += (value << 8); checksum_is += value; break;
      case (6): checksum_is += value; break;
      case (7): checksum_is += value; break;
      case (8): if (value == (checksum_is % 256)) { checksum_ok = 1; } else { len = -1; }; break;
      case (9): if (value != 171) { len = -1; }; break;
    }
    len++;
    if (len == 10 && checksum_ok == 1) {
      p10 = (float)pm10_serial/10.0;
      p25 = (float)pm25_serial/10.0;
      len = 0; checksum_ok = 0; pm10_serial = 0.0; pm25_serial = 0.0; checksum_is = 0;
      error = 0;
    }

  }



if (!error) {
    Serial.print("P2.5: " + String(p25));    Serial.println("         P10:  " + String(p10));
  }
  delay(100);


 
}


void loop() { // run over and over
 
   PM();
   
}



ผล


10
ไมโครคอนโทรลเลอร์ / Software Serial
« เมื่อ: มีนาคม 27, 2019, 09:33:16 AM »

Arduino

โค๊ด
#include <SoftwareSerial.h>


//// กำหนดขา
SoftwareSerial mySerial(10, 11); // ->(10) RX รับข้อมูลเข้า  ,  (11) TX ส่งข้อมูลออก->
 
void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) { }

  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
    Serial.write("."); //// test
  }
 
}


11
ในกรณีต้องการอ่านค่า PWM เช่นการอ่านค่าเซ็นเซอร์ PM2.5 รุ่น SDS011 จากขา um โดยตรง




โค๊ด

volatile int pwm_value = 0;
volatile int prev_time = 0;
 
void setup()
 {
  Serial.begin(115200);
  // when pin D2 goes high, call the rising function

  attachInterrupt(0, rising, RISING);
}
 
void loop() { }
 
void rising()
{
  attachInterrupt(0, falling, FALLING);
  prev_time = micros();
}
 
void falling()
{
  attachInterrupt(0, rising, RISING);
  pwm_value = micros()-prev_time;
  Serial.println(pwm_value);
}

* กรณี UNO ให้ใช้ ขา 2 (int0) หรือ 3 (int1)
**  กรณีคาบเวลามากเกินไป ให้เปลี่ยนฟังชั่น  micros() เป็น millis()


จาก
http://www.benripley.com/diy/arduino/three-ways-to-read-a-pwm-signal-with-arduino/



12
สร้างอักษรพิเศษ ได้จากเว็บ
http://maxpromer.github.io/LCD-Character-Creator/


Arduino

โค๊ด

#include <Wire.h>
#include <LiquidCrystal_I2C.h> //ประกาศ Library ของจอ I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);  // Set the LCD address to 0x27 for a 20 chars and 4 line display


byte Char1[] = {   //// ส
  B00001,
  B00010,
  B11111,
  B00001,
  B01101,
  B10011,
  B11001,
  B11001
};


byte Char2[] = {   //// วั
  B11000,
  B11111,
  B00000,
  B01111,
  B10001,
  B00001,
  B00011,
  B00011
};

byte Char3[] = {   //// ดี
  B00011,
  B11111,
  B00000,
  B01111,
  B10001,
  B10101,
  B10101,
  B11001
};



void setup ()
{
    Wire.begin();
     lcd.begin();
    /////////// เก็บอักษรพิเศษไว้ที่หน่วยความจำของ LCD
     lcd.createChar(0, Char1); /// เก็บ ส ไว้ที่ช่อง 0
     lcd.createChar(1, Char2); /// เก็บ วั ไว้ที่ช่อง 1
     lcd.createChar(2, Char3); /// เก็บ ดี ไว้ที่ช่อง 2
   
}

void loop ()
{

lcd.setCursor(0,0);  lcd.write(0); ///// แสดงตัวอักษรพิเศษจากช่อง  0 = ส
lcd.setCursor(1,0);  lcd.write(1); ///// แสดงตัวอักษรพิเศษจากช่อง  1 = วั
lcd.setCursor(2,0);  lcd.write(0); ///// แสดงตัวอักษรพิเศษจากช่อง  0 = ส
lcd.setCursor(3,0);  lcd.write(2); ///// แสดงตัวอักษรพิเศษจากช่อง  2 = ดี

}





การแสดงผล





13
อุปกรณ์ IO / DS3231 ออกจอ LCD 20x4 แบบ I2C
« เมื่อ: มีนาคม 13, 2019, 03:53:34 PM »
ARDUINO

โค๊ด

#include <Wire.h>
#include "DS3231.h"
#include <LiquidCrystal_I2C.h> //ประกาศ Library ของจอ I2C
 LiquidCrystal_I2C lcd(0x27, 20, 4);  // Set the LCD address to 0x27 for a 20 chars and 4 line


RTClib RTC;


void setup ()

{
   Wire.begin();
 
   lcd.begin();   // initialize the LCD

   
}


void loop ()
{
 
    delay(1000);

    DateTime now = RTC.now();   //// อ่านค่าเวลาจาก DS3231


/////////// แสดงผล เติมเลข 0 นำหน้า เช่น 9 จะแสดงเป็น 09

lcd.setCursor(0, 0);  //// กำหนดการแสดงผล บรรทัดแรก ตำแหน่งที่ 0

if(now.day()<=9)   { lcd.print("0");  } lcd.print(now.day(), DEC);    lcd.print("/");
if(now.month()<=9) { lcd.print("0");  } lcd.print(now.month(), DEC);  lcd.print("/");
lcd.print(now.year()+543, DEC);


lcd.setCursor(12,0);  //// กำหนดการแสดงผล บรรทัดแรก ตำแหน่งที่ 12
if(now.hour()<=9)     { lcd.print("0");  } lcd.print(now.hour(), DEC);    lcd.print(":");
if(now.minute()<=9)   { lcd.print("0");  } lcd.print(now.minute(), DEC);  lcd.print(":");
if(now.second()<=9)   { lcd.print("0");  } lcd.print(now.second(), DEC);


}


14
อุปกรณ์ IO / I2C scanner
« เมื่อ: มีนาคม 13, 2019, 11:29:54 AM »

ARDUINO

โค๊ด
//// https://www.instructables.com/id/I2C-LCD-Controller-the-easy-way/
#include <Wire.h>

void setup() {
  Serial.begin (9600);

  // Leonardo: wait for serial port to connect
  while (!Serial)
    {
    }

  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
 
  Wire.begin();
  for (byte i = 1; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}




15
LCD / LCD 20 อักษร 2 บรรทัดแบบ I2C
« เมื่อ: มีนาคม 13, 2019, 11:14:18 AM »
ติดตั้งไลบรารี่  LiquidCrystal_I2C ก่อน  (ตามไฟล์แนบ)
 - บอร์ด UNO ขา SDA อยู่ที่ขา A4
 - บอร์ด UNO ขา SCL อยู่ที่ขา A5





ควรทดสอบหาค่าตำแหน่งของ LCD แบบ I2C ก่อน ว่าอยู่ที่ตำแหน่งใด โดยใช้โค๊ด




โค๊ด
//// https://www.instructables.com/id/I2C-LCD-Controller-the-easy-way/
//// https://www.instructables.com/id/I2C-LCD-Controller-the-easy-way/
#include <Wire.h>

void setup() {
  Serial.begin (9600);

  // Leonardo: wait for serial port to connect
  while (!Serial)
    {
    }

  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
 
  Wire.begin();
  for (byte i = 1; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}











ARDUINO

โค๊ด
#include <LiquidCrystal_I2C.h> //ประกาศ Library ของจอ I2C


// Set the LCD address to 0x27 for a 20 chars and 4 line display

LiquidCrystal_I2C lcd(0x27, 20, 4);


void setup()
{
// initialize the LCD
lcd.begin();


lcd.setCursor(0, 0);   //ฟังก์ชั่นในการกำหนดตำแหน่ง Cursor  คอลัมส์ 0 บบรทัดที่ 1
lcd.print("Hello, world!"); //ฟังก์ชั่นในการกำหนดข้อความที่ต้องการแสดงผล

lcd.setCursor(0, 1); //ฟังก์ชั่นในการกำหนดตำแหน่ง Cursor คอลัมส์ 0 บบรทัดที่ 2
lcd.print("http://www.nawattakam.com");

lcd.setCursor(0, 2); //ฟังก์ชั่นในการกำหนดตำแหน่ง Cursor คอลัมส์ 0 บบรทัดที่ 3
lcd.print("1234567890ABCDEFGHIJ");

lcd.setCursor(0, 3); //ฟังก์ชั่นในการกำหนดตำแหน่ง Cursor คอลัมส์ 0 บบรทัดที่ 4
lcd.print("@#$%^&*()_+;[]");

}


void loop()
{
}




หน้า: [1] 2 3 ... 24