วันพฤหัสบดีที่ 8 มิถุนายน พ.ศ. 2560

ล้าง ESP8266 ใหม่ๆ กันดีกว่า

เวลาเขียน ESP8266 ใช้งานไปในงานนึงๆ
อาจจะมีการ กำหนดตั้ง WiFi เป็นแบบ AccessPoint Mode
นั่นหมายถึง เรามีการนำมา ESP8266 มาปล่อย Hotspot ออกไป
เพื่อให้ อุปกรณ์ WiFi อื่นๆ เข้ามาเป็นลูกข่าย
ทำนองเดียวกับ น้องๆ Router

อย่างไรก็ตามพอเรา นำ ESP8266 กลับมาใช้ในงานอื่นๆ
ที่ไม่ต้องมีการใช้ WiFi แบบ Access Point Mode
แม้ไม่มีการสั่งเปิด Mode นี้ขึ้นมา
แต่ ชื่อ Access Point เดิมที่เคยตั้งไว้ ได้ถูกบันทึกใน ESP8266
ไว้ไม่ได้มีการลบทิ้งแต่อย่างใด

ทำให้ชื่อ Access Point ยังโชว์หรา
อุปกรณ์ WiFi อื่นๆ จะเห็นชื่อ ซึ่งไม่เป็นที่ต้องการ

เราสามารถทำการล้าง ESP8266 ใหม่หมดจด
ด้วย option  "erase_flash" ใน esptool.py โดยใช้เวลาเพียงเสี้ยววินาทีด้วยคำสั่งดังนี้

esptool.py  --port <COM PORT>   erase_flash


ตย.  อุปกรณ์ ESP8266 ต่อที่ COM4
esptool.py  --port COM4  erase_flash

เพียงเท่านี้ Access Point เดิมๆ ที่ไม่ได้เรียกใช้ ก็จะถูกลบทิ้งไป
ไม่ปรากฏเวลา อุปกรณ์ WiFi อื่น กำหนดค้นหา แม่ข่าย WiFi


หมายเหตุ
- ให้ลง ภาษา Python แล้ว เข้าไป download   "esptool.py" ได้ที่
https://github.com/espressif/esptool/blob/master/esptool.py

วันจันทร์ที่ 15 พฤษภาคม พ.ศ. 2560

ESP8266 กับการเขียนแบบ Multitask


ในบางครั้งเรามีความจำเป็นต้องการทำงานหลายๆงานในคราวเดียวกัน
ในการควบคุม ต่างๆบน ESP8266

แต่ในระหว่างงานหนึ่งๆ เราอาจจะมีการใช้คำสั่ง delay()
ซึ่งทำให้ งานที่เหลือ ต้องคอยหยุดชะงักไปด้วย
ซึ่งไม่เป็นการสะดวกอย่างยิ่ง

ตัวอย่างเช่น เรามี งาน 3 Task
Task แรก เราต้องการไฟกระพริบติดดับๆ เป็นระยะๆ ทุก 1 วินาที

uint8_t state;
void setup() {
        state = HIGH;
        pinMode(2, OUTPUT);
        pinMode(2, state);

}
void loop() {
        state = state == HIGH ? LOW : HIGH;
        pinMode(2, state);
        delay(1000);
}

Task ที่สอง
เราต้องการให้มีการแสดงค่าทาง Serial ทุกๆ 5 วินาที

 void loop()  {
        Serial.println("Print Loop Start");
        delay(5000);
        Serial.println("Print Loop End");
        delay(5000);
 }


และ Task ที่สาม อาจจะต้องการให้มีอ่านค่าเม็มโมรี่ที่เหลือ ทุกๆ 10วินาที
void loop() {
        Serial.print("Free Heap: ");
        Serial.print(ESP.getFreeHeap());
        Serial.println(" bytes");
        delay(10000);
}

ตามปกติในแต่ละ Task การใช้ delay(1000)  delay(5000)  และ delay(10000)
( 1 วินาที , 5 วินาที, 10 วินาที)
หากไปใช้ร่วมกันจะเกิดความสะดุดส่งผลกระทบต่อ Task ไปได้อื่นๆด้วย
เช่น ไฟอาจจะไม่กระพริบทุกๆวินาทีต่อเนื่องด้วยดี ตามต้องการ ขึ้นได้

แต่ใน ESP8266 เราสามารถหลีกเลี่ยงไม่ให้ งานทั้ง 3 นี้ต้องมาสะดุดกัน
เสมือนเราเขียนแต่ละ task แต่จับมาร่วมทำงานพร้อมกัน
ที่เรียกว่าการทำงานแบบ Multitasking


ติดตั้ง Library  Esp8266Scheduler

ก่อนอื่นให้เปิดหน้าต่าง Library Manager ขึ้นมาแล้วเพิ่มไลบรารี่ ที่ชื่อว่า Esp8266Scheduler
เข้าไปให้เรียบร้อยเสียก่อน





การเขียน CODE (ตัวอย่างใน example)

Task1 : ให้เขียน code ดังนี้

class BlinkTask : public Task { 
protected:
    void setup() {
        state = HIGH;
        pinMode(2, OUTPUT);
        pinMode(2, state);
    }
    void loop() {
        state = state == HIGH ? LOW : HIGH;
        pinMode(2, state);
        delay(1000);
    } 
private:
    uint8_t state;
} blink_task;



Task 2: ให้เขียน code ดังนี้
class PrintTask : public Task {
protected:
    void loop()  {
        Serial.println("Print Loop Start");
        delay(5000);
        Serial.println("Print Loop End");
        delay(5000);
    }
} print_task;

 Task3 : ให้เขียน code ดังนี้

class MemTask : public Task {
public:
    void loop() {
        Serial.print("Free Heap: ");
        Serial.print(ESP.getFreeHeap());
        Serial.println(" bytes");
        delay(10000);
    }
} mem_task;

ส่วน Code หลัก ให้ ใส่ #include และ setup(), loop() หลัก ตามปกติการเขียนโคดแบบ Arduino
ให้เขียนดังนี้


#include <Arduino.h>
#include <Scheduler.h>
 
         /* ใส่ Task ที่ต้องการตรงบริเวณนี้ */
void setup() {
    Serial.begin(115200);
    Serial.println("");
    delay(1000); 
    Scheduler.start(&blink_task);
    Scheduler.start(&print_task);
    Scheduler.start(&mem_task);
    Scheduler.begin();
} 
void loop() {}

โดย Task ทั้ง 3 ให้ใส่ไว้ก่อน setup() หลัก ของการเขียนแบบ Arduino
หรือจะแยกเป็นไฟล์ต่างหาก แล้ว #include เข้ามาก็ได้

วันศุกร์ที่ 12 พฤษภาคม พ.ศ. 2560

OverClock เพิ่มความเร็วให้ ESP8266 กันดีกว่า

ปกติแล้ว ตาม สเปค ESP82660 จะทำงานที่ 80MHz
ในขณะที่ Arduino UNO R3 จะทำงานที่ 16MHz เท่านั้น

แต่ๆ 80MHz ยังไม่จุใจพอ
ความจริงแล้วเราสามารถปรับให้ ความเร็วเพิ่มไปอีกเท่าตัวเป็น 160MHz กันได้


วิธีเขียนโคดไม่ยากครับเพียงเพิ่มคำสั่งเหล่านี้ลงใน Arduino IDE เวลา sketch


extern "C" { 

#include "user_interface.h" 
}

void setup(){

   //system_update_cpu_freq(80);
   system_update_cpu_freq(160);
}


void loop() {

   //.......
}
เพียงเท่านี้ ก็จะสามารถเพิ่มความเร็ว ESP8266 ได้จุใจกันเลย

วันอาทิตย์ที่ 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 พร้อมๆกันได้ตามต้องการเลย