วันอาทิตย์ที่ 27 มีนาคม พ.ศ. 2559

mosquitto คำสั่ง publish และ คำสั่ง subscribe

กรณี ต้องการรับค่า จาก server (bloger) ชื่อ m10.cloudmqtt.com  โดยมีค่า port คือ 13487
และมี user/password ที่ได้รับอนุญาต รับค่าได้ คือ test/test
โดยรับค่าเฉพาะ /room02/ ทั้งหมด มาแสดง จะต้องใช้ดังนี้

mosquitto_sub -h m10.cloudmqtt.com -p 13487 -u test -P test -t /room02/# -v

-------------------------------------------------------------------------------
สำหรับในการส่งค่าขึ้น mosquitto ที่เรียกว่า publish จะใช้คำสั่งดังนี้

mosquitto_pub -h m10.cloudmqtt.com -p 13487 -u test -P test -t /room02/Temperature -m 20.4

-------------------------------------------------------------------------------

วันอาทิตย์ที่ 20 มีนาคม พ.ศ. 2559

Sonoff Hack! ขา pin ต่างๆ สำหรับ upload โคดเอง


ขา pin ของ Sonoff เป็นไปตามภาพนี้

*ข้อควรระวัง ขา Rx ฝั่งนึง จะต่อกับขา Tx อีกฝั่งนึงเสมอ
และก่อนเสียบ USB to TTL ให้กดปุ่ม GPIO 0 ค้างไว้ หลังเสียบเสร็จค่อยปล่อย

ที่เหลือก็  upload/flash ได้ตามปกติ และจะได้ครั้งเดียว ต้องถอดเสียบใหม่ทำเหมือนเดิม



วันพฤหัสบดีที่ 3 มีนาคม พ.ศ. 2559

วิธีสำเนาโปรแกรมในรอมของ NodeMCU / Witty Node ESP8266


บางครั้ง การ compile และ upload ตัวโปรแกรมลงสู่รอมของ NodeMCU ที่ซ้ำๆกันจำนวนมาก
เสียเวลาต้องมา compile เพื่อ upload ใหม่

เรามาดูวิธีการดูด โปรแกรมที่ upload ขึ้นรอมไปแล้ว กันดีกว่า
โดยตัวโปรแกรมรอมที่ได้จะเป็น binary ไม่ใช่ source code
(คือไม่สามารถดู source code ได้แต่ไว้ทำสำเนา)


ขั้นตอนคือ ใช้โปรแกรม esptool เลย
โดย esptool เราจะพึ่ง script ที่เป็นภาษา python

ฉะนั้น ต้องลง python ให้เรียบร้อยเสียก่อน
และไปหา esptool.py มาใช้งาน

สำหรับคำสั่งการดูดตัว rom ออกมา ในช่วง 1Mb แรก ที่เป็นพื้นที่ปกติของ NodeMCU / WittyNode
ที่เอาไว้ใส่ rom binary มีดังนี้

python esptool.py -b 115200 --port COM3 read_flash 0x000000 0x100000 flash_1M.bin


ให้เปลี่ยน ค่า port ให้ตรงกับที่ NodeMCU/WittyNode เสียบไว้อยู่
กำหนดความเร็วที่ 115200
เพื่อทำการอ่านตั้งแต่ address 0x000000 โดยมีขนาด 0x100000
(หรือ 1Mb อันเป็นพื้นที่สูงสุดในส่วนไว้ลงโปรแกรมทำให้ NodeMCU/ WittyNode ทำงาน)

จะใช้เวลาดูดออกมาสักพัก และไปอยู่ที่ไฟล์ชื่อ flash_1M.bin


จากนั้น ก็เอา NodeMCU / WittyNode Esp8266 อีกตัวมา upload รอมที่ได้เข้าไป ด้วยคำสั่ง

python esptool.py -b 115200 --port COM9 write_flash --flash_freq 80m 0x000000 flash_1M.bin

แก้ค่า port ให้ตรงกับ NodeMCU ตัวใหม่ที่เสียบให้ถูกต้อง
ก็เป็นอันสำเนารอมให้ตรงกับตัวแรกทุกประการ โดยไม่ต้องทำการ compile ใหม่




วันพุธที่ 2 มีนาคม พ.ศ. 2559

การ Flash NodeMCU/ Witty Node คราวละหลายๆ อัน


หลังจากการทำโปรแกรมเสร็จ
หากต้องการทำ flash ทีละหลายๆ อันพร้อมๆกันให้ทำดังนี้

1. flash ปกติชิ้นงานอันแรกด้วย ArduinoIDE* จะได้ ไฟล์ bin ออกมา ให้ save เก็บไว้
ตัวอย่างจะใช้ blink.ino ของ esp8266 เป็นตัวอย่าง

(* สำหรับ ArduinoIDE 1.6.7 หาก เป็น 1.6.8 จะถูกซ่อนไปแล้วต้องใช้ search file นามสกุล .bin เอา )





หลัง sketch/flash ผ่าน Arduino จะได้ Blink.ino.bin ออกมา ให้ save เก็บไว้
เพื่อจะนำไป flash ต่อเองภายหลังที่ address 0x00000000



2. เราใช้ โปรแกรม NodeMCU Firmware Programmer
เปิดหลายๆหน้าต่าง เพื่อทำการ flash  Blink.ino.bin พร้อมๆกันได้ตามต้องการเลย






วันศุกร์ที่ 26 กุมภาพันธ์ พ.ศ. 2559

NodeMCU / WittyNode ESP8266 กับ Ultrasonic Sensor HC-SR04 's WebServer

คุณสมบัติ
- เป็น Sensor Node เน้นราคาประหยัด
ด้วยอุปกรณ์เพียง WittyNode ESP8266 และ Ultrasonic Sensor HC-SR04
ราคารวมเพียง 300-400บาท

- สามารอ่านระยะห่างได้ถึง 3 เมตร  Ultrasonic Sensor HC-SR04 (ประมาณ70บาท)
เอาไปอ่านระยะห่างของวัตถุ หรือ ระยะน้ำในถังได้ (ความแม่นยำใช้งานจริง  +/-   1-2 cm)

- สามารถทำเป็น Sensor Node Cloud ออกไปได้เรื่อยๆ
ผ่านทางสัญญาณ WiFi ได้ด้วยชิป ESP-12F ที่สัญญาณดีขึ้น 30% จาก ESP-12E

- ทำเป็น HTTP Web Server เพื่อทำให้ Computer, Notebook หรือ มือถือสามารถติดต่อเข้ามา
จากที่ไหนๆก็ได้ เพื่ออ่านค่า Sensor เมื่ออยู่ภายในเครื่อข่าย WiFi/LAN เดียวกันก็ได้


การต่อสาย

เนื่องจาก Ultrasonic Sensor HC-SR04 นั้นต้องใช้ไฟเลี้ยง +5VDC
ในขณะที่ WittyNode ESP8266 นั้นทำงานบนไฟ 3.3VDC

ดังนั้น เราจึงต้องต่อ Vcc ของ WittyNode ESP8266 Cloud ซึ่งจะมีค่าไฟ +5VDC
(ตามแหล่งจ่ายไฟจาก microUSB) ไปยัง Vcc ของ sensor
โดยการต่อสาย เพื่อไม่ให้สายระโยงระยาง เราจะต่อสายตามภาพดังนี้












































การ Sketch โปรแกรม ด้วย ArduinoIDE

กำหนด WittyNode ESP8266 สำหรับ ArduinoIDE ให้ติดตั้งเหมือน NodeMCU 1.0
โดยให้เลือก board ด้วย NodeMCU 1.0

































จากนั้น ให้ sketch file นี้ ลงสู่ WittyNode ESP82666 ตามโคดดังนี้

------------------------------------------------------------------------------------
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char* ssid = ".............";        //กำหนดเครื่อข่าย WiFi ของคุณ
const char* password = "..........";  //กำหนด password ของเครือข่าย WiFi

ESP8266WebServer server(80);


#define TRIGGER_PIN       D7    // GPIO13
#define ECHO_PIN          D6   // GPIO12
#define GND_PIN           D5   // GPIO14

// เพื่อความแม่นยำของ Ultrasonic
// จะคำนวนระยะให้ 10 รอบ แล้วตัดค่าที่มากสุด น้อยสุดออกไปแล้วเฉลี่ย8 ค่า
long ultrasonic_distance(){
  long duration[10], distance[10];
  long dist_min, dist_max, dist_sum=0;

  for(int i=0; i<10; i++){
    distance[i]=600;
    while(distance[i]>300){
      digitalWrite(TRIGGER_PIN, LOW);  // Added this line
      delayMicroseconds(2); // Added this line
      digitalWrite(TRIGGER_PIN, HIGH);
      delayMicroseconds(10); // Added this line
      digitalWrite(TRIGGER_PIN, LOW);
      duration[i] = pulseIn(ECHO_PIN, HIGH);
      distance[i] = (duration[i]/2) / 29.1;
      delayMicroseconds(10); // Added this line
    }
 
    if(i==0){
      dist_min= distance[i];
      dist_max= distance[i];
    }else{
      dist_min = (distance[i]<dist_min)? distance[i] : dist_min;
      dist_max = (distance[i]>dist_max)? distance[i] : dist_max;
    }
    dist_sum += distance[i];
  }

  return (dist_sum-dist_min-dist_max)/8;
}


void handleRoot() {
  long distance= ultrasonic_distance();                                     // รับค่าระยะที่อ่านได้จาก Ultrasonic Sensor
  server.send(200, "text/html", "<H1>"+(String)distance+" cm</H1>");       // แสดงผลคืนให้แก่ Web Client ที่ติดต่อเข้ามา
  Serial.println(distance);
}

void setup() {
  Serial.begin (115200);
  pinMode(TRIGGER_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(GND_PIN, OUTPUT); digitalWrite(GND_PIN,LOW);

  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.begin();
  Serial.println("HTTP server started");
}


void loop() {
  server.handleClient();
}



------------------------------------------------------------------------------------

จากนั้น กดปุ่ม Ctrl+Shift + M เพื่อเปิดหน้าต่าง Serial Monitor ดูค่าต่างๆตามที่ได้โปรแกรม
WittyNode จะทำการติดต่อเข้าไปเครือข่าย WiFi ตามที่กำหนด
และแสดงค่า IP ของ WittyNode ที่หลังจาก connect เข้าสู่เครือข่าย WiFiแล้ว
(ในทีนี้คือ เครือข่ายชื่อ ZenCAT )

เราจะใช้ค่า IP ของ WittyNode นี้ในการเปิด Web Browser ต่อไป





ตัวอย่างค่า IP ของ WittyNode หลังต่อเข้าเครือข่าย WiFi แล้ว ในที่นี้คือ 192.168.43.53

หลังจากนั้นก็เข้า Web Browser อะไรก็ได้เช่น Chrome
จาก Computer หรือ Notebook หรือ มือถือ ฯลฯ
ที่อยู่ภายในเครือข่าย WiFi เดียวกันนี้ ( ในที่นี้คือ ZenCAT)

โดยเมื่อใส่ค่า IP ที่ได้มาในช่อง url
จะทำให้  Web Browser จะติดต่อไปยัง WittyNode เพื่อขอให้อ่านค่า Ultrasonic Sensor ให้แสดงผลค่าคืนกลับมา

ตัวอย่างผลที่เรียกจาก Web Browser เมื่อติดต่อไปยัง WittyNode เพื่อขออ่านค่า Ultrasonic Sensor
(หมายเหตุ ตัวอย่างนี้ จะแสดงแบบง่ายๆ ต้อง reflesh หน้า Web Browser เอาเพื่อเรียกอ่านแต่ละครั้ง)




วันศุกร์ที่ 19 กุมภาพันธ์ พ.ศ. 2559

คอมไพล์ LWIP เพื่อเปิด IP Forward ด้วย Espressif Devkit บน Eclipse IDE

1.  Download   Espressif-ESP8266-DevKit-v2.0.9-x86.exe  from
https://github.com/CHERTS/esp8266-devkit/releases

2. Setting this ESP8266-DevKit for Eclipse IDE by following this link
http://www.esp8266.com/viewtopic.php?t=820

3. In the package, there is a example called " lwip_open_demo_app".
แล้วแก้ IP_FORWARD  เป็น 1  ทั้ง lwipopst.h และ opt.h


4.Build All

5. After build จะมี 2 fireware files คือ 0x00000.bin และ 0x40000.bin


6. ..... ?????......

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

NodeMCU / WittyNode ESP8266 กับการส่งข้อมูล sensor DHT11 ขึ้น CloudMQTT

1. สมัคร CloudMQTT แล้ว เพิ่ม mqtt_client_name ตามรูป

2. เข้าไปแก้ไข/เพิ่ม Details ของ mqtt_client_name ที่พึ่งเพิ่ม



3. สร้าง mqtt_user และ mqtt_pass แล้วบันทึก


4, หลังสร้าง mqtt_user แล้ว เลื่อนมาด้านล่างหน้าเดิม ในส่วน ACLs กำหนดตามรูปเลยย


5. จากนั้นแฟรช sketch โค้ดลง ESP8266 ผ่าน Arduino IDE ตามข้างล่าง
(โดยต้องลง library pubsubclient และ dht ไว้ก่อน)

โดยให้ เซนเซอร์ DHT11 ต่อสายสัญญาณเข้าที่ D5
(ไม่งั้นก็แก้ code เอา)














































ในโค็ดให้ใส่ ssid, pass, mqtt_server, mqtt_port, mqtt_user, mqtt_pass, mqtt_client_name
ให้เรียบร้อย

---------------------------
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"


const char *ssid =  "YOUR_ACCESS_POINT";   // cannot be longer than 32 characters!
const char *pass =  "YOUR_PASSWORD";   //

const char *mqtt_server = "m10.cloudmqtt.com";   // ดูจาก cloudmqtt ตอนเพิ่ม
const int mqtt_port = 10525;                                    //  ค่านี้เลย
const char *mqtt_user = "test";                                //  ดูจาก cloudmqtt ตอนเพิ่ม
const char *mqtt_pass = "test";                                //  ดูจาก cloudmqtt ตอนเพิ่ม
const char *mqtt_client_name = "PCPanis";    // Client connections cant have the same connection name



const int dhtPin = D5;      // ต่อสัญญาณ sensor DHT11 เข้าที่ขา D5 ของ NodeMCU
//#define DHTTYPE DHT22
#define DHTTYPE DHT11
DHT dht(dhtPin, DHTTYPE, 12); // The 12 might need tuning so play with 10-15 till it works for the ESP8266
unsigned long previousMillis = 0;
const long interval = 10000;


WiFiClient wclient;
PubSubClient client(wclient, mqtt_server, mqtt_port);

void SendTempHumid();

void setup() {
  // Setup console
  Serial.begin(115200);
  delay(10);
  Serial.println();
  Serial.println();

  dht.begin();
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi connected");
  }

  if (WiFi.status() == WL_CONNECTED) {
    if (!client.connected()) {
      Serial.println("Connecting to MQTT server");
      if (client.connect(MQTT::Connect("mqtt_client_name")
                         .set_auth(mqtt_user, mqtt_pass))) {
        Serial.println("Connected to MQTT server");
      } else {
        Serial.println("Could not connect to MQTT server");
      }
    }

    if (client.connected())
      client.loop();
  }

  SendTempHumid();
}

// Non-Blocking delay
void SendTempHumid(){
  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis >= interval) {
    // save the last time you read the sensor
    previousMillis = currentMillis;

    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
      Serial.println("Failed to read from DHT sensor!");
      //return; This will ensure that data is always sent
    }

    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C ");

    client.publish("/room01/DHT",String(h)+"%"+String(t)+"C" );
  }
}
-----------------------------------------------------

6. เมื่อ NodeMCU (ESP8266)
ทำงานและต่อเข้า router ที่กำหนดที่มี internet เชื่อมต่ออยู่

ค่าที่อ่านจาก sensor DHT11 จะถูกอัพขึ้น CloudMQTT ให้เลย
โดยเมื่อไปดูผลที่หน้านี้จะเห็นปรากฏให้เห็นว่ามีการส่งข้อมูลได้ถูกต้องขึ้นมาเป็นระยะๆ



เป็นอันส่งข้อมูลขึ้น CloudMQTT ได้เรียบร้อย



วันอังคารที่ 19 มกราคม พ.ศ. 2559

IoT Manager : Android APP สำหรับติดต่อ บอร์ดเจ้าเหลือง (Yellow Board ESP)


- ความรู้ที่ต้องมี เรื่อง MQTT (มอสควิโต้)
- pubsub protocal (Publish + Subscript )
- การ flash ไฟล์ sketch file ได้

"เจ้าบอร์ดเหลือง" กับการ flash SKETCH file บน Arduino IDE

1. "เจ้าบอร์ดเหลือง" 


คุณสมบัติ : ใช้ตัวส่งสัญญาณ WiFi ของ ESP8266 ค่าย Espressif
เป็น ESP รุ่น ESP-12 ธรรมดาอยู่ (ยังไม่ใช่รุ่น ESP-12E)

โดย "บอร์ดเจ้าเหลือง" (Yellow board ESP ) นี้
จะมี RGB LED, Photo Sensor วัดแสง, และ LED มาให้
พร้อมเขียนโปรแกรมทดสอบในตัวเลย
แถมไม่พอ มีรังถ่านมาพร้อมใช้เลย





2. วิธีการ flash บอร์ดเจ้าเหลือง ผ่าน Arduino IDE


- ให้ลง Arduino IDE ให้พร้อม พร้อมลง Boards Manager URL สำหรับเตรียมเพิ่มบอร์ด ESP8266 ผ่านทาง เมนู Preference ด้วยค่าดังนี้

            >>  http://arduino.esp8266.com/stable/package_esp8266com_index.json





- การต่อสายสำหรับ flash โปรแกมที่ sketch ไว้ ด้วย FS232 เดินสายตามรูป


- จากนั้น ก็ลอง sketch ไฟล์ arudino ตามต้องการได้เลย