*** Note: tạm tấm hình, khi nào rảnh viết tiếp
1. Cài đặt ESP8266 Add-on vào Arduino IDE
Bước 1: Mở Arduino IDE, vào File> Preferences

Bước 2: Copy http://arduino.esp8266.com/stable/package_esp8266com_index.json and past vào “Additional Boards Manager URLs” click “OK”

Bước 3: Mở Boards Manager. Đến Tools > Board > Boards Manager…

Bước 4: Search ESP8266 và nhấn nút install “ESP8266 by ESP8266 Community“

Bước 5: Chờ package esp8266 được cài đặt hoàn thành

2. Lựa chọn Target để lặp trình:
Ở đây tôi sử dụng board ESP8266 NodeMcu:


3. Code
3.1. Kết nối wifi
Tham khảo file ESP8266WiFi.h và ESP8266WiFi.cpp trong folder:
C:\Users\maitr\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.2\libraries\ESP8266WiFi\src
ESP8266WiFiClass Wifi_client; //Tạo mới đối tượng Wifi_client trong class ESP8266WiFiClass
Wifi_client.mode(WIFI_STA); //Set mode cho wifi là station mode ( ESP sẽ kết nối đến router)
// Ngoài ra wifi còn Access Point mode (ESP sẽ phát wifi)
Wifi_client.begin(SSID, PASS);//Set SSID và PASSWORD muốn kết nối
3.2. Tạo TCP Socket hoạt động ở chế độ Client
Tham khảo file: WiFiClient.h và WiFiClient.cpp trong folder:
C:\Users\maitr\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.7.2\libraries\ESP8266WiFi\src
WiFiClient Sock_TCP_Client; //Tạo client TCP socket
Sock_TCP_Client.connect(host, port); // connect tới server với địa chỉ IP và Port
//để gửi dữ liệu lên server chúng ta sử dụng phương thức:
// + printf: để gửi dữ liệu theo format. Giống với hàm printf trong C để in lên console
// + println: đối số truyền vào là một đối tượng String và thêm ký tự \r\n
//Để kiểm tra có dữ liệu được gửi từ server chúng ta sử dụng phương thức available()
//Để nhận dữ liệu từ server chúng ta sử dụng phương thức:
// + readStringUntil
3.3. Full code
#include "WiFiClient.h"
#include "esp8266_peri.h"
#include "ESP8266WiFi.h"
HardwareSerial Log(UART0);
ESP8266WiFiClass Wifi_client;
WiFiClient Sock_TCP_Client;
const char* SSID = "YOUR SSID";
const char* PASS = "YOUR PASSWORD";
const char* host = "192.168.0.129";
uint16_t port = 2505;
void setup()
{
pinMode(2, OUTPUT);
Log.begin(9600);
Wifi_client.mode(WIFI_STA);
Wifi_client.begin(SSID, PASS);
Log.printf("Connect to WiFi: %s\r\n", SSID);
while (!Wifi_client.isConnected())
{
Log.print(".");
delay(1000);
}
Log.printf("Write in Arduino IDE\r\n");
Log.printf("Wifi connected\r\n");
Log.print("ESP IP: "); Log.println(Wifi_client.localIP().toString());
//Sock_TCP_Client.keepAlive();
Sock_TCP_Client.connect(host, port);
Log.printf("Connect to : %s\r\n", host);
while (!Sock_TCP_Client.connected())
{
Log.print(".");
delay(1000);
}
Log.println("TCP socket connected");
Sock_TCP_Client.println("This is message from ESP8266");
}
void loop()
{
String data_recv;
String on_msg = "ON";
String off_msg = "OFF";
while (!Sock_TCP_Client.available()) ;
data_recv = Sock_TCP_Client.readStringUntil(0x0d);
Log.println(data_recv);
if (data_recv == on_msg)
{
Log.println("[MESSAGE]: ON");
digitalWrite(2, 0);
Sock_TCP_Client.println("LED is power on");
}
else if (data_recv == off_msg)
{
Log.println("[MESSAGE]: OFF");
digitalWrite(2, 1);
Sock_TCP_Client.println("LED is power off");
}
else
{
Log.println("[MESSAGE]: Unknow");
Sock_TCP_Client.println("The command is incorrect");
}
}



class PSTa có thể dùng câu lệnh khia báo để tạo một đối tượng từ một đối tượng mới
{
private:
int tu;
int mau;
public:
PS()
{
tu = 0;
mau = 0;
}
PS(int t, int m)
{
tu = t;
mau = m;
}
};
PS x(1, 2);Ta cũng có thể dùng lệnh khai báo để tạo một đối tượng mới từ đối tượng đã tồn tại.
PS y(x);Khi đó hàm này sẽ được sao chéo nội dung theo từng bit của x tới vùng nhớ của y. ==> Vùng nhớ của x và y có cũng giá trị. ==> các thuộc tính và phương thức của x và y đều có giá trị như nhau.
#include <stdio.h>
class PS
{
public:
int tu;
int mau;
PS(int t, int m)
{
tu = t;
mau = m;
}
};
void main()
{
PS x(1, 2);
PS y(x);
printf("X: tu = %d, mau = %d\r\n", x.tu, x.mau);
printf("Y: tu = %d, mau = %d\r\n", y.tu, y.mau);
y.tu = 2; y.mau = 3;
printf("X: tu = %d, mau = %d\r\n", x.tu, x.mau);
printf("Y: tu = %d, mau = %d\r\n", y.tu, y.mau);
}
X: tu = 1, mau = 2*** nhận xét: Khi ban đầu khởi tạo thì giá trị tử mẫu của y bằng x (vì y được tạo ra từ x). Nhưng khi ta thay đổi giá trị tử mẫu của y, thì không làm thay đổi giá trị của x. Vì lúc này x.tu, x.mau và y.tu, y.mau ở 2 vùng nhớ khác nhau.
Y: tu = 1, mau = 2
X: tu = 1, mau = 2
Y: tu = 2, mau = 3
#include <stdio.h>Ta nhận được kết quả:
#include <malloc.h>
class PS
{
public:
int *tu;
int *mau;
PS(int t, int m)
{
tu = (int*)malloc(4);
mau = (int*)malloc(4);
*tu = t;
*mau = m;
}
};
void main()
{
PS x(1, 2);
PS y(x);
printf("X: tu = %d, mau = %d\r\n", *x.tu, *x.mau);
printf("Y: tu = %d, mau = %d\r\n", *y.tu, *y.mau);
*y.tu = 2; *y.mau = 3;
printf("X: tu = %d, mau = %d\r\n", *x.tu, *x.mau);
printf("Y: tu = %d, mau = %d\r\n", *y.tu, *y.mau);
}
X: tu = 1, mau = 2*** Nhận xét:
Y: tu = 1, mau = 2
X: tu = 2, mau = 3
Y: tu = 2, mau = 3
new int; //allocate 4 bytes on Heap segment
new int[10]; //allocate (4 * 10) bytes on Heap segment
int *pInt = new int;
int *pArr = new int[10];


--------------------------------
| 4 7 2 5
--------------------------------
--------------------------------
| 4 7 2 5 3
--------------------------------
--------------------------------
| 4 7 2 5 3 9
--------------------------------
--------------------------------
| 4 7 2 5 3
--------------------------------
int main()
{
int n1, n2, n3, n4, n5;
cout << "Address of " << &n1 << endl;
cout << "Address of " << &n2 << endl;
cout << "Address of " << &n3 << endl;
cout << "Address of " << &n4 << endl;
cout << "Address of " << &n5 << endl;
return 0;
}

0
1
2
|
#include <string.h>
|
0
1
2
|
int strlen ( const char * str );
|
0
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <stdio.h>
#include <string.h>
int main(){
char s[100];
printf("\nNhap chuoi: ");
fgets(s, sizeof s, stdin);
printf("length = %d", strlen(s) - 1);
printf("\nNhap chuoi: ");
gets(s);
printf("length = %d", strlen(s));
}
|
0
1
2
3
4
5
6
7
8
|
PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion
PS G:\c_cources\day_57> .\StringFuntion.exe
Nhap chuoi: Nguyen Van Hieu
length = 15
Nhap chuoi: Nguyen Van Hieu
length = 15
|
strlen(s) - 1 là do hàm fgets() đọc cả ký tự ‘\n’. Nếu bạn dùng hàm gets() thì không cần bớt đi 1 đơn vị. Nhưng chúng ta không nên dùng hàm gets() -> lý do ở đây.== để so sánh 2 chuỗi. Lý do là bởi khi bạn truy xuất tên chuỗi thì thực tế là bạn đang truy xuất tới địa chỉ của nó chứ không phải giá trị. Xem ví dụ sau:
0
1
2
3
4
5
6
7
8
9
|
#include <stdio.h>
#include <string.h>
int main(){
char a[] = "Hieu";
char b[] = "Hieu";
printf("%d, %d, %d", a, b, a == b);
}
|
0
1
2
3
4
|
PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion
PS G:\c_cources\day_57> .\StringFuntion.exe
6487568, 6487552, 0
|
== để so sánh thì bạn đang so sánh 2 địa chỉ chứ không phải cái bạn mong muốn đâu. Đó là lý do chúng ta cần hàm strcmp().
0
1
2
|
int strcmp ( const char * str1, const char * str2 );
|
| Giá trị trả về | Giải thích |
|---|---|
một số nguyên < 0 | Khi ký tự đầu tiên của 2 chuỗi không giống nhau và ký tự này ở chuỗi str1 có giá trị nhỏ hơn ở chuỗi str2 |
giá trị 0 | hai chuỗi giống nhau |
một số nguyên > 0 | Khi ký tự đầu tiên của 2 chuỗi không giống nhau và ký tự này ở chuỗi str1 có giá trị lớn hơn ở chuỗi str2 |
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <stdio.h>
#include <string.h>
int main ()
{
char key[] = "apple";
char buffer[80];
do {
printf ("Hay doan loai qua toi thich? ");
fflush (stdout);
scanf ("%s",buffer);
} while (strcmp (key,buffer) != 0);
puts ("Ban doan dung roi!");
return 0;
}
|
0
1
2
3
4
5
|
PS G:\c_cources\day_57> .\StringFuntion.exe
Hay doan loai qua toi thich? orange
Hay doan loai qua toi thich? apple
Ban doan dung roi!
|
0
1
2
|
char * strcat ( char * chuoi_dich, const char * chuoi_nguon);
|
0
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <stdio.h>
#include <string.h>
int main ()
{
char str[80];
strcpy (str,"Lap ");
strcat (str,"trinh ");
strcat (str,"khong ");
strcat (str,"kho!");
puts (str);
}
|
0
1
2
3
4
|
PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion
PS G:\c_cources\day_57> .\StringFuntion.exe
Lap trinh khong kho!
|
0
1
2
|
char * strcpy ( char * chuoi_dich, const char * chuoi_nguon);
|
= nhé.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h>
#include <string.h>
int main ()
{
char str1[]="Lap trinh khong kho!";
char str2[40];
char str3[40];
strcpy (str2,str1);
strcpy (str3,"Nguyen Van Hieu");
printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);
return 0;
}
|
0
1
2
3
4
5
6
|
PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion
PS G:\c_cources\day_57> .\StringFuntion.exe
str1: Lap trinh khong kho!
str2: Lap trinh khong kho!
str3: Nguyen Van Hieu
|
0
1
2
|
char * strlwr(char * s);
|
0
1
2
3
4
5
6
7
8
|
#include<stdio.h>
#include<string.h>
int main()
{
char str[ ] = "Lap Trinh KHONG kho!";
printf("%s\n",strlwr (str));
}
|
0
1
2
3
4
|
PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion
PS G:\c_cources\day_57> .\StringFuntion.exe
lap trinh khong kho!
|
0
1
2
|
char * strupr (char * s)
|
0
1
2
3
4
5
6
7
8
|
#include<stdio.h>
#include<string.h>
int main()
{
char str[ ] = "Lap Trinh KHONG kho!";
printf("%s\n",strupr (str));
}
|
0
1
2
3
4
|
PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion
PS G:\c_cources\day_57> .\StringFuntion.exe
LAP TRINH KHONG KHO!
|
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <stdio.h>
#include <string.h>
int main()
{
char name[30] = "Nguyen Van Hieu";
printf("Truoc khi dao nguoc : %s\n", name);
printf("Sau khi dao nguoc : %s", strrev(name));
return 0;
}
|
0
1
2
3
4
5
|
PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion
PS G:\c_cources\day_57> .\StringFuntion.exe
Truoc khi dao nguoc : Nguyen Van Hieu
Sau khi dao nguoc : ueiH naV neyugN
|
0
1
2
|
char * strchr (const char * s, char c)
|
c. Còn hàm thì trả về vị trí cuối cùng. Nếu không tồn tại, trả về con trỏ NULL.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <stdio.h>
#include <string.h>
int main()
{
char string[55] = "Lap trinh khong kho";
char *first, *last;
first = strchr(string, 'm');
last = strrchr(string, 'k');
if (first != NULL)
{
printf("Ky tu k xuat hien lan dau tai vi tri %d\n", first - string + 1);
}
if (last != NULL)
{
printf("Ky tu k xuat hien lan dau tai vi tri %d\n", last - string + 1);
}
}
|
0
1
2
3
4
5
|
PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion
PS G:\c_cources\day_57> .\StringFuntion.exe
Ky tu k xuat hien lan dau tai vi tri 11
Ky tu k xuat hien lan dau tai vi tri 17
|
0
1
2
|
char * strstr (const char * str, const char * sub)
|
sub trong chuỗi str. Nếu không tìm thấy thì trả về con trỏ NULL. Nếu tìm thấy thì trả về con trỏ trỏ tới vị trí tìm thấy.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <stdio.h>
#include <string.h>
int
main()
{
char string[55] = "Lap trinh khong kho";
char *first;
first = strstr(string, "kho");
if (first != NULL)
{
printf("Vi tri xuat hien dau tien cua \"kho\" trong \"%s\" la"
" \"%s\"",
string, first);
}else{
printf("Khong tim thay!\n");
}
}
|
0
1
2
3
4
|
PS G:\c_cources\day_57> g++ .\StringFuntion.cpp -o .\StringFuntion
PS G:\c_cources\day_57> .\StringFuntion.exe
Vi tri xuat hien dau tien cua "kho" trong "Lap trinh khong kho" la "khong kho"
|