DevOps CI/CD คืออะไร?

CICD Flow

เนื่องในโอกาส ที่มาเริ่มงานใหม่ ด้าน Banking Technology (FinTech) ได้ครบ 1 เดือน ในส่วนของ DevOps เลยจะมาเขียนเล่าว่า การทำงานของ DevOps มีอะไรบ้าง CI/CD คืออะไร? ทำไมสมัยนี้ ถึงเป็นคำที่นิยมใช้กัน ในสายงาน software developer ..

DevOps จริงๆ แล้วเป็นคำใหม่ ที่เอาคำว่า Developer กับ Operator มารวมกัน สมัยก่อน Developer เป็นคนพัฒนา code แต่ไม่มีสิทธิ deploy code ขึ้นใช้งานเอง ต้องมีทีม Operator มาทำการ deploy ให้อีกทีม ซึ่งทั้ง 2 ทีมนี้เป็นคนละทีมกัน ทำให้การทำงานยุ่งยาก เกิดความผิดพลาด และใช้เวลานาน ในการ deploy แต่ละครั้ง ..

CICD

CI/CD (Continuous Integration, Continuous Delivery) เป็นกระบวนการในการทำงาน ตั้งแต่การ Plan -> Code -> Build -> Test -> Release -> Deploy -> Operate -> Monitor หรือบางทีเรียกสั้นๆ ว่า Pipeline ซึ่งสมัยนี้ ก็มี tools ต่างๆ ที่ทำหน้าที่พวกนี้ เยอะมากทั้ง On-Premise และ On-Cloud ที่เรารู้จักกันดี ก็น่าจะเป็น Jenkins ที่เข้ามามีบทบาทมาก ในการทำ CICD ..

ขอบเขตของการทำงาน ของ DevOps แต่ละที่เท่าที่ผมได้เคยลงไปสัมผัส จะไม่เหมือนกัน ขึ้นอยู่ว่า scope ที่ทำได้ มีระดับไหน บางที่ ก็คือทำตั้งแต่ต้นน้ำ ยันปลายน้ำ คือตั้งแต่วางแผน สร้าง Infrastructure เอง ทำ ENV ให้ Dev ใช้ เขียน Pipeline ตลอดจน ทำ Load Test, Performance Test, Security Test และระบบ Monitor & Alert เองทั้งหมด แบบนี้ก็ดีตรงที่จะรู้และเข้าใจ ในแต่ละส่วนอย่างดี ทำให้งานออกมามีประสิทธิภาพ ควบคุมได้ แต่ถ้ามี หลายๆ Project ก็คงทำแบบนี้ไม่ไหว ..

บางที่ DevOps จะมีหน้าที่แค่ทำระบบให้ Dev มาใช้งาน แต่จะไม่มีสิทธิ ในการทำอย่างอื่นเอง แบบด้านบน แบบนี้ ก็จะทำให้ ควบคุมอะไรไม่ได้ทั้งหมด แต่ถ้ามีหลายๆ Project ก็จะรองรับการทำงาน ได้เต็มที่ ..

สำหรับแนวคิด และ Tools ในการทำงานแบบ DevOps (CI/CD) ไม่มีแบบไหนผิด แบบไหนถูก ขึ้นอยู่กับการเอามาประยุกต์ใช้งาน ให้เหมาะสมกับงานของเรา องค์กรของเรา เพื่อทำให้งาน เกิดประสิทธิภาพสูงสุด ตอบโจทย์ผู้ใช้งาน product ของเราให้ดีที่สุด .. และที่สำคัญ ต้อง Monitor ได้ ต้องมี Dashboard เอาไว้ Tracking Metric ต่างๆ ได้ ..

สำหรับใครที่กำลังหางาน DevOps สมัครกันเข้ามาได้ครับ รับรองว่า งานท้าทาย สนุก แน่นอนครับ 🙂
https://th.jobsdb.com/th/th/job/devops-engineer-300003001969662

Facebook Comments

วิธีเลือกซื้อมังคุด ตามฤดูกาล

สวัสดีครับ วันนี้ผมจะมาพูดถึง “มังคุด” ราชินีแห่งผลไม้ สักหน่อยครับ เนื่องจากช่วงนี้ เป็นฤดูกาล ที่มังคุด ของ จ.จันทบุรี และภาคตะวันออก กำลังออกกัน ..

ถิ่นกำเนิดของมังคุดอยู่ที่หมู่เกาะซุนดาและโมลุกกะ ประเทศอินโดนีเซีย และขยายพันธุ์มาปลูกในภาคใต้ และภาคตะวันออกของประเทศไทย ..

มังคุดที่ปลูกอยู่ทั่วเมืองไทยเป็นสายพันธุ์พื้นเมือง ต้นมังคุดเจริญเติบโตจากต้นแม่ ที่ไม่ได้รับการผสมเกสร เพราะเกสรของมังคุดตัวผู้จะเป็นหมัน ทำให้มังคุดในแต่ละท้องที่ก็คือสายพันธุ์เดียวกัน แต่ผลผลิตที่ได้อาจจะแตกต่างกัน แล้วแต่สภาพแวดล้อม ในแต่ละพื้นที่ ..

ลักษณะทางพฤกษศาสตร์ของมังคุด
ชื่อสามัญ Mangosteen ชื่อวิทยาศาสตร์ Garcinia mangostana เป็นไม้ยืนต้น สูง 10-25 เมตร มีใบเดี่ยวรูปไข่ เนื้อใบหนาและเหนียว สีเขียวเข้มเป็นมัน ออกดอกเป็นดอกเดี่ยวหรือดอกคู่ มีกลีบเลี้ยงสีเขียวอมเหลือง และกลีบดอกสีแดง ผลมังคุดเป็นทรงกลม มีเปลือกหนาสีม่วงอมแดงห่อหุ้มเมล็ด 6-8 เมล็ดภายในที่มีสีขาวนวล เนื้อนุ่มฉ่ำน้ำ รสหวานอมเปรี้ยว มังคุดเป็นผลไม้ที่อุดมไปด้วยสารต้านอนุมูลอิสระตามธรรมชาติ มีสารในกลุ่ม Xanthones ไม่ต่ำกว่า 40 ชนิด โดยเฉพาะบริเวณเปลือกของมังคุด และสารที่มีฤทธิ์มากที่สุดคือ GM-1 สารกลุ่มแซนโทนส์นั้นมีคุณสมบัติ ฆ่าแบคทีเรีย ต้านการอักเสบ ต้านอนุมูลอิสระ ฆ่าเซลล์มะเร็ง อย่างไรก็ตามปัจจุบันสาร GM-1 ยังไม่ได้จดทะเบียนเป็นยา ควรศึกษาแพทย์ก่อนรับประทาน

สารอาหารในมังคุด จากรายงานของ USDA Food Composition Databases เนื้อมังคุด 100 กรัม มีส่วนประกอบโดยประมาณ ดังต่อไปนี้

• พลังงาน 73 กิโลแคลอรี่
• น้ำ 80.94 กรัม
• โปรตีน 0.41 กรัม
• คาร์โบไฮเดรตรวมทั้งหมด 17.91 กรัม
• ไฟเบอร์ 1.8 กรัม
• ไขมัน 0.58 กรัม

วิตามิน
• วิตามิน B1 (Thiamine) 0.054 มิลลิกรัม
• วิตามิน B2 (Riboflavin) 0.054 มิลลิกรัม
• วิตามิน B3 (Niacin) 0.286 มิลลิกรัม
• วิตามิน B5 (Pantothenic acid) 0.032 มิลลิกรัม
• วิตามิน B6 (Pyridoxine) 0.018 มิลลิกรัม
• วิตามิน B9 หรือโฟเลต 31 ไมโครกรัม
• เบต้า แคโรทีน 16 ไมโครกรัม
• อัลฟ่า แคโรทีน 1 ไมโครกรัม
• เบต้า คริปโตแซนทีน 9 ไมโครกรัม
• วิตามิน C (Ascorbic acid) 2.9 มิลลิกรัม
• วิตามิน A 35 IU

แร่ธาตุต่างๆ
• แคลเซี่ยม 12 มิลลิกรัม
• ธาตุเหล็ก 0.3 มิลลิกรัม
• แมกนีเซี่ยม 13 มิลลิกรัม
• ฟอสฟอรัส 8 มิลลิกรัม
• โพแทสเซี่ยม 48 มิลลิกรัม
• โซเดี่ยม 7 มิลลิกรัม
• ธาตุสังกะสี 0.21 มิลลิกรัม
• ธาตุทองแดง 0.069 มิลลิกรัม
• ธาตุแมงกานีส 0.102 มิลลิกรัม

ประโยชน์ของมังคุด
1. มีสารต้านอนุมูลอิสระที่ช่วยชะลอการเสื่อมสภาพของร่างกายส่งผลให้ร่างกายของเรานั้นแก่ช้าลง ช่วยให้ลดการเกิดริ้วรอยและทำให้ผิวพรรณของเราดูเปล่งปลั่ง
2. ช่วยเสริมสร้างภูมิต้านทานให้ร่างกายของเราแข็งแรง และป้องกันหรือบรรเทาอาการไข้ได้อีกด้วย
3. ช่วยเสริมสร้างกระดูกและฟันให้แข็งแรงยิ่งขึ้น
4. ช่วยเพิ่มความกระปรี้เปร่า ตื่นตัวของร่างกายได้เป็นอย่างดี และยังช่วยให้สภาวะทางอารมณ์ของเราดีขึ้นได้อีกด้วย
5. ช่วยยับยั้งแบคทีเรียในร่างกายของเราได้เป็นอย่างดี
6. ช่วยป้องกันการเกิดโรคเบาหวาน เนื่องด้วยคุณสมบัติของมังคุดที่จะช่วยลดและควบคุมระดับน้ำตาลในร่างกายของเรา
7. ช่วยลดระดับคลอเรสเตอรอลและไขมันไม่ดีในเส้นเลือด
8. สาร Xanthones มีฤทธิ์ช่วยลดความดันโลหิต
8. มีส่วนช่วยป้องกันการเกิดเนื้องอกในร่างกายของเรา
9. ช่วยในเรื่องระบบขับถ่ายเนื่องจากมังคุดนั้นมีกากใยอยู่จำนวนมาก
10. เปลือกของมังคุดมีสรรพคุณในการสมานแผล และยับยั้งเชื้อราที่เป็นสาเหตุของโรคผิวหนัง


เรียงลำดับสี ของมังคุด ในระยะต่างๆ
1. เริ่มมีจุดสีเลือด ในบางจุด ของผล
2. มีจุดสีเลือดกระจายไปทั่วทั้งผล และผลเริ่มเป็นสีชมพู
3. ผลเป็นสีชมพูเข้ม ทั้งผล
4. สีเริ่มเป็นสีเปลือกมังคุด ระยะนี้ทานได้แล้ว
5. สีเริ่มเป็นสีดำ ระยะนี้ควรรีบทาน เพราะเป็นระยะสุดท้าย ของมังคุดแล้ว

วิธีเลือกมังคุด
มังคุดที่ดี จะมีลักษณะลูกกลมแป้น ผิวอาจจะมัน หรือเป็นกลาก ก็ไม่ใช้ปัญหา เพราะส่วนสำคัญคือเนื้อข้างใน ต้องเป็นสีขาว เป็นกลีบเรียงกัน อย่างเป็นระเบียบ บางคนอาจจะชอบผลเล็ก เพราะไม่มีเมล็ด บางคนอาจจะชอบผลใหญ่ เพราะมีเนื้อมังคุดที่มากกว่า อันนี้ แล้วแต่คนชอบ ส่วนราคา แน่นอนว่า ผลขนาดใหญ่ ผิวมัน จะมีราคาแพงกว่า ..

ในประเทศไทยเอง ตามห้างต่างๆ ที่เอามังคุดไปขาย ส่วนใหญ่จะเป็นเกรดตกไซส์ คือผลเล็กผิวดำ เพราะว่า เกรดส่งออก ผลใหญ่ ผิวมัน ส่วนใหญ่ ล้งต่างๆ จะมารับซื้อตรงจากชาวสวนในพื้นที่ไปหมดแล้ว เพื่อทำการส่งออกไปยังต่างประเทศ และจะให้ราคาค่อนข้างดี ..

มังคุด 100 ปี คืออะไร?
มังคุด 100 ปี คือมังคุดที่ต้นมีอายุมากๆ ระดับ 60 – 100 ปีขึ้นไป จะให้ผลที่มีรสชาต อร่อย หวาน กว่ามังคุดอายุน้อยๆ เป็นที่นิยมรับประทานกัน ต้นจะใหญ่ สูงมาก ..

สำหรับเพื่อนๆ ที่สนใจ อยากสั่งซื้อมังคุด 100 ปี คุณภาพดี เกรดส่งออก ปลอดสารเคมี สดๆ จากสวนผมเอง สามารถสั่งซื้อผ่านทาง shopee ด้านล่างนี้ได้เลยครับ ..

แบบ มันลาย 9-10 ลูก/kg
https://shopee.co.th/ton350d/2062354563?v=784&smtt=0.0.1

แบบ มันจั้มโบ้ 7-9 ลูก/kg
https://shopee.co.th/ton350d/2062465862?v=2ca&smtt=0.0.1

ขอบคุณรายละเอียดจาก
https://maanow.com/%E0%B9%80%E0%B8%A3%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%87%E0%B8%99%E0%B9%88%E0%B8%B2%E0%B8%A3%E0%B8%B9%E0%B9%89/426-%E0%B8%A1%E0%B8%B1%E0%B8%87%E0%B8%84%E0%B8%B8%E0%B8%94.html

https://medthai.com/%E0%B8%A1%E0%B8%B1%E0%B8%87%E0%B8%84%E0%B8%B8%E0%B8%94/

Facebook Comments

LINE Bot + node.js + MQTT + ESP32 (IoT) เปิด/ปิด ไฟ (ตอนที่ 2)

สวัสดีครับ จากตอนที่แล้ว ที่ผมพูดถึงรายละเอียดต่างๆ ที่จะใช้ในการทำ ระบบเปิด/ปิด ไฟ
ว่าต้องใช้อะไรบ้าง วันนี้ จะมาลงรายละเอียด ในแต่ละส่วนกันครับ ..
อ่านตอนที่ 1 ได้ที่ LINE Bot + node.js + MQTT + ESP32 (IoT) เปิด/ปิด ไฟ (ตอนที่ 1)

การทำงานคือ ผมจะสามารถสั่ง ให้บอท (LINE Messaging API) สั่งเปิด/ปิดไฟ ได้ผ่าน การ chat ดังภาพ

0.ความรู้ที่ต้องมี ในบทความนี้

– การใช้งาน Arduino IDE เบื้องต้น
– การเขียน node.js เบื้องต้น
– การใช้งาน LINE Messaging API เบื้องต้น
– การใช้งาน Git เบื้องต้น

1.เตรียมอุปกรณ์


สำหรับบอร์ด ESP32 ที่ผมจะใช้ในการทดลองนี้ จะเป็น Node32 Lite นะครับ สามารถหาซื้อได้ที่นี่ครับ ราคา 275 บาท
https://gravitechthai.com/product_detail.php?d=3318

ปล.หรือถ้าเพื่อนๆ มีบอร์ดอื่นๆ เช่น ESP8266, NodeMCU อยู่แล้ว ก็สามารถใช้งานได้เหมือนกันครับ

2.สมัครใช้บริการ LINE Messaging API


LINE Developers

ตรงส่วนวิธีการสมัครใช้งาน LINE Messaging API มีหลายๆ ท่านเขียนบทความไว้แล้ว ตัวอย่างเช่น

LINE Bot 101 — จับมือทำบอท ของคุณ Sitthi Thiammekha (LINE API Expert)

สร้าง LINE Bot ด้วย Node.js + Messaging API — A Beginner’s Guide ของคุณ Ingkwan

3.สมัครใช้บริการ Heroku สำหรับ CloudMQTT Server


Heroku.com

เมื่อกรอกรายละเอียดการสมัครเสร็จแล้ว เราจะเข้าสู่ Dashboard ของ Heroku ครับ


– ที่หน้า Dashboard เลือก New > Create new app


– ตั้งชื่อ App ของเรา ในที่นี้ผมตั้งชื่อ esp32-mqtt

ถ้าสร้างสำเร็จ เราจะเข้าหน้าแรก ของ App เราได้ละ อย่างของผมจะเป็น
https://esp32-mqtt.herokuapp.com/


– ที่ Resources เลือก Find more add-ons


– เลือก CloudMQTT


– เลือก Install CloudMQTT


– เลือก App ที่จะ Install CloudMQTT ในที่นี้ ของผมคือ esp32-mqtt


– เลือก Provision add-on


– เสร็จแล้วจะได้ดังนี้ ให้เราคลิกเพื่อดูรายละเอียดของ CloudMQTT ของเราได้ที่ menu ด้านล่าง


– ค่า config CloudMQTT ตรงนี้ เดี๋ยวเราจะใช้กับ webhook ที่เป็น node.js ของเรานะครับ

4.LINE Bot API Code (node.js)

File หลักๆ ที่เราจะใช้ ในการ Deploy ขึ้น Heroku App ของเรา มี 2 file ครับคือ
Procfile (ไม่ต้องมี .txt) นะ ใช้สำหรับบอกว่า ให้ App เราทำงานแบบไหน เรียก file ไหน
index.js เป็น file หลัก ของ LINE Bot API เราครับ

จากนั้น เรามาดูที่ code ที่เป็น LINE Bot API กันครับ
ส่วนที่เราจะต้องแก้ไข หลักๆ มีด้วยกัน 3 จุดครับคือ

CH_ACCESS_TOKEN คือค่า ยาวๆ ที่เราได้จาก Channel access token (long-lived) ของ Messaging API
mqtt_host คือค่าที่เราได้จาก CloudMQTT บน Heroku
options คือค่าต่างๆ ที่เราได้จาก CloudMQTT บน Heroku เช่นกันครับ

Code LINE Bot API ที่เป็น node.js สำหรับ Deploy ขึ้น Heroku ของเราครับ
ใครที่เขียน code คล่องๆ แก้ไข ให้ code สวยงาม กระชับกว่านี้ได้นะครับ อันนี้ผมเขียนแบบด่วนๆ มาก 🙁

Procfile

web: node index.js

 

index.js

var express = require('express')
var bodyParser = require('body-parser')
var request = require('request')
var app = express()

var mqtt = require('mqtt');

// Your Channel access token (long-lived) 
const CH_ACCESS_TOKEN = '';

// MQTT Host
var mqtt_host = 'mqtt://m15.cloudmqtt.com';

// MQTT Topic
var mqtt_topic = '/ESP32';

// MQTT Config
var options = {
    port: 15443,
    host: 'mqtt://m15.cloudmqtt.com',
    clientId: 'mqttjs_' + Math.random().toString(16).substr(2, 8),
    username: 'mqttuser',
    password: 'mqttpass',
    keepalive: 60,
    reconnectPeriod: 1000,
    protocolId: 'MQIsdp',
    protocolVersion: 3,
    clean: true,
    encoding: 'utf8'
};


app.use(bodyParser.json())

app.set('port', (process.env.PORT || 4000))
app.use(bodyParser.urlencoded({extended: true}))
app.use(bodyParser.json())

app.post('/webhook', (req, res) => {
  var text = req.body.events[0].message.text.toLowerCase()
  var sender = req.body.events[0].source.userId
  var replyToken = req.body.events[0].replyToken
  console.log(text, sender, replyToken)
  console.log(typeof sender, typeof text)
  // console.log(req.body.events[0])

  if (text === 'info' || text === 'รายงาน') {
    // Info
    inFo(sender, text)
  }
  else if (text === '1' || text === 'เปิด' || text === 'on') {
    // LED On
    ledOn(sender, text)
  }
  else if (text === '0' || text === 'ปิด' || text === 'off') {
    // LED Off
    ledOff(sender, text)
  }
  else {
    // Other
    sendText(sender, text);
  }

  res.sendStatus(200)
})

function sendText (sender, text) {
  let data = {
    to: sender,
    messages: [
      {
        type: 'text',
        text: 'กรุณาพิมพ์ : info | on | off | เปิด | ปิด เท่านั้น'
      }
    ]
  }
  request({
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer '+CH_ACCESS_TOKEN+''
    },
    url: 'https://api.line.me/v2/bot/message/push',
    method: 'POST',
    body: data,
    json: true
  }, function (err, res, body) {
    if (err) console.log('error')
    if (res) console.log('success')
    if (body) console.log(body)
  })
}

function inFo (sender, text) {
  let data = {
    to: sender,
    messages: [
      {
        type: 'text',
        text: 'uid: '+sender
      }
    ]
  }
  request({
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer '+CH_ACCESS_TOKEN+''
    },
    url: 'https://api.line.me/v2/bot/message/push',
    method: 'POST',
    body: data,
    json: true
  }, function (err, res, body) {
    if (err) console.log('error')
    if (res) console.log('success')
    if (body) console.log(body)
  })
}


function ledOn (sender, text) {
  var client = mqtt.connect(mqtt_host, options);
  client.on('connect', function() { // When connected
      console.log('MQTT connected');
      // subscribe to a topic
      client.subscribe(mqtt_topic, function() {
          // when a message arrives, do something with it
          client.on('message', function(topic, message, packet) {
              console.log("Received '" + message + "' on '" + topic + "'");
          });
      });
      

      // publish a message to a topic
      client.publish(mqtt_topic, 'on', function() {
          console.log("Message is published");
          client.end(); // Close the connection when published
      });
      
  });
    

  let data = {
    to: sender,
    messages: [
      {
        type: 'text',
        text: 'LED ON'
      }
    ]
  }
  request({
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer '+CH_ACCESS_TOKEN+''
    },
    url: 'https://api.line.me/v2/bot/message/push',
    method: 'POST',
    body: data,
    json: true
  }, function (err, res, body) {
    if (err) console.log('error')
    if (res) console.log('success')
    if (body) console.log(body)
  })
}

function ledOff (sender, text) {
  var client = mqtt.connect(mqtt_host, options);
  client.on('connect', function() { // When connected
      console.log('MQTT connected');
      // subscribe to a topic
      client.subscribe(mqtt_topic, function() {
          // when a message arrives, do something with it
          client.on('message', function(topic, message, packet) {
              console.log("Received '" + message + "' on '" + topic + "'");
          });
      });
      

      // publish a message to a topic
      client.publish(mqtt_topic, 'off', function() {
          console.log("Message is published");
          client.end(); // Close the connection when published
      });
      
  });

  let data = {
    to: sender,
    messages: [
      {
        type: 'text',
        text: 'LED OFF'
      }
    ]
  }
  request({
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer '+CH_ACCESS_TOKEN+''
    },
    url: 'https://api.line.me/v2/bot/message/push',
    method: 'POST',
    body: data,
    json: true
  }, function (err, res, body) {
    if (err) console.log('error')
    if (res) console.log('success')
    if (body) console.log(body)
  })
}

app.listen(app.get('port'), function () {
  console.log('run at port', app.get('port'))
})

 


– CH_ACCESS_TOKEN คือค่ายาวๆ ตรงนี้แหละครับ


– mqtt_host กับ options คือค่าที่ได้จาก CloudMQTT ตรงนี้ครับ

5.Deploy Webhook API code ขึ้น Heroku

จาก Step 3 ที่เราสร้าง App ของเราไว้ อย่างของผมจะชื่อ esp32-mqtt ให้เราเข้ามาที่ Deploy

– อันดับแรกเลย ถ้าเรายังไม่เคยใช้ Heroku ให้ Download และ Install Heroku CLI กันก่อนที่
Download and install the Heroku CLI


– หลังจากลง Heruku CLI เสร็จแล้ว ที่ Terminal พิมพ์ heroku login


– ตัว Browser จะเด้งหน้า Heroku Login ขึ้นมา ให้เราทำการ Login ให้เรียบร้อย


– เมื่อเรา Login สำเร็จแล้ว ก็จะเข้าสู่ขั้นตอนถัดไป ที่ Terminal (CLI)

ทำการสร้าง Git repository

$ cd my-project/
$ git init
$ heroku git:remote -a esp32-mqtt

ทดลอง Deploy

$ git add .
$ git commit -am “make it better”
$ git push heroku master

จากนั้น สร้าง file จาก Step 4 คือ Procfile กับ index.js ที่ Directory ที่สร้างขึ้น อย่างของผมจะเป็น esp32-mqtt

จากนั้น install module ที่จำเป็น ที่เราใช้ในการเขียน App ของเรา ดังนี้

$ npm install express –save
$ npm install request –save
$ npm install mqtt –save

$ npm init

เราจะได้ file ต่างๆ เพิ่มเข้ามา ใน directory ของเรา

ทดลอง run Wehhook API ที่เราเขียน ด้วย node.js ค่า default จะเป็น port 4000
node index.js

เข้าผ่าน localhost:4000 จะได้ดังรูป Error ไม่เป็นไรครับ ถือว่าทำงานได้แล้ว เพราะเราไม่รับ GET

ทำการ Deploy code จริง ขึ้น Heroku

$ git add .
$ git commit -am “add Procfile index.js”
$ git push heroku master

จากนั้นลองเข้า App ของเราผ่าน URL ที่เราทำการตั้งไว้ อย่างของผมจะเป็น
https://esp32-mqtt.herokuapp.com/

หน้าจะจะได้แบบนี้ ไม่ต้องตกใจครับ เพราะเราไม่รับ GET
แต่ถ้าไม่ได้ ให้เราลองใช้ CLI ดู logs ว่าผิดพลาดตรงไหน

$ heroku logs –tail

เสร็จแล้วครับ LINE Bot API (webhook) ของเรา บน Heroku .. 🙂

6.Config Webhook API ของเราเข้ากับ LINE Messaging API

มาถึงขั้นตอนสุดท้ายในส่วนของ Webhook API ของเรากันแล้วครับ นั่นคือ การผูกกับ LINE Messaging API

– ขั้นตอนแรก เราต้องไป Use webhooks ให้ Enabled แล้ว Save ก่อนนะครับ ตกม้าตาย ตรงนี้กันมาเยอะแล้ว 🙁
– จากนั้น ใส่ URL ของ App เรา ที่ได้จาก Heroku แล้วตามด้วย /webhook ครับ อย่างของผมก็จะเป็น
https://esp32-mqtt.herokuapp.com/webhook
– จากนั้น กด Verify ดูครับ ถ้าไม่มีอะไรผิดพลาด ก็จะ Success ครับ 🙂


– ประมาณนี้ ก็เป็นอันว่า เรียบร้อยแล้วครับ LINE Messaging API กับ Webhook บน Heroku เราใช้งานได้แล้ว 🙂

7.เขียน code Arduino ให้กับ Node32 Lite

ดูวิธีการติตตั้งบอร์ดใหม่ๆ (Node32 Lite) เข้าไปใน Arduino IDE ได้ที่นี่ครับ
http://www.ayarafun.com/2018/12/how-to-setup-lamloei-32-lite-with-arduino/

เลือกชนิดของ Board ที่เราใช้ให้ถูกต้อง แล้วทำการ Verify และ Upload Code โลดครับ ..

– ในที่นี้ผมใช้บอร์ด Node32 Lite จะต้องเลือกเป็น Node32s รุ่นพี่มันครับ 🙂

ตัว Arduino IDE ให้เราทำการ add Library PubSubClient กับ WiFiManager เข้าไปด้วยครับ


– ไปที่ Tools > Manage Libraries…


Manage Libraries…


– Add Lib PubSubClient


– Add Lib WiFiManager

สำหรับ code จะมี 2 แบบ คือ

แบบ ที่ 1 fix SSID กับ password ไปใน code เลย แบบนี้จะดี ตรงที่เราไม่ต้องมา config ให้บอร์ดเราไปเกาะ WiFi อีกรอบ เหมาะสำหรับการทดลอง หรือใช้ SSID เดิมตลอด ..


– ถ้าเราดูจาก Serial Monitor จะเห็นรายละเอียดการ connect แบบ fix SSID ดังนี้

แบบ ที่ 2 ใช้ WiFiManager คือจะสามารถ config ให้ Node32 Lite ของเราไปเกาะ SSID (AP) ตัวที่เราต้องการได้ อันนี้จะสะดวก เวลาไปใช้งานจริง ไม่ต้อง Upload code เข้าไปใหม่


– วิธีการ config ด้วย WiFiManager หลังจาก Upload Code เสร็จ ให้เราไปเกาะ SSID ชื่อ ESP32_xxxxxx จะขึ้นหน้า menu config ดังรูป


– จากนั้นเลือก SSID(AP) ที่เราต้องการจะให้ไปเกาะ ใส่ password แล้วกด Save


– ถ้าเราดูจาก Serial Monitor จะเห็นรายละเอียดการ connect แบบใช้ WiFiManager ดังนี้

มาดูในส่วนของ Code กันครับ

Code แบบที่ 1 fix SSID กับ password ใน code

#include <PubSubClient.h>
#include <WiFi.h>

// Update these with values suitable for your network.
const char* ssid = "tonofarm.io"; // AP Name
const char* password = "********"; // AP Password

// Config MQTT Server
#define mqtt_server "m15.cloudmqtt.com"
#define mqtt_port 15443
#define mqtt_user "mqttuser"
#define mqtt_password "mqttpass"

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  // Set LED_BUILTIN 
  pinMode(LED_BUILTIN, OUTPUT);

  Serial.begin(115200);
  delay(10);

  Serial.println();

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

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}

void loop() {
  if (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
      return;
    }
  } else {
    // MQTT Topic /ESP32
    client.subscribe("/ESP32");
  }
  client.loop();
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  String msg = "";
  int i = 0;
  while (i < length) msg += (char)payload[i++];
  Serial.println(msg);
  digitalWrite(LED_BUILTIN, (msg == "on" ? LOW : HIGH));
}

 

Code แบบที่ 2 ใช้ WiFiManager ในการ config

#include <FS.h>                   //this needs to be first, or it all crashes and burns...
#include <PubSubClient.h>
#include <WiFi.h>
#include <DNSServer.h>
#include <WiFiManager.h>

//flag for saving data
bool shouldSaveConfig = false;

//callback notifying us of the need to save config
void saveConfigCallback () {
  Serial.println("Should save config");
  shouldSaveConfig = true;
}

// Config MQTT Server
#define mqtt_server "m15.cloudmqtt.com"
#define mqtt_port 15443
#define mqtt_user "mqttuser"
#define mqtt_password "mqttpass"

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  // Set LED_BUILTIN 
  pinMode(LED_BUILTIN, OUTPUT);

  Serial.begin(115200);
  delay(10);

  Serial.println();

  WiFiManager wifiManager;
  wifiManager.autoConnect();

  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}

void loop() {
  if (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
      Serial.println("connected");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
      return;
    }
  } else {
    // MQTT Topic /ESP32
    client.subscribe("/ESP32");
  }
  client.loop();
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  String msg = "";
  int i = 0;
  while (i < length) msg += (char)payload[i++];
  Serial.println(msg);
  digitalWrite(LED_BUILTIN, (msg == "on" ? LOW : HIGH));
}

 

Source Code ใน GitHub ตามนี้เลยครับ https://github.com/pornpasok/esp32_line_bot_mqtt

8.เรียบร้อยแล้ว ทดสอบใช้งาน

ทำการ Add LINE Bot ของเรา ก่อนนะ จากนั้นทดลองดังนี้ได้เลย

– ถ้าเราพิมพ์ On/on/เปิด/1 ไฟ LED ที่ตัว Node32 Lite ของเราก็จะติดครับ
– ถ้าเราพิมพ์ Off/off/ปิด/0 ไฟ LED ที่ตัว Node32 Lite ของเราก็จะดับครับ
– ถ้าเราพิมพ์ info/รายงาน บอทของเรา ก็จะรายงาน UID ของเราครับ เพื่อเอาไปใช้งานต่อยอดอื่นๆ

ปล. เดี๋ยวพรุ่งนี้ ถ่าย Video มาให้ดูกันนะครับ ว่าการทำงานของมันเป็นยังไง ถ่ายเองกดเอง ไม่ไหว 🙁

Next Step …

– ต่อกับ Relay เพื่อใช้งานกับอุปกรณ์ไฟฟ้าจริงครับ (อันนี้อันตรายนะครับ ต้องระวังด้วยเพราะเล่นกับไฟ 220v)
– ต่อยอดให้ LINE Bot ของเรา มีความสามารถมากกว่านี้ครับ เช่น monitor หรือรายงาน ค่าต่างๆ ให้เราได้
– ทำ Box ให้ดี ให้สวยงาม กันน้ำ ติด Solar Cells เอาไปใช้งานจริงกันครับ ..

สำหรับท่านใด ที่มีข้อสงสัย หรือไม่เข้าใจตรงส่วนไหน สามารถ Post ถามได้ที่บทความนี้ครับ
หรือ Add LINE ID: pornpasok เข้ามาสอบถามก็ได้ครับ ถ้าตอบได้ผมจะตอบให้นะครับ 🙂

Facebook Comments

ESP32 (NODE32 LITE) PM2.5+Temperature+Humidity Sensors Node

เนื่องในวัน ESP32 Day (03/02/2019) ผมเองไม่ได้ไปร่วมงานที่จัดกัน เพราะติดงานอื่น และได้ sensors วัด PM2.5 มาพอดี ก็เลยมาทำ Sensers Node เพื่อวัดค่า PM2.5 ในบริเวณที่อยู่อาศัย แล้วส่งขึ้น thingspeak.com และ netpie.io freeboard เพื่อทำ Dashboard สวยๆ งามๆ และเป็นประโยชน์ในการรายงานค่า PM2.5 ที่มีปัญหากันอยู่ในประเทศไทย ตอนนี้ ให้เพื่อนๆ พี่ๆ น้องๆ ได้รับทราบกันครับ …

1. อุปกรณ์ และ stack ที่ใช้มีดังนี้

ESP32 (NODE32 LITE) 275 บาท [https://gravitechthai.com/product_detail.php?d=3318]
SHARP GP2Y1010AU0F (PM2.5 Sensor) 137 บาท [https://shopee.co.th/product/59553004/1361931900]
AM2302 (Temperature+Humidity Sensor) 180 บาท [https://www.myarduino.net/product/725/]
thingspeak.com
netpie.io

รวมราคา อุปกรณ์ ที่ใช้ ประมาณ 600 บาท ครับ 🙂

2. รายละเอียด ของ SHARP GP2Y1010AU0F Sensor

สำหรับรายละเอียด ของแต่ละ PIN ของ SHARP GP2Y1010AU0F เป็นดังนี้ครับ
โดยจะต้องมี C 220 uF และ R 150 ohm ต่อด้วย (ตัวที่ผมซื้อมา พี่จีน ลืมแถมมาให้ +__+)


Sensor ที่ผมได้มา จะแถมสาย เรียงสีมาแบบนี้เลยครับ แต่มีบาง version จะเป็นสีเรียงต่างจากนี้ ไม่ต้องตกใจครับ ..


PIN ต่างๆ มีดังนี้ INPUT จะมี LED PIN (Digital PIN) กับ Vo PIN (Analog PIN)


รายละเอียดการต่อขาต่างๆ ในที่นี้เทียบกับ Arduino ถ้าเป็น ESP32 ก็คล้ายๆ กันครับ

3. PIN ต่างๆ ที่ใช้งานกับ ESP32 (NODE32 LITE)

สำหรับในการต่อใช้งาน กับ ESP32 (NODE32 LITE) ผมจะใช้ PIN ต่างๆ ประมาณนี้
PIN 13 กับขา INPUT ของ AM2302 (Temperature+Humidity Sensor)
PIN 16 กับขา LED ของ SHARP GP2Y1010AU0F (PM2.5 Sensor)
PIN 36 (Analog INPUT) กับขา Vo ของ SHARP GP2Y1010AU0F (PM2.5 Sensor)


การเชื่อมต่อ Node32 Lite + Sharp GP2Y1010AU0F และ AM2302


ในรูป ยังไม่ได้ต่อ AM2302 (Temperature+Humidity Sensor) แต่คิดว่าเพื่อนๆ น่าจะเคยใช้งานกันมาแล้ว

ใน Arduino IDE เราจะต้องทำการเพิ่ม PMSensor Library เข้าไปด้วยนะครับ

4. Source Code

สำหรับ Code ผมเขียนเป็น Deep Sleep Mode ทุกๆ 1 นาที ประมาณนี้ครับ ..
ถามว่าทำไมต้อง Deep Sleep Mode?
คำตอบคือ เพื่อประหยัด battery เวลาใช้งานจริงครับ และอุปกรณ์พวกนี้ ถ้าให้ connect WiFi ตลอดเวลา จะเกิดความร้อนสูงมาก ทำให้ ประสิทธิภาพในการทำงาน ลดลง หรือทำงานผิดพลาดได้ง่าย ครับ ..

/* Connect to SHARP PM2.5 Sensor*/
#include <PMsensor.h>
PMsensor PM;
#include <WiFi.h>
#include "DHT.h"
#define DHTPIN 13   // NodeMCU PIN D1
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);

// AP 
const char* ssid     = "SookYenFarm";    // SSID Wifi
const char* password = "********";   // Password Wifi

// HTTP API 
const char* host = "api.thingspeak.com";
const char* api   = "********";  //API Key

int value = 0;
void connect() {
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println("DHT22 test!");
  
  dht.begin();

  // LED Stop
  //digitalWrite(LED_BUILTIN, HIGH);
  //delay(10);
  //delay(60000);
  ++value;
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  float f = dht.readTemperature(true);
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }
  float hif = dht.computeHeatIndex(f, h);
  float hic = dht.computeHeatIndex(t, h, false);
  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
  Serial.print("connecting to ");
  Serial.println(host);

  float pm = 0;
  int err = PMsensorErrSuccess;
  
  if ((err = PM.read(&pm, true, 0.1)) != PMsensorErrSuccess) {
    Serial.print("data Error = ");
    Serial.println(err);
    return;
  }
  Serial.print("PM2.5: ");
  Serial.print(pm);
  Serial.println(" ppm");

  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

  // We now create a URI for the request
  String url = "/update?api_key=";
  url += api;
  url += "&field1=";
  url += t;
  url += "&field2=";  
  url += h;
  url += "&field3=";  
  url += pm;
  // https://api.thingspeak.com/update?api_key=xxxxxxxxxx&field1=t&field2=h&field3=pm
  Serial.print("Requesting URL: ");
  Serial.println(url);
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
   //Wait up to 10 seconds for server to respond then read response
   int i=0;
   while((!client.available()) && (i<1000)){
     // LED Blink
     digitalWrite(LED_BUILTIN, LOW);
     delay(10);
     //Serial.println(i);
     i++;
   }
   while(client.available()){
     String line = client.readStringUntil('\r');
     Serial.print(line);
   }
   Serial.println();
   Serial.println("closing connection");
}
void setup() {
  Serial.begin(115200);
  Serial.setTimeout(2000);
  delay(1000);
  pinMode(LED_BUILTIN, OUTPUT);
  /////(infrared LED pin, sensor pin)  /////
  PM.init(16, 36);

  // Wait for serial to initialize.
  while (!Serial) { }

  Serial.println("Device Started");
  Serial.println("-------------------------------------");
  Serial.println("Running Deep Sleep Firmware!");
  Serial.println("-------------------------------------");

  connect();

  Serial.println("Sleeping 60 seconds ..");
  // Deep Sleep 60 seconds
  ESP.deepSleep(58e6); // 60e6 is 60 microsecondsESP.
  //ESP.deepSleep(298e6); // 5*60 microsecondsESP.
}

void loop() {
}

Source Code ใน GitHub ตามนี้เลยครับ ESP32 PM2.5 sensor

5. Data ที่ Feed ขึ้น ThingSpeak

https://thingspeak.com/channels/91414

6. Dashboard ที่ feed จาก ThingSpeak ขึ้น netpie.io Freeboard

Next Step …

– ทำ Shield สำเร็จรูป SHARP GP2Y1010AU0F + AM2302 สำหรับ ESP32 (NODE32 LITE)
– ทำ Box กันน้ำ เพื่อให้สามารถนำไปติดตั้งตามจุดต่างๆ ได้สะดวกขึ้น
– ใช้แผง Solar Cells มาใช้งานกับ Battery 18650
– รายงาน รายละเอียด ผ่าน LINE Bot
– สั่งปั้มพ่นหมอกทำงาน เมื่อค่า PM2.5 เกินกำหนด 🙂

Reference Links
https://blog.netpie.io/archives/3028
https://www.instructables.com/id/How-to-Interface-With-Optical-Dust-Sensor/

ปล. สำหรับใครที่สนใจอยากทำบ้าง หรือสงสัยตรงไหน สามารถ post ถามได้ที่ blog นี้ได้เลยครับ 🙂

Facebook Comments

LINE Bot + node.js + MQTT + ESP32 (IoT) เปิด/ปิด ไฟ (ตอนที่ 1)

สวัสดีครับ เพื่อนๆ ทุกท่าน ผมเอง ไม่ได้ มา update blog เป็นเวลานานเหมือนกัน เผลอๆ แป๊บๆ ก็จะสิ้นปีอีกแล้ว ..

ปีนี้ ที่ผ่านมาผมได้มีโอกาสกลับไปอยู่บ้าน ที่จันทบุรี ได้ลงไปสัมผัส ไปเป็นเกษตรกรจริงๆ ด้วยตัวเอง ทำให้ได้รับประสบการณ์ ที่ดีมาก ได้รู้ว่าจริงๆ แล้ว เกษตรกร (ชาวสวน) เค้าต้องการอะไร เค้าขาดอะไร และทำอย่างไร จะทำให้ การทำงานมีประสิทธิภาพมากขึ้น มีเวลาพักผ่อนอยู่กับครอบครัวมากขึ้น มีความสุขมากขึ้น รายได้เพิ่มขึ้น และค่าใช้จ่ายลดลง ..

จึงเกิดเป็น Project นี้ขึ้นมา คือระบบเปิด/ปิด มอเตอร์สูบน้ำ ผ่าน LINE Bot หรือ LINE Messaging API นั่นเอง ที่ผมเลือกใช้ Chat Bot มาเป็นระบบสั่งเปิด/ปิด เพราะว่า เป็นการง่ายสำหรับเกษตรกร เพราะปกติเค้าใช้ LINE ผ่านมือถือกันอยู่แล้ว จะได้ไม่ต้องวุ่นวาย ลง App ใหม่ๆ หรือเรียนรู้ App ใหม่ๆ เพราะแค่พิมพ์ เปิด/ปิด มอเตอร์สูบน้ำ ที่อยู่ ที่สระน้ำสาธารณะ ของหมู่บ้าน หรือตามริมคลอง ริมแม่น้ำ ก็จะทำงานตามคำสั่งทันที ..

Stack ที่ผมใช้ ใน Project นี้ จะเป็น Open Source ทั้งหมด และมีให้เราใช้ฟรีๆ กันอยู่แล้ว ส่วนตัว H/W (IoT device)  ตอนแรก ผมสนใจ NB-IoT, LoRa เหมือนกัน เพราะตาม concept มันเหมาะมาก ในเรื่องของการรับส่งระยะไกล และประหยัดพลังงาน แต่ติดอยู่ที่ว่า ราคาของ H/W ยังสูง และเครือข่าย ยังไม่ครอบคลุมทั่วถึง ก็เลยกลับไปคิดถึง IoT device ที่เป็น WiFi 2.4GHz ทั่วๆ ไป ที่ราคาตอนนี้ ไม่แพง ประมาณ 100-150 บาท/บอร์ด เช่นพวกที่ใช้ chip ESP8266, ESP32 แทน และบริเวณที่ไปใช้งาน ไฟฟ้าเข้าถึงแล้ว จึงไม่ต้องห่วงเรื่องของพลังงานไฟฟ้า เท่าไรนัก แต่ถ้าเป็นไปได้ ก็จะทำให้อยู่ใน deep sleep mode เพราะจะทำให้ประหยัดพลังงานและ เกิดความร้อน น้อยกว่า mode ปกติ ..

Stack ต่างๆ สรุป มีดังต่อไปนี้ 
– LINE Messaging API (LINE Bot)
– node.js (Heroku)
– MQTT (Heroku)
– ESP32 (IoT device) + WiFiManager

อ่านต่อตอนที่ 2 (ตอนจบ) ได้ที่นี่ครับ http://ton.packetlove.com/blog/iot/line-bot-node-js-mqtt-esp32-iot-2.html

Add LINE มาลองเล่น กับ tonofarmbot กันดูได้ครับ

Facebook Comments

แต่ง รถพับ Dahon Boardwalk ทำ Light Touring

Dahon Boardwalk

ช่วงนี้ ผมเองปั่นจักรยาน เป็นประจำทุกวัน ก็เลยจะมาเล่าเรื่องจักรยานที่ใช้อยู่ให้เพื่อนๆ ที่เข้ามาอ่าน ได้อ่านกันเผื่อเป็นแนวทาง ในการแต่งจักรยาน ไว้ใช้งาน ไว้ออกกำลังกาย ไว้ท่องเที่ยว touring ..

ผมเองมี เสือภูเขา (MTB) Bianchi JAB 27.3 อยู่แล้วคันนึง คันนี้ เป็นชุด XT เกือบทั้งคัน ขี่ดีมาก แต่ผมจะเอาไว้ใช้งาน ตอนไปทางโหดๆ off-road หน่อย ไม่ค่อยได้ใช้ปั่นกับทางดำ เท่าไร ..

อีกคัน เป็น Dahon Boardwalk คันนี้ เป็นรถพับเดิมๆ 7 speed แต่จะใช้งานบ่อยมาก เพราะว่าสะดวกดี ปั่นทางดำ (ทางลาดยาง) ก็สบายดี หรือพกพาไปปั่น เวลาไปเที่ยว ก็ทำได้สะดวก รถเดิมๆ ก็ปั่นดีในระดับนึงแล้ว แต่ก็มีหลายๆ ส่วนที่ยังไม่ดีพอ ก็เลยต้องแต่งเพิ่ม (upgrade) หลังจากปั่นมาได้สักพัก ผมก็พบว่าอะไรบ้างที่ควรจะต้องทำการ upgrade เพิ่ม สำหรับเจ้าตัว Dahon Boardwalk เดิมๆ มีประมาณนี้ ..

– ชุดล้อ (ล้อ, ยาง) ล้อเดิมๆ จะเป็นอลูมิเนียม ขอบชั้นเดียว ถึงแม้จะเป็นล้อเล็ก แต่เวลากระแทก ตกหลุม หนักๆ ล้อจะเบี้ยวง่าย
– จานหน้า ผมเคยเจอปัญหาโซ่หลุด เพราะจานหน้าเบี้ยว ต้องทำการดัดเอาเอง ให้ตรง จานหน้าจะเบี้ยวง่าย เวลาพับ แล้วเดินทาง
– ชุดขับเดิม (7sp) สำหรับชุดขับเดิมๆ ก็ใช้งานได้ดีในระดับนึง แต่ว่า 7sp ไม่เพียงพอ สำหรับทางที่เป็นภูเขาชันๆ

ส่วนที่ติดตั้งเพิ่มเติม เข้าไป ก็จะมีประมาณนี้
– ตะแกรงหลัง อันนี้ ผมใส่เพิ่มเติมเข้าไป เพื่อเอาไว้ทำ light touring สะดวกเวลาเดินทาง
– ไฟหน้า ไฟท้าย

รถผมเอง ตอนนี้ ทำเพิ่มประมาณนี้ครับ
ชุดล้อ
– ล้อ 406 NARRA ขอบเงิน ซี่เงิน ดุมเงิน หน้า-หลัง = 2,200 THB
– ยางนอก SCHWALBE CITIZEN 406 20×1.60 x2 = 900 THB
– ยางใน SCHWALBE 406 AV7 x2 = 330 THB
รวม 3,430 THB

ชุดขับ
– ตีนผี SORA R3000 SS (ขาสั้น)
– Shifter Shimano 9sp
– เฟืองหลัง Shimano Alivio 11-32
– โซ่ KMC 9sp
รวม 2,500 THB

Facebook Comments

Review ที่พัก Siamaze Hostel Bangkok

Siamaze Hostel Bangkok

วันนี้ มีเวลาว่างๆ เลยมาเขียน review แนะนำที่พัก แบบ hostel ที่ไปพักบ่อยๆ เวลาขึ้นมา กทม. สักหน่อย ครับ ..

Siamaze Hostel อยู่ใน รัชดา ซ.17 ห่างจากสถานี รถไฟฟ้าใต้ดิน สุทธิสาร ประมาณ 500m
สามารถเดินเข้าไปได้ง่าย ด้านหน้าซอย 17 จะมีร้านอาหาร ห้างสรรพสินค้าต่างๆ มากมาย ทั้ง MC Donald, Maxvalu, ร้านกาแฟ, ร้านส้มตำ, ร้านสุกี้หม้อไฟ ..

ส่วนด้านใน ซอย 17 ใกล้ๆ กับที่พัก ก็จะมีร้านสะดวกซื้อ ทั้ง 7-ELEVEN และ FamilyMart ร้านอาหารตามสั่ง ต่างๆ ก็มีอยู่หลายร้านบริเวณนั้น ..

ที่ Hostel เอง ก็มีบริการ อาหาร เครื่องดื่ม ให้กับผู้เข้าพัก ในราคาไม่แพง และจะมีฟรี อาหารเช้า แบบที่เรา สามารถทำกินเองได้ (DIY) มีกระทะ เครื่องปิ้งขนมปัง และวัตถุดิบ พวกไข่ ขนมปัง แยม ไว้ให้ น้ำก็จะมีน้ำเปล่า กับน้ำผลไม้ และก็มีขนม กับผลไม้ ไว้ให้ด้วย เรียกว่าครบกันเลยทีเดียว กับฟรี อาหารเช้า ของที่นี่ ..

ผมเอง มาที่นี่ ก็ได้ฝึกวิชา การทอดไข่ สูตรต่างๆ หลายๆ สูตร เลยทีเดียว .. ทำเองกินเอง ก็อร่อยดี สนุกไปอีกแบบ ..
เราทำกินเสร็จ ก็ต้องล้างกระทะ ล้างจาน ล้างแก้ว เองนะครับ ซึ่งทางที่พัก จะมีที่ล้างจาน น้ำยาล้างจาน และฟองน้ำ ไว้ให้พร้อม ..

มาพูดถึงประเภท ของห้องพักกันบ้าง ขึ้นชื่อว่า Hostel ก็แน่นอนว่า ต้องมีห้องนอนรวม (Dorm) แบบเตียง 2 ชั้น หลายๆ เตียงอยู่แล้ว ซึ่งกำลังเป็น trend ฮิต ของนักเดินทาง backpacker ทั่วโลก ในตอนนี้ ..

การที่เราพัก hostel ทำให้เราได้เพื่อน ได้แลกเปลี่ยนภาษา ได้ข้อมูลรายละเอียดต่างๆ ที่จำเป็นในการเดินทาง เพราะส่วนใหญ่แล้ว คนที่พัก hostel จะเป็น backpacker มากประสบการณ์ ..

หอพักรวม 8 เตียง (8-Bed Mixed Dormitory) ราคาจะอยู่ที่ประมาณ 200 บาท
หอพักหญิง 8 เตียง (8-Bed Female Dormitory) ราคาจะอยู่ที่ประมาณ 200 บาท
หอพักรวม 4 เตียง (4-Bed Mixed Dormitory) ราคาจะอยู่ที่ประมาณ 250 บาท
ห้องออง สวีท เตียงแฝด (En Suite Twin) ราคาจะอยู่ที่ประมาณ 900 บาท
ห้องออง สวีท เตียงใหญ่ (En Suite Double) ราคาจะอยู่ที่ประมาณ 900 บาท
ห้องสำหรับครอบครัว (Family) ราคาจะอยู่ที่ประมาณ 1500 บาท

สำหรับคะแนน ถ้าให้เต็ม 10 สำหรับ Siamaze Hostel ผมให้ประมาณนี้ครับ
ความสะอาด 9
สิ่งอำนวยความสะดวก 10
สถานที่ตั้ง 9
ความสะดวกสบายและคุณภาพของห้องพัก 10
การให้บริการ 9
คุ้มค่ากับเงินที่จ่าย 10

สรุป โดยรวมแล้ว เรียกว่าดีมาก ประทับใจมาก
– Staff ก็ช่วยเหลือดี เป็นกันเองดี
– มี free WiFi ที่คุณภาพดี ทำงานได้สบายๆ ..
– มีพื้นที่ส่วนกลาง ให้พักผ่อน หรือนั่งทำงานได้ ..
– ห้องน้ำ แยกหญิงชาย แยกห้องอาบน้ำ เป็นสัดส่วน และมีจำนวนมาก เพียงพอ ให้กับผู้เข้าพัก ได้ใช้งาน ..
– ฟรีอาหารเช้า ของที่นี่ ก็ดี ประทับใจ ทำให้เราได้ประหยัด ค่าอาหารเช้าไปได้อีกเยอะ ในราคาที่พัก แค่ 200 บาท ถ้าใครเข้าพัก ในคืนวันศุกร์ ก็จะมี free buffet B-B-Q ให้ได้ปิ้งย่างกันด้วย ..
– ส่วนเรื่อง ที่ตั้งของ hostel นั้น ก็ถือว่าไม่ไกล จาก MRT สุทธิสารมากนัก สามารถเดินชิลๆ ได้ มีร้านอาหาร ร้านสะดวกซื้อ ใกล้ๆ ที่พัก ไม่ต้องเดินออกไปไกล ..

ผมเห็นฝรั่ง และคนจีนบางคน พักที่นี่กัน หลายเดือนเลย มากี่ครั้ง ห่างกัน 2-3 เดือน ก็ยังเจออยู่ก็มี ..

ดูรายละเอียดที่พัก เพิ่มเติม
Siamaze Hostel Bangkok

ปล.ขอบคุณภาพประกอบ จาก agoda และ Instagram
https://www.instagram.com/explore/tags/siamaze/

Facebook Comments

Happy New Year 2018

ขอกล่าวคำว่าสวัสดีปี 2018 ล่วงหน้าครับ เพราะว่า อีกไม่กี่วัน ก็จะปีใหม่แล้ว
เวลาเลยผ่านไปไวมากจริงๆ ปี 2017 เป็นปีที่ผมเอง พบกับการเปลี่ยนแปลงมากมาย
ตั้งแต่ออกจากงานประจำที่ทำอยู่ เกือบ 10 ปี มาเป็น freelance แบบเต็มตัว ..

งานประจำที่ทำอยู่ ก็ดีมากๆ ครับ หัวหน้าก็ดี ทิศทางของบริษัท ก็ดี แต่ว่าตัวผมเอง
ก็ถึงจุดที่เรียกว่า comfort zone ละ ก็เลยตัดสินใจ ออกมาหาอะไรใหม่ๆ ทำดู
เพราะถ้าไม่เริ่มตอนนี้ แก่ไปกว่านี้ จะเริ่มยากกว่า หรือจะไม่มีโอกาสเริ่ม ก็เป็นได้ ..

ออกมาเป็น freelance ถามว่ายากไหม ยากมากครับ ยิ่งช่วงเริ่มต้น นี่ยิ่งลำบาก
เพราะยังไม่ชิน ปกติทำงานประจำ เดือนๆ ก็ได้รับเงิน แต่ทำงาน freelance
ต้องทำใจไว้เลย ว่าเงินค่าจ้าง จะไม่เป๊ะเท่าไร ทางทีดี ก็ต้องมีหลายๆงาน ไว้รองรับ ..

แต่สิ่งที่ได้มา จากการเป็น freelance สำหรับผม ผมถือว่าคุ้มมากนะ อย่างน้อย เราก็ได้
กลับไปอยู่บ้าน ได้อยู่ใกล้ชิดกับครอบครัว ได้มีเวลาให้พ่อแม่ ญาติพี่น้องมากขึ้น ได้อยู่ใน
สภาพแวดล้อมที่ดี อากาศบริสุทธิ ได้กินอาหารอร่อยๆ ครบทุกมื้อ ได้ออกกำลังกายทุกวัน ..

แล้วก็ได้เดินทาง ท่องเที่ยว ทั้งใน และต่างประเทศตลอด จริงๆ ก็ไปทำงานนะ แต่เวลา
ที่เหลือ ก็มีโอกาสได้ backpack เที่ยวไปด้วยในตัว ทำให้เราได้เห็นมุมมอง ได้เห็นอะไร
ได้ประสบการณ์ ที่เพิ่มเข้ามา ที่หาซื้อไม่ได้ตามห้างสรรพสินค้า มีเงินอย่างเดียว ใช่ว่าจะ
เที่ยวได้ ต้องกล้าเดินทางด้วย เดินทางตอนนี้ ดีกว่ารอให้แก่ มีเงินเยอะ แต่ไม่ได้ไปไหน ..

ถามว่าจุดหมายของชีวิต คืออะไร จริงๆ ผมไม่ได้เป็นคนเป๊ะๆ แบบนั้น แต่ก็มีจุดหมาย
ความต้องการของผมจริงๆ ก็คือลงไปสัมผัส ชีวิตเกษตรกรชาวสวน ว่าเค้าทำอะไรกันบ้าง
แล้วปัญหาที่เค้าเจอ คืออะไร เผื่อเราจะได้เอาจุดตรงนี้ มาช่วยแก้ไขได้ มาทำให้ดีขึ้นได้
แล้วก็อยากนำเอา technology ที่จำเป็น มาช่วยทำให้งานของเกษตรกร ง่ายขึ้น ..

ตอนนี้ นอกจากรับงานนอก ในด้านการทำ web infrastructure ที่ถนัดแล้ว ก็ทำระบบ
ที่จำเป็นสำหรับ Smart Farming ไว้ใช้งาน ให้ตอบโจทย์ ที่เกษตรกร ต้องการจริงๆ ..

ปีหน้า คงได้มี product เป็นของตัวเองจริงๆ จังๆ เอามาให้เพื่อนๆ ได้ดู ได้ใช้งาน
ได้แนะนำติชม เพื่อปรับปรุงกันต่อไป ..

Facebook Comments

Taiwan 1st Time


เมื่อช่วงวันที่ สัปดาห์ที่ผ่านมา ผมมีโอกาสได้ไปเที่ยวไต้หวัน แบบ backpack เลยจะมาเขียนเล่า
เป็นแนวทางสำหรับผู้ที่สนใจ แบคแพคไต้หวัน .. ไต้หวัน เที่ยวง่ายมาก การเดินทางสะดวกสบาย ..

รูปภาพเล่าเรื่อง
https://web.facebook.com/pornpasok/media_set?set=a.10211162146674410.1073741856.1379813288&type=3

Facebook Comments

นั่งรถไฟ ไปฮานอย


เมื่อสัปดาห์ที่ผ่านมา หลังจากปิดงาน project นึงเสร็จ ผมก็มีความคิดที่ว่า อยากลอง นั่งรถไฟ
ไปที่ไหนสักแห่ง แบบที่เค้าไปกัน อย่างเช่น Trans-Siberian แต่ผมเอง ตอนนี้ ยังไม่มีเวลา
และความพร้อมมากขนาดนั้น เลยจะลองหา mini trip ดูก่อน จะได้เตรียมความพร้อมไว้ ..

17 Oct 2017
ตัดสินใจเก็บของใช้ที่จำเป็น ใส่เป้ deuter 55+10 คู่ใจ ที่ใช้ตลอด เวลา backpack ไปที่ต่างๆ
มาที่สถานีรถไฟ หัวลำโพง ถึงหัวลำโพง ประมาณ 3PM ก็เลยมองๆ หา สถานีปลายทางที่อยากไป
สุดท้าย ตัดสินใจว่า น่าจะนั่งไปลงหนองคาย แล้วข้ามไปฝั่งลาว จากลาวนั่งรถบัส ไปลงฮานอย จากนั้น
ค่อยว่ากันอีกที ว่าจะไปไหนต่อดี ..

รถไฟชั้น 3 ขบวน 77 กรุงเทพ (Bangkok) – หนองคาย (Nong Khai) ราคาตั๋ว 253 บาท
ออกจาก กรุงเทพ 6.35 PM ถึง หนองคาย 4.15 AM

นานแล้ว ที่ไม่ได้นั่งรถไฟชั้น 3 นานๆ แบบนี้ ก็สนุกดี ได้พูดคุยกับเพื่อนร่วมเดินทาง ในขบวนเดียวกัน
ส่วนใหญ่ จะเป็นคนอีสาน และคนลาวจากฝั่งลาว ที่มาทำงาน ใน กทม. และเมืองใหญ่ๆ ในไทย
เดินทางกลับบ้านกัน เพื่อไปทำนา เกี่ยวข้าว หลังผ่านช่วงเก็บเกี่ยว ถึงจะเดินทางกลับไปทำงานที่เดิม ..

18 Oct 2017
รถไฟมาถึง สถานีปลายทาง หนองคาย ประมาณ ตี 4 ผู้คนต่างลงจากรถไฟ บ้างก็มีญาติพี่น้องมารอรับ
บ้างก็นั่งรถสามล้อ ไปบ้าน หรือนั่งไปต่อรถที่ขนส่งอีกทีนึง ผมเองลงมาล้างหน้าล้างตา แปรงฟัน
แล้วก็นอนต่อสักพัก (เอาถุงนอนมาด้วย) เพราะยังมืดอยู่เลย ไม่รู้จะไปไหนยังไง ..

นอนอยู่ มีลุงขับสามล้อ มาเรียก บอกว่าไปขนส่ง 60 บาท ผมเองเลยบอกเดี๋ยวค่อยไป ขอพักสักแป๊บนึงก่อน
ประมาณสัก 6 โมงเช้า ลุงมาเรียกอีกรอบ ผมก็เลยไปกับแก ไปถึงขนส่งหนองคาย รถบัสที่จะเข้าไป
ฝั่งลาว มีเที่ยว 7.30 AM ผมเองอยากหาซื้อข้าว ซื้ออะไรกินก่อน ก็เลยซื้อตั๋วเที่ยว 9.30 AM แทน ..
ปล.จริงๆ แล้ว ถ้ารออีกสักนิด จะมีขบวนรถไฟ หนองคาย – เวียงจันทร์ วิ่งเข้าลาวเลย ไม่ต้องต่อหลายต่อ
ราคา 20 บาท อันนี้ พี่คนไทย ที่มาปั่นจักรยาน ในลาว เขาบอกมาอีกที ตอนผมไปเจอพี่เค้าที่ขนส่งสายใต้ลาว ..

ระหว่างที่รอรถ ก็เดินเล่น หาถ่ายรูปแนว street ในตลาดสด ใกล้ๆ สถานีขนส่ง และหาข้าวเช้ากิน ..
9.30 AM รถบัส ก็ออกตรงเวลา จากสถานีขนส่ง หนองคาย ข้ามสะพานมิตรภาพไทย-ลาว ผ่านด่าน
ตรวจคนเข้าเมือง มาจอดที่ตลาดเช้าเวียงจันทร์ ผมโชคดี ได้เพื่อนตอนนั่งรถมาด้วยกัน เป็นสาวเวียดนาม
เชื้อสายไทย พูดไทยได้ ชื่อฟ้า ทำงานอยู่ศรีราชา เค้ากำลังกลับบ้าน ที่ดานัง เหมือนกัน เค้าก็เลยพาผมไปขึ้น
รถเมล์เขียว เพื่อไปลง ที่ขนส่งสายใต้ ซึ่งอยู่ไกลกันพอสมควร ค่ารถเมล์ ประมาณ 20 บาทไทย ..

ถึงขนส่งสายใต้ กว้างขวาง สะอาดสะอ้านดี แต่ว่ารถที่จะไป ฮานอย มีเที่ยว 6.00 PM ผมก็เลยหาอะไรกิน
เดินถ่ายรูปเล่น แถวๆ นั้นไปเรื่อย เจอพี่คนไทย ชื่อสงกรานต์ มาทำงานที่เวียงจันทร์ เลยมาปั่นจักรยานเล่น
ได้คุยกับพี่เค้า ได้ความรู้ในการเดินทาง และประสบการณ์ต่างๆ ในลาวเยอะพอสมควรเลย ..

Facebook Comments