วันศุกร์ที่ 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 ได้เรียบร้อย