Project

General

Profile

การอบรมการใชช้งาน aMG 4-20mA to WiFi Data Logger

ปูพื้น

  1. เกี่ยวกับ เอมเมจิน (เกี่ยวกับ Aimagin.pdf)
  2. เกี่ยวกับ aMG 4-20mA to WiFi Data Logger (เกี่ยวกับ aMG 4-20mA to WiFi Data Logger v5 thai.pdf)
    1. 4-20mA คืออะไร
    2. ปัญหาคืออะไร
    3. 4-20mA to WiFi Data Logger ช่วยได้อย่างไร
  3. เป้าหมายของวันนี้
    1. สามารถตั้งค่าใช้งานอุปกรณ์ได้
      1. เข้าใจ Config mode และ Running mode
      2. ดูสถานะ LED เป็น
      3. ตั้งค่าใช้งานได้: WiFi, 4-20mA
      4. สามารถดูค่าทดสอบจาก Dashboard ได้
      5. Download ค่า (Logged data) จากอุปกรณ์ได้
    2. สามารถส่งค่าขึ้น test server (http://testiot.aimagin.com/register) ได้
    3. สามารถใช้งานจริงได้
      1. สามารถ Setup และเก็บค่าเข้า Google sheet ได้
      2. สามารถ Setup และเก็บค่าเข้า Php / MySQL ได้ (ใช้ Cloud server Digital Ocean https://www.digitalocean.com/)
  4. ตอบคำถาม

อุปกรณ์และซอฟต์แวร์ที่ต้องใช้

อุปกรณ์

  1. เครื่อง Notebook 1 เครื่อง
  2. WiFi Dongle 1 อัน
  3. aMG 4-20mA to WiFi Data Logger 1 อัน
  4. เครื่องสร้างสัญญาณ 4-20mA จำลอง 1 อัน

ส่วนประกอบฮาร์ดแวร์

ลำดับ ส่วนประกอบ คำอธิบาย
1 แหล่งจ่ายไฟ VDC พอร์ตเพื่อเชื่อมต่อกับแหล่งจ่ายไฟ VDC (9 - 24 V)
2 แหล่งจ่ายไฟ GND พอร์ตเพื่อเชื่อมต่อกับกราวด์ของแหล่งจ่ายไฟ
3 ขั้วต่อเสาอากาศ ขั้วต่ออินพุตเสาอากาศ
4 ช่องสัญญาณ พอร์ตเพื่อเชื่อมต่อกับเซ็นเซอร์รองรับเซ็นเซอร์ได้สูงสุด 4 ตัว
5 ไฟ LED สีเขียว แสดงสถานะของสภาพการทำงานพร้อมกะพริบในความถี่ที่แตกต่างกัน
6 ไฟ LED สีเหลียง แสดงสถานะแหล่งจ่ายไฟ
7 เสาอากาศ เสาอากาศ WiFi

Table 4-2 : aMG 4-20 mA to WIFI Data Logger LED Status

No. โหมดการทำงาน เงื่อนไข ลักษณการกระพริบของไฟ LED ตัวอย่างการกระพริบของไฟ LED
1 Access Point (AP) /Configuration Mode available for connection from a user, no connection or trying to connect blink 1 Hz
2 Access Point (AP) /Configuration Mode user connected successfully solid
3 Station Mode (STA) /Running Mode trying to connect to a WIFI access point blink 5Hz
4 Station Mode (STA) /Running Mode successfully connected to a WIFI access point 2 fast blink and 1 sec OFF

ซอฟต์แวร์

  1. Putty

การทดสอบกับ test server (http://testiot.aimagin.com/register)

การ Setup และเก็บค่าของข้อมูลที่ถูกส่งเข้า Google sheet

  1. เปิด google sheet
  2. ใส่ข้อมูลลงไปใน sheet ที่ column 1A-1I ตามรูปภาพด้านล่าง

  1. ผู้ใช้สามารถเปลี่ยนชื่อ Sheet และ ชื่อ Spread sheet ได้และตรวจสอบให้แน่ใจว่าไม่มีช่องว่างในชื่อ Sheet ,Spread sheet
  2. คลิก Tools เลือก Script Editor
    คัลลอก Code ด้านล่างไปใส่ใน Script Editor และ เปลี่ยน test_table ในบรรทัดที่ 2 ให้เป็นชื่อ Spread sheet ตามที่ได้ตั้งไว้
    // IMPORTANT: Change the sheet name accordingly
    var user_sheet = "test_table" 
    
    function doGet(e) {
      var ss = SpreadsheetApp.getActive();
      var sheet = ss.getSheetByName(user_sheet);
    
      var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
      var lastRow = sheet.getLastRow();
    
      var cell = sheet.getRange('a1');
      var col = 0;
      var d = new Date();
    
      for (i in headers){
        val = e.parameter[headers[i]]; 
    
        cell.offset(lastRow, col).setValue(val);
        col++;
      }
    
      return ContentService.createHtmlOutput("Success");
    }
    
    function updateSheet(rows) {
      var ss = SpreadsheetApp.getActive();
      var sheet = ss.getSheetByName(user_sheet);
      var column = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
      for(var i=0;i<rows.length;i++) {
        var d = [];
        for(var j=0;j<column.length;j++) {
          d.push(rows[i][column[j]]);
        }
        sheet.appendRow(d)
      }
    }
    
    function doPost(e) {
      let data = JSON.parse(e.postData.contents);
      Logger.log(data); 
      updateSheet(data.rows);
      return ContentService.createHtmlOutput("Success");
    }
    

    ดังนี้
  3. คลิก Publish เลือก Deploy as web app...
    ตั้งค่าตามนี้
    1. ตั้งชื่อ Project คลิก OK
    2. Who has access to the app เลือก Anyone even anonymous จากนั้นคลิก Deploy
    3. คลิก Review Permissions
      1. กรณีที่มีหน้าคำเตือนขึ้นให้ คลิก Advanced และคลิก Go to (ชื่อ Spread sheet )_Google_Script (unsafe).
    4. คลิก Allow
      ดังนี้
    5. คัลลอก URL
    6. ทดสอบเก็บค่าเข้า Google sheet
      1. นำข้อมูลด้านล่างมาต่อท้าย URL ที่คัลลอกมา
        (URL ที่คัลอก)?id=test_table&datetime=601235&CH1_raw=0&CH1_conv=0&CH2_raw=1&CH2_conv=1&CH3_raw=2&CH3_conv=2&CH4_raw=3&CH4_conv=3
        
        ตัวอย่าง
        https://script.google.com/macros/s/AKfycbx39JLX-wRkFl8Hgpk2GL7fw5yH8HBs0UPqVcLtwIKoJ-a-skY/exec?id=test_table&datetime=601235&CH1_raw=0&CH1_conv=0&CH2_raw=1&CH2_conv=1&CH3_raw=2&CH3_conv=2&CH4_raw=3&CH4_conv=3
        
      2. เอา URL ที่ได้ไปใส่ในแทบค้นหาดังนี้

        จากนั้นกด Enter
      3. ตรวจสอบหน้า google sheet ถ้ามีข้อมูลเข้าเหมือนรูปด้านล่างแสดงว่า google sheet พร้อมสำหรับการเก็บข้อมูลจาก aMG 4-20mA to WiFi Data Logger

การ Config ค่า ใน System configuration

  1. Target Server จะนำ URL ที่คัลลอกมาดังนี้
    ตัวอย่าง URL ที่คัลลอก
    https://script.google.com/macros/s/AKfycbx39JLX-wRkFl8Hgpk2GL7fw5yH8HBs0UPqVcLtwIKoJ-a-skY/exec
    
    1. Domain /URL
      ตัวอย่าง Domain /URL
      https://script.google.com/macros/s/
      
    2. Secret key
      ตัวอย่าง Secret key
      AKfycbx39JLX-wRkFl8Hgpk2GL7fw5yH8HBs0UPqVcLtwIKoJ-a-skY/exec
      
  2. JSON format parameters
    1. Table name ให้ใส่ชื่อ Spread sheet ที่ได้ตั้งไว้
      ตัวอย่าง จาก sheet demo_database ชื่อ Spread sheet คือ demo

      Table name : demo
      

การ Setup และเก็บค่าเข้า Php / MySQL

  1. รันคำสั่งดังนี้เพื่อลง apache2
    sudo apt update
    sudo apt install apache2 กด y แล้ว enter
    sudo a2enmod rewrite
    sudo systemctl restart apache2
    
  2. ปรับ Friewall
    sudo ufw app list
    sudo ufw allow 'Apache'
    sudo ufw enable กด y แล้ว enter
    sudo ufw status 
    ทดลองเข้า http://ipของserver
    
  3. ตั้งค่าโฮส
    sudo mkdir /var/www/test
    sudo chown -R $USER:$USER /var/www/test
    sudo chmod -R 755 /var/www/test
    

    รันคำสั่ง sudo nano /etc/apache2/sites-available/test.conf แก้ไขไฟล์ดังนี้
    1. คัลลอกข้อมูลด้านล่าง
      <VirtualHost *:80>
          ServerAdmin webmaster@localhost
          ServerName your_ip
          ServerAlias www.test
          DocumentRoot /var/www/test
          ErrorLog ${APACHE_LOG_DIR}/error.log
          CustomLog ${APACHE_LOG_DIR}/access.log combined
      
          #Include /etc/phpmyadmin/apache.conf
      
          <Directory "/var/www/test">
              AllowOverride All
          </Directory>
      </VirtualHost>
      
    2. คลิกขวาเพื่อวางข้อมูล จากนั้น ctrl+x กด y แล้ว enter
      ตัวอย่าง

      รันคำสั่ง
      sudo a2ensite test.conf
      sudo a2dissite 000-default.conf
      sudo apache2ctl configtest
      sudo systemctl restart apache2
      
  4. ลง MySQL และ phpMyAdmin
    รันคำสั่งทีละบรรทัด
    sudo apt install mysql-server mysql-client กด y แล้ว enter
    sudo mysql -u root -p ใส่รหัสผ่าน
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';
    exit
    sudo apt install phpmyadmin php-mbstring php-gettext กด y แล้ว enter
    spacebar เลือก apache2 กด enter
    เลือก no กด enter
    sudo phpenmod mbstring
    sudo systemctl restart apache2
    

    ลองเข้า http://your_domain_or_IP/phpmyadmin
  5. สร้าง table ตั้งชื่อ table 4_20
    CREATE TABLE `insert_data` (
      `id` int(11) NOT NULL,
      `organization_id` text NOT NULL,
      `mac_address` text NOT NULL,
      `CH1_raw` text NOT NULL,
      `CH1_conv` text NOT NULL,
      `CH2_raw` text NOT NULL,
      `CH2_conv` text NOT NULL,
      `CH3_raw` text NOT NULL,
      `CH3_conv` text NOT NULL,
      `CH4_raw` text NOT NULL,
      `CH4_conv` text NOT NULL,
      `datetime` text NOT NULL,
      `datetimedt` text NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ALTER TABLE `insert_data`
      ADD PRIMARY KEY (`id`);
    ALTER TABLE `insert_data`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
    

    ตัวอย่าง.
  6. ติดตั้ง PHP Dependencies สำหรับติดตั้ง Mcrypt
    1. รันคำสั่ง
      sudo apt install php-dev libmcrypt-dev php-pear กด y แล้ว enter
      sudo pecl channel-update pecl.php.net
      sudo pecl install mcrypt-1.0.1 กด enter
      
    2. รันคำสั่ง sudo vim /etc/php/7.2/apache2/php.ini
    3. กด esc แล้วพิมพ์ดังนี้ * /extension=sh*
    4. กด enter
    5. กด i
    6. ใส่ extension=mcrypt.so
    7. กด esc แล้วพิมพ์ดังนี้ :wq
      ตัวอย่าง
  7. รันคำสั่ง sudo nano /etc/apache2/sites-available/test.conf แก้ไขเอา # ออก จากนั้น ctrl+x กด y แล้ว enter
    ตัวอย่างไฟล์ที่แก้ไขแล้ว
  8. สร้าง ไฟล์ฟังก์ชันสำหรับรับ ค่าจากกล่อง
    รันคำสั่ง
    sudo mkdir /var/www/test/demo
    sudo nano /var/www/test/demo/.htaccess
    

    คัลลอกข้อมูลด้านล่างมาใส่
    RewriteEngine On
    RewriteBase /demo
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?id=$1 [L,QSA]
    

    เมื่อแก้ไขไฟล์เสร็จแล้วให้ ctrl+x กด y แล้ว enter
    ตัวอย่าง
  9. สร้างไฟล์ index.php ใช้คำสั่งตามนี้
    sudo nano /var/www/test/demo/index.php
    คัลลอกข้อมูลด้านล่างมาใส่
    <?php
    # databaseconnect
    $servername = "localhost:3306";
    $username = "root";
    $password = "1234";
    $dbname = "4_20";
    
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("Connection failed: " . $conn->connect_error);
    }
    // echo 'Connected successfully';
    
    header("Access-Control-Allow-Origin: *");
    
    header("Content-Type: application/json; charset=UTF-8");
    
    header("Access-Control-Allow-Methods: OPTIONS,GET,POST,PUT,DELETE");
    
    header("Access-Control-Max-Age: 3600");
    
    header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    
    date_default_timezone_set("UTC");
    
    $requestMethod = $_SERVER["REQUEST_METHOD"];
    
    $data = file_get_contents("php://input");
    
    $result_post = json_decode($data, true);
    
    if ($requestMethod == "POST") {
        if ($_GET["id"] == "Du81QXQGE6uswzRxXUnagKarauJL80w6") {
            if (count($result_post) == 3) {
                $key = $result_post["datetime"] . "0123456789012345678901";
                $iv = implode(array_map("chr", array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)));
                $plaintext = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, hex2bin($result_post["encrypt_data"]), MCRYPT_MODE_CBC, $iv);
            //     // echo strlen($plaintext);
                $origin_size = strlen($plaintext) - 1;
                $last_str = strripos($plaintext, "}");
                $padding = $origin_size - $last_str;
                // echo $padding;
                $json_string = substr($plaintext, 0, -$padding);
                var_dump($json_string);
                $result_arr = json_decode($json_string, true);
            } else {
                $result_arr = $result_post;
            }
    
            // var_dump($result_arr);
    
            array_push($result_arr['column'], "organization_id");
            array_push($result_arr['column'], "mac_address");
            array_push($result_arr['column'], "datetimedt");
    
            $sql = "";
            $values = [];
            $organization_id = $result_arr['id'];
            $mac_address = $result_arr['mac'];
            $time = date("Y-m-d H:i:s");
    
            if (count((array)$result_arr['rows'][0]) > 0) {
    
                $column = implode(", ", $result_arr['column']);
    
                for ($i = 0; $i < count($result_arr['rows']); $i++) {
                    $time = $result_arr['rows'][$i]['datetime'];
                    $result_arr['rows'][$i]['organization_id'] = $organization_id;
                    $result_arr['rows'][$i]['mac_address'] = $mac_address;
                    $result_arr['rows'][$i]['datetimedt'] = date("Y-m-d H:i:s", $time);
                }
                // $time = $result_arr['rows'][$i]['datetime'];
                // $result_arr['rows'][0]['organization_id'] = $organization_id;
                // $result_arr['rows'][0]['mac_address'] = $mac_address;
                // $result_arr['rows'][0]['datetimedt'] = date("Y-m-d H:i:s", $time);
    
                foreach ($result_arr['rows'] as $row) {
                    $r = "";
                    foreach ($result_arr['column'] as $i => $col) {
                        if ($i + 1 === count($result_arr['column'])) {
                            $r .= '"' .  $row[$col] . '")';
                            array_push($values, $r);
                        } else if ($i === 0) {
                            $r .= '("' . $row[$col] . '",';
                        } else {
                            $r .= '"' . $row[$col] . '",';
                        }
                    }
                }
    
                $values_string = implode(", ", $values);
    
                # query sql
                $sql = 'INSERT INTO ' . $result_arr['table'] . ' (' . $column . ') VALUES ' . $values_string;
                // echo $sql;
    
                $result = $conn->query($sql);
    
                if ($result) {
                   echo json_encode(['status' => 'ok', 'message' => 'Insert Device Data Complete']);
               } else {
                    echo json_encode(['status' => 'error', 'message' => $conn->error]);
                }
            }
        }
    }
    $conn->close();
    

    เมื่อแก้ไขไฟล์เสร็จแล้วให้ ctrl+x กด y แล้ว enter
    ตัวอย่าง

การ Config ค่า System configuration

Domain /URL
http://_IP_/demo/

Secret key
Du81QXQGE6uswzRxXUnagKarauJL80w6

Data encryption
0123456789012345678901