找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4090|回复: 1
收起左侧

基于esp8266控制oled系统

[复制链接]
ID:727210 发表于 2020-6-7 09:15 | 显示全部楼层 |阅读模式

本来是写在CSDN上的,,这里也发一份:


主要利用esp8266,结合oled,舵机和LED进行控制,利用的是tcp协议,通过连接热点实现对于小灯和舵机的亮灭,亮度,转速和控制,并在oled上实时显示。共耗时半天,希望都能有所收获


下面是网络调试助手和arduino的端串口的收发消息

然后是一些调试过程的实拍记录:


连接上路由器:
初始界面
显示制作人:
发送数据打开小灯:

下面是代码可供大家调试

  1. /*************************************************************
  2.   ESP8266 with 0.96inch OLED 引脚
  3.       VCC    <--->    VCC
  4.       GND    <--->    GND
  5.       SDA    <--->    SDA(2)  D4
  6.       SCL    <--->    SCL(14)  D5      
  7. *************************************************************/
  8. /*仅仅针对四个引脚和oled屏显示*/
  9. //针对串口显示oled屏幕
  10. /*****************oled设置库 *****************/
  11. #include <ArduinoJson.h>
  12. #include <U8g2lib.h>
  13. #include <Wire.h>
  14. #include <Ticker.h>
  15. /*****************网络设置库 *****************/
  16. #include <ESP8266WiFi.h>        
  17. #include <WiFiClient.h>
  18. /*****************舵机库 *****************/
  19. #include <Servo.h>
  20. Servo myservo;  // 定义舵机对象,最多八个
  21. /*****************网络设置项 *****************/
  22. const char *STAssid ="xxx";                   //需要连接路由器的名称
  23. const char *STApassword="xxxx";      //路由器的密码
  24. const char *host= "xxxx";              /本地服务器ip
  25. const int httpPort = 8888;                    //服务器端口
  26. WiFiClient client;                            //声明客户端对象
  27. bool is=0;                                    //用来做连接到服务器后,仅发送一次问候语

  28. int led=13;                                   //灯io,D7
  29. int led_light=12;                            //用来调节亮度,D6,输出PWM波

  30. float dutycycle=512/2;                          /* 设置初始占空比为50% /2*/
  31. int motor_speed=1;                                    //定义舵机的转速
  32. int pos = 0;                                   // 定义舵机转动位置

  33. boolean flag = true;                             //用来控制oled屏幕的刷新

  34. //oled设置
  35. // JSON
  36. DynamicJsonBuffer jsonBuffer(256); // ArduinoJson V5

  37. // 显示屏  如果引脚不同需要在这里修改
  38. U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ 14, /* data=*/ 2);  

  39. // B 站 API 网址: follower, view, likes
  40. String NAME = "夏友";  //改成自己的名字
  41. String UID  = "xxxxxxxxxx";  //改成自己的UID
  42. //小灯、电机状态设置
  43. String led_sta="off";
  44. String motor_sta="off";


  45. void setup() {
  46.   Serial.begin(115200);
  47.   Serial.println("");

  48.   //LED初始化
  49.   pinMode(13,OUTPUT);
  50.   digitalWrite(13,0);  
  51.   analogWrite(led_light, dutycycle);  /* 设置初始占空比为50% /2*/

  52.   //WiFi初始化
  53.   WiFi.mode(WIFI_STA);                       //设置为STA模式
  54.   WiFi.begin(STAssid, STApassword);          //配置连接信息,开始连接
  55.   //运行自定义函数,在未连接到路由器的过程中,打印输出......,直到连接成功   
  56.   gotoWifi();  

  57.   // OLED 初始化,显示连接WiFi
  58.   u8g2.begin();
  59.   u8g2.enableUTF8Print();
  60.   u8g2.clearDisplay();
  61.   u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
  62.   u8g2.setCursor(10, 10);
  63.   u8g2.println("Wifi connecting to ");
  64.   u8g2.setCursor(10, 30);
  65.   u8g2.println(STAssid);
  66.   u8g2.setCursor(10, 50);
  67.   while( WiFi.status() != WL_CONNECTED ){
  68.       delay(500);
  69.       u8g2.println("。");
  70.       u8g2.println(" ");      
  71.   }
  72.   //delay(1000);
  73.   u8g2.sendBuffer();
  74.   delay(5000);   //初始化延时5秒钟之后准备显示第二组画面  

  75.   
  76.   //连接WiFi成功后的oled路由器显示
  77.   u8g2.clearDisplay();
  78.   u8g2.setCursor(10,10);
  79.   u8g2.println("Wifi Connected!");
  80.   u8g2.setCursor(10,30);
  81.   u8g2.println("IP:");
  82.   u8g2.setCursor(10,50);
  83.   u8g2.println(WiFi.localIP() );

  84.   
  85.   Serial.println("连接路由器成功");
  86.   //此时已经连接到路由器,可以开始连接远程服务器   
  87.   lianjie();   
  88.   u8g2.sendBuffer();
  89.   delay(5000);   //初始化延时5秒钟之后准备显示第二组画面  
  90.   

  91.   //第三组画面准备显示
  92.   u8g2.clearDisplay();
  93.   u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
  94.   u8g2.setCursor(10, 19);
  95.   u8g2.print("Powered by");
  96.   u8g2.setCursor(10, 31);
  97.   u8g2.print("CSDN@夏友");
  98.   u8g2.setFont(u8g2_font_wqy12_t_gb2312a);
  99.   u8g2.setCursor(10, 50);
  100.   u8g2.print("csdn-summer_bird");
  101.   u8g2.sendBuffer();
  102.   delay(5000);   //初始化延时5秒钟之后准备显示第二组画面

  103.    //再次初始化
  104.   u8g2.setFont(u8g2_font_wqy12_t_gb2312b);

  105. }

  106. void loop() {   
  107. /****************检测WiFi连接状态****************/
  108.   if (WiFi.status() != WL_CONNECTED) {
  109.     WiFi.disconnect();
  110.     WiFi.begin(STAssid, STApassword);
  111.     gotoWifi();  
  112.   }
  113.   else{
  114.     if (!client.connected()) {            //如果没有连接到服务器
  115.       lianjie();
  116.       return;
  117.     }
  118.     else{                                //否则,就是连接到服务器
  119.       if(is==0){
  120.         client.print("hello,server");
  121.         is=1;      
  122.       }
  123.     }
  124.   }

  125.   /*针对信息对oled屏幕上的信息进行刷新并且显示*/
  126.   String data_led_motor=Read_Tcp();    //记录LED和舵机的数据
  127.   Tcp_Handler(data_led_motor);              //读取服务器信息,并处理

  128.   
  129.    while(flag)                         //oled数据显示
  130.    {   
  131.     Serial.print("data_led_motor is:");
  132.     Serial.println(data_led_motor);
  133.     // display data
  134.     Serial.println("count = 0, display data");
  135.     u8g2.firstPage();
  136.     do
  137.     {
  138.       display(data_led_motor, led_sta, motor_sta);        //分别输出占空比,小灯亮度,舵机强度
  139.     } while (u8g2.nextPage());flag=false;
  140.    }

  141.    //Tcp_Handler(data_led_motor);              //读取服务器信息,并处理************************
  142. }


  143. //读取服务器信息,返回String类型
  144. String Read_Tcp(){
  145.   String data = "";         
  146.   while (client.available() > 0){
  147.    
  148.     char inchar = client.read();      //
  149.     data += char(inchar);
  150.     delay(10);   
  151.     flag=true;  //修改
  152.   }
  153.   return data;
  154. }

  155. //处理服务器信息
  156. void Tcp_Handler(String data){
  157.   if(data!=""){
  158.     Serial.print("收到服务器信息:");
  159.     Serial.println(data);
  160. //数据接收处理
  161.     /*舵机数据接收处理函数*/
  162.     if(data=="led_open"){
  163.       digitalWrite(13,1);  
  164.       led_sta="on";
  165.       client.print("open led");     
  166.     }
  167.     else if(data=="led_close"){
  168.       digitalWrite(13,0);
  169.       led_sta="off";
  170.       client.print("close led");      
  171.     }
  172.     else if(data=="more"){
  173.       more();
  174.       client.print("led_light_more");
  175.     }
  176.     else if(data=="lower"){
  177.       lower();
  178.       client.print("led_light_lower");
  179.     }
  180.     /*舵机数据接收处理函数*/
  181.     else if(data=="motor_open"){
  182.       motor_speed=1;
  183.       driver(motor_speed);
  184.       motor_sta="on";
  185.       client.print("open motor");      
  186.     }
  187.     else if(data=="motor_close"){
  188.       motor_speed=0;
  189.       driver(motor_speed);
  190.       motor_sta="off";
  191.       client.print("close motor");      
  192.     }
  193.     else if(data=="faster"){     
  194.       driver(motor_speed++);
  195.       client.print("motor_faster");
  196.     }
  197.     else if(data=="slower"){
  198.       driver(motor_speed--);
  199.       client.print("motor_slower");
  200.     }
  201.   }  
  202. }
  203. //连接路由器
  204. void gotoWifi(){
  205.   while (WiFi.status() != WL_CONNECTED) {
  206.     delay(500);   
  207.     Serial.print(".");
  208.   }
  209. }
  210. //连接服务器
  211. void lianjie() {
  212.   Serial.println("开始连接服务器");
  213.   client.connect(host, httpPort);
  214.   delay(1000);
  215. }
  216. //小灯亮度提高
  217. void more(){
  218.   dutycycle+=100;
  219.   if(dutycycle > 1023) {dutycycle = 1023;Serial.print("light_max");}/* 限制占空比至 1023,并提出警告 */  
  220.   led_sta="on";
  221.   Serial.print("Duty Cycle: ");  Serial.println(dutycycle/1024*100);
  222.   analogWrite(led_light, dutycycle);
  223.   delay(1000);
  224. }
  225. //小灯亮度降低
  226. void lower(){
  227.   dutycycle-=100;
  228.   if(dutycycle < 0) {dutycycle = 0;led_sta="off";Serial.print("light_min");}/* 限制占空比至 1,并提出警告 */  
  229.                                                  //小灯状态需要时刻监视
  230.   Serial.print("Duty Cycle: ");  Serial.println(dutycycle/1024*100);
  231.   analogWrite(led_light, dutycycle);
  232.   delay(1000);
  233. }

  234. //舵机转速处理函数
  235. // 0到180旋转舵机,每次延时15毫秒
  236. void driver(int motor_speed)
  237. {
  238.   //速度控制函数
  239.    if(motor_speed>10){motor_speed = 10;motor_sta="on";Serial.print("speed_max");}/* 限制转速0-10,并提出警告 */
  240.    else if(motor_speed<0){motor_speed = 0;motor_sta="off";Serial.print("speed_min");}/* 限制转速0-10,并提出警告 */
  241.    
  242.     for(pos = 0; pos < 180; pos += motor_speed)  
  243.    {  
  244.       myservo.write(pos);  
  245.       delay(15);
  246.     }
  247.     // 180到0旋转舵机,每次延时15毫秒
  248.     for(pos = 180; pos>=1; pos-=motor_speed)
  249.     {                              
  250.       myservo.write(pos);
  251.       delay(15);
  252.     }
  253. }
  254.    
  255. //oled显示函数
  256. // OLED 显示数据
  257. void display(String data_led_motor, String led_sta, String motor_sta)
  258. {
  259.   
  260.   Serial.println("ok");
  261.   u8g2.clearDisplay();
  262.   u8g2.setCursor(5, 11);
  263.   u8g2.print("接收数据:" + data_led_motor);
  264.   u8g2.setCursor(5, 27);
  265.   u8g2.print("pwm占空比:" + String(dutycycle/1024*100));
  266.   u8g2.setCursor(5, 41);
  267.   u8g2.print("舵机速度:" + String(motor_speed));
  268.   u8g2.setCursor(5, 54);
  269.   u8g2.print("小灯/舵机状态:" + led_sta + "/" + motor_sta);
  270.    
  271. }
复制代码


源程序我也放到了网盘,有需要的自取
网址:https://pan.baidu.com/s/14K37j_AizKk3m3WKlg7p9A
提取码:xwoj



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:419900 发表于 2020-6-11 12:02 | 显示全部楼层
我正需要,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表