|
本來(lái)是寫(xiě)在CSDN上的,,這里也發(fā)一份:
主要利用esp8266,結(jié)合oled,舵機(jī)和LED進(jìn)行控制,利用的是tcp協(xié)議,通過(guò)連接熱點(diǎn)實(shí)現(xiàn)對(duì)于小燈和舵機(jī)的亮滅,亮度,轉(zhuǎn)速和控制,并在oled上實(shí)時(shí)顯示。共耗時(shí)半天,希望都能有所收獲
下面是網(wǎng)絡(luò)調(diào)試助手和arduino的端串口的收發(fā)消息

然后是一些調(diào)試過(guò)程的實(shí)拍記錄:
連接上路由器:
初始界面
顯示制作人:
發(fā)送數(shù)據(jù)打開(kāi)小燈: 下面是代碼可供大家調(diào)試 - /*************************************************************
- ESP8266 with 0.96inch OLED 引腳
- VCC <---> VCC
- GND <---> GND
- SDA <---> SDA(2) D4
- SCL <---> SCL(14) D5
- *************************************************************/
- /*僅僅針對(duì)四個(gè)引腳和oled屏顯示*/
- //針對(duì)串口顯示oled屏幕
- /*****************oled設(shè)置庫(kù) *****************/
- #include <ArduinoJson.h>
- #include <U8g2lib.h>
- #include <Wire.h>
- #include <Ticker.h>
- /*****************網(wǎng)絡(luò)設(shè)置庫(kù) *****************/
- #include <ESP8266WiFi.h>
- #include <WiFiClient.h>
- /*****************舵機(jī)庫(kù) *****************/
- #include <Servo.h>
- Servo myservo; // 定義舵機(jī)對(duì)象,最多八個(gè)
- /*****************網(wǎng)絡(luò)設(shè)置項(xiàng) *****************/
- const char *STAssid ="xxx"; //需要連接路由器的名稱
- const char *STApassword="xxxx"; //路由器的密碼
- const char *host= "xxxx"; /本地服務(wù)器ip
- const int httpPort = 8888; //服務(wù)器端口
- WiFiClient client; //聲明客戶端對(duì)象
- bool is=0; //用來(lái)做連接到服務(wù)器后,僅發(fā)送一次問(wèn)候語(yǔ)
- int led=13; //燈io,D7
- int led_light=12; //用來(lái)調(diào)節(jié)亮度,D6,輸出PWM波
- float dutycycle=512/2; /* 設(shè)置初始占空比為50% /2*/
- int motor_speed=1; //定義舵機(jī)的轉(zhuǎn)速
- int pos = 0; // 定義舵機(jī)轉(zhuǎn)動(dòng)位置
- boolean flag = true; //用來(lái)控制oled屏幕的刷新
- //oled設(shè)置
- // JSON
- DynamicJsonBuffer jsonBuffer(256); // ArduinoJson V5
- // 顯示屏 如果引腳不同需要在這里修改
- U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 14, /* data=*/ 2);
- // B 站 API 網(wǎng)址: follower, view, likes
- String NAME = "夏友"; //改成自己的名字
- String UID = "xxxxxxxxxx"; //改成自己的UID
- //小燈、電機(jī)狀態(tài)設(shè)置
- String led_sta="off";
- String motor_sta="off";
- void setup() {
- Serial.begin(115200);
- Serial.println("");
- //LED初始化
- pinMode(13,OUTPUT);
- digitalWrite(13,0);
- analogWrite(led_light, dutycycle); /* 設(shè)置初始占空比為50% /2*/
- //WiFi初始化
- WiFi.mode(WIFI_STA); //設(shè)置為STA模式
- WiFi.begin(STAssid, STApassword); //配置連接信息,開(kāi)始連接
- //運(yùn)行自定義函數(shù),在未連接到路由器的過(guò)程中,打印輸出......,直到連接成功
- gotoWifi();
- // OLED 初始化,顯示連接WiFi
- u8g2.begin();
- u8g2.enableUTF8Print();
- u8g2.clearDisplay();
- u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
- u8g2.setCursor(10, 10);
- u8g2.println("Wifi connecting to ");
- u8g2.setCursor(10, 30);
- u8g2.println(STAssid);
- u8g2.setCursor(10, 50);
- while( WiFi.status() != WL_CONNECTED ){
- delay(500);
- u8g2.println("。");
- u8g2.println(" ");
- }
- //delay(1000);
- u8g2.sendBuffer();
- delay(5000); //初始化延時(shí)5秒鐘之后準(zhǔn)備顯示第二組畫(huà)面
-
- //連接WiFi成功后的oled路由器顯示
- u8g2.clearDisplay();
- u8g2.setCursor(10,10);
- u8g2.println("Wifi Connected!");
- u8g2.setCursor(10,30);
- u8g2.println("IP:");
- u8g2.setCursor(10,50);
- u8g2.println(WiFi.localIP() );
-
- Serial.println("連接路由器成功");
- //此時(shí)已經(jīng)連接到路由器,可以開(kāi)始連接遠(yuǎn)程服務(wù)器
- lianjie();
- u8g2.sendBuffer();
- delay(5000); //初始化延時(shí)5秒鐘之后準(zhǔn)備顯示第二組畫(huà)面
-
- //第三組畫(huà)面準(zhǔn)備顯示
- u8g2.clearDisplay();
- u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
- u8g2.setCursor(10, 19);
- u8g2.print("Powered by");
- u8g2.setCursor(10, 31);
- u8g2.print("CSDN@夏友");
- u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
- u8g2.setCursor(10, 50);
- u8g2.print("csdn-summer_bird");
- u8g2.sendBuffer();
- delay(5000); //初始化延時(shí)5秒鐘之后準(zhǔn)備顯示第二組畫(huà)面
- //再次初始化
- u8g2.setFont(u8g2_font_wqy12_t_gb2312b);
- }
- void loop() {
- /****************檢測(cè)WiFi連接狀態(tài)****************/
- if (WiFi.status() != WL_CONNECTED) {
- WiFi.disconnect();
- WiFi.begin(STAssid, STApassword);
- gotoWifi();
- }
- else{
- if (!client.connected()) { //如果沒(méi)有連接到服務(wù)器
- lianjie();
- return;
- }
- else{ //否則,就是連接到服務(wù)器
- if(is==0){
- client.print("hello,server");
- is=1;
- }
- }
- }
- /*針對(duì)信息對(duì)oled屏幕上的信息進(jìn)行刷新并且顯示*/
- String data_led_motor=Read_Tcp(); //記錄LED和舵機(jī)的數(shù)據(jù)
- Tcp_Handler(data_led_motor); //讀取服務(wù)器信息,并處理
-
- while(flag) //oled數(shù)據(jù)顯示
- {
- Serial.print("data_led_motor is:");
- Serial.println(data_led_motor);
- // display data
- Serial.println("count = 0, display data");
- u8g2.firstPage();
- do
- {
- display(data_led_motor, led_sta, motor_sta); //分別輸出占空比,小燈亮度,舵機(jī)強(qiáng)度
- } while (u8g2.nextPage());flag=false;
- }
- //Tcp_Handler(data_led_motor); //讀取服務(wù)器信息,并處理************************
- }
- //讀取服務(wù)器信息,返回String類(lèi)型
- String Read_Tcp(){
- String data = "";
- while (client.available() > 0){
-
- char inchar = client.read(); //
- data += char(inchar);
- delay(10);
- flag=true; //修改
- }
- return data;
- }
- //處理服務(wù)器信息
- void Tcp_Handler(String data){
- if(data!=""){
- Serial.print("收到服務(wù)器信息:");
- Serial.println(data);
- //數(shù)據(jù)接收處理
- /*舵機(jī)數(shù)據(jù)接收處理函數(shù)*/
- if(data=="led_open"){
- digitalWrite(13,1);
- led_sta="on";
- client.print("open led");
- }
- else if(data=="led_close"){
- digitalWrite(13,0);
- led_sta="off";
- client.print("close led");
- }
- else if(data=="more"){
- more();
- client.print("led_light_more");
- }
- else if(data=="lower"){
- lower();
- client.print("led_light_lower");
- }
- /*舵機(jī)數(shù)據(jù)接收處理函數(shù)*/
- else if(data=="motor_open"){
- motor_speed=1;
- driver(motor_speed);
- motor_sta="on";
- client.print("open motor");
- }
- else if(data=="motor_close"){
- motor_speed=0;
- driver(motor_speed);
- motor_sta="off";
- client.print("close motor");
- }
- else if(data=="faster"){
- driver(motor_speed++);
- client.print("motor_faster");
- }
- else if(data=="slower"){
- driver(motor_speed--);
- client.print("motor_slower");
- }
- }
- }
- //連接路由器
- void gotoWifi(){
- while (WiFi.status() != WL_CONNECTED) {
- delay(500);
- Serial.print(".");
- }
- }
- //連接服務(wù)器
- void lianjie() {
- Serial.println("開(kāi)始連接服務(wù)器");
- client.connect(host, httpPort);
- delay(1000);
- }
- //小燈亮度提高
- void more(){
- dutycycle+=100;
- if(dutycycle > 1023) {dutycycle = 1023;Serial.print("light_max");}/* 限制占空比至 1023,并提出警告 */
- led_sta="on";
- Serial.print("Duty Cycle: "); Serial.println(dutycycle/1024*100);
- analogWrite(led_light, dutycycle);
- delay(1000);
- }
- //小燈亮度降低
- void lower(){
- dutycycle-=100;
- if(dutycycle < 0) {dutycycle = 0;led_sta="off";Serial.print("light_min");}/* 限制占空比至 1,并提出警告 */
- //小燈狀態(tài)需要時(shí)刻監(jiān)視
- Serial.print("Duty Cycle: "); Serial.println(dutycycle/1024*100);
- analogWrite(led_light, dutycycle);
- delay(1000);
- }
- //舵機(jī)轉(zhuǎn)速處理函數(shù)
- // 0到180旋轉(zhuǎn)舵機(jī),每次延時(shí)15毫秒
- void driver(int motor_speed)
- {
- //速度控制函數(shù)
- if(motor_speed>10){motor_speed = 10;motor_sta="on";Serial.print("speed_max");}/* 限制轉(zhuǎn)速0-10,并提出警告 */
- else if(motor_speed<0){motor_speed = 0;motor_sta="off";Serial.print("speed_min");}/* 限制轉(zhuǎn)速0-10,并提出警告 */
-
- for(pos = 0; pos < 180; pos += motor_speed)
- {
- myservo.write(pos);
- delay(15);
- }
- // 180到0旋轉(zhuǎn)舵機(jī),每次延時(shí)15毫秒
- for(pos = 180; pos>=1; pos-=motor_speed)
- {
- myservo.write(pos);
- delay(15);
- }
- }
-
- //oled顯示函數(shù)
- // OLED 顯示數(shù)據(jù)
- void display(String data_led_motor, String led_sta, String motor_sta)
- {
-
- Serial.println("ok");
- u8g2.clearDisplay();
- u8g2.setCursor(5, 11);
- u8g2.print("接收數(shù)據(jù):" + data_led_motor);
- u8g2.setCursor(5, 27);
- u8g2.print("pwm占空比:" + String(dutycycle/1024*100));
- u8g2.setCursor(5, 41);
- u8g2.print("舵機(jī)速度:" + String(motor_speed));
- u8g2.setCursor(5, 54);
- u8g2.print("小燈/舵機(jī)狀態(tài):" + led_sta + "/" + motor_sta);
-
- }
復(fù)制代碼
源程序我也放到了網(wǎng)盤(pán),有需要的自取
網(wǎng)址:https://pan.baidu.com/s/14K37j_AizKk3m3WKlg7p9A
提取碼:xwoj
|
評(píng)分
-
查看全部評(píng)分
|