首页 > 编程语言 >Arduino ESP32 oled显示,增量式编码器测距程序

Arduino ESP32 oled显示,增量式编码器测距程序

时间:2024-09-15 16:22:07浏览次数:17  
标签:编码器 zong Arduino 0x00 ESP32 mi 0x80 ma

    ESP32 14引脚接编码器A,13引脚接编码器B,21、22为I2C默认引脚,程序根据编码器A触发ESP32的22脚中断,然后判断编码器B在ESP32的21脚状态是高电平还是低电平,来决定编码器是正转还是反转,也就是数值应该加还是减。

     程序设计为编码器转一圈为1000个脉冲也就是编码器分辨率为1000,编码器连接轮转一圈和编码器转一圈为同速,如果你在实际应用当中要看编码器分辨率和连接轮和编码器之间有没有变速器,如果不愿意计算,拿个尺子让编码器转动一米,看记录了多少个脉冲,来修改自己的程序。

 

#include <Arduino.h>
#include <U8g2lib.h>
#include <esp_task_wdt.h>
#include <SSD1306Wire.h>

// 自定义CLK和SDA引脚
#define OLED_CLK 22
#define OLED_SDA 21
#define WDT_TIMEOUT 10000  //定义看门狗时间 单位毫秒
// 构造对象
U8G2_SSD1306_128X64_NONAME_F_SW_I2C OLED(U8G2_R0, OLED_CLK, OLED_SDA, U8X8_PIN_NONE);
SSD1306Wire display(0x3c, 21, 22);

int zhong_duan_yin_jiao = 14;
int pan_duan_yin_jiao = 13;
volatile int zong_ma_zhi = 0;
int hao_mi, mi, qian_mi;
int xian_shi_yi_ci;

void TaskBlink1(void *pvParameters);
void TaskBlink2(void *pvParameters);
void TaskBlink3(void *pvParameters);


const unsigned char qian_xian_shi[] = {
  0x00, 0x08, 0x00, 0x1F, 0xFC, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xFF, 0x7F,
  0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, /*"千",0*/
};
const unsigned char mi_xian_shi[] = {
  0x80, 0x00, 0x84, 0x10, 0x88, 0x10, 0x90, 0x08, 0x90, 0x04, 0x80, 0x00, 0xFE, 0x3F, 0xC0, 0x01,
  0xA0, 0x02, 0xA0, 0x02, 0x90, 0x04, 0x88, 0x08, 0x84, 0x10, 0x83, 0x60, 0x80, 0x00, 0x80, 0x00, /*"米",1*/
};
const unsigned char hao_xian_shi[] = {
  0x80, 0x00, 0xFE, 0x3F, 0x00, 0x00, 0xF8, 0x0F, 0x08, 0x08, 0xF8, 0x0F, 0x00, 0x00, 0xFE, 0x7F,
  0x02, 0x40, 0x81, 0x2F, 0x7C, 0x00, 0xC0, 0x0F, 0x7C, 0x00, 0xC0, 0x5F, 0x7E, 0x40, 0x80, 0x7F, /*"毫",0*/

};

void zhong_duan() {
  delayMicroseconds(10);//中断内可以使用的延时微妙
  if (digitalRead(zhong_duan_yin_jiao) == 0)  //现在是低电平
  {
    if (digitalRead(pan_duan_yin_jiao) == 1) {
      if (zong_ma_zhi < 1000) {
        zong_ma_zhi++;
        hao_mi = zong_ma_zhi;
      } else {
        if (mi < 1000) {
          mi++;
          hao_mi = 0;
          zong_ma_zhi = 0;
        } else {
          qian_mi++;
          mi = 0;
          hao_mi = 0;
          zong_ma_zhi = 0;
        }
      }
    }
    if (digitalRead(pan_duan_yin_jiao) == 0) {
      if (zong_ma_zhi > 0) {
        zong_ma_zhi--;
        hao_mi = zong_ma_zhi;
      } else {
        if (mi > 0) {
          mi--;
          zong_ma_zhi = 999;
          hao_mi = 999;
        } else {
          if (qian_mi > 0) {
            qian_mi--;
            mi = 999;
            hao_mi = 999;
            zong_ma_zhi = 999;
          } else {
            qian_mi = 0;
            mi = 0;
            hao_mi = 0;
            zong_ma_zhi = 0;
          }
        }
      }
    }
  }
}


void qing_pin(int x0,int y0,int x1,int y1)
{
  int i=0;
  int j=0;
  for(i=x0;i<x1;i++)
  {
    display.clearPixel(i,j);
    display.display();
    for(j=y0;j<y1;j++)
    {
      display.clearPixel(i,j);
      display.display();
    }
  }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  esp_task_wdt_init(WDT_TIMEOUT, true);  //初始化看门狗
  pinMode(pan_duan_yin_jiao, INPUT_PULLUP);
  pinMode(zhong_duan_yin_jiao, INPUT_PULLUP);                                        //设定引脚上拉_PULLUP  设定引脚下拉_PULLDOWN
  attachInterrupt(digitalPinToInterrupt(zhong_duan_yin_jiao), zhong_duan, FALLING);  //中断指定引脚函数LOW低电平触发CHANGE电平变化RISING上升沿触发FALLING下降沿触发HIGH高电平触发
  
  display.init();                           //初始化屏幕
  display.flipScreenVertically();           //反转180度
  display.setFont(ArialMT_Plain_16);        //字体大小
  /*OLED.begin();                             //初始化屏幕
  OLED.enableUTF8Print();                   //设置字体
  OLED.setFont(u8g2_font_wqy16_t_gb2312b);  //设置字体gb2312字符数7539字节208228 ,chinese1字符数411字节9491
  //OLED.setFontDirection(0);//方向反转角度*/
  
  xTaskCreate(
    TaskBlink1, "TaskBlink1"  // 任务名
    ,
    4096  // This stack size can be checked & adjusted by reading the Stack Highwater
    ,
    NULL, 0  // 任务优先级, with 3 (configMAX_PRIORITIES - 1) 是最高的,0是最低的.
    ,
    NULL);

  xTaskCreate(
    TaskBlink2, "TaskBlink2"  //任务名
    ,
    4096  // 栈大小
    ,
    NULL, 0  // 任务优先级
    ,
    NULL);

  xTaskCreate(
    TaskBlink3, "TaskBlink3"  //任务名
    ,
    4096  // 栈大小
    ,
    NULL, 0  // 任务优先级
    ,
    NULL);  
}

void loop() {
  // put your main code here, to run repeatedly:
}

void TaskBlink1(void *pvParameters)  // 多线程1 主程序
{
  while (1)  // for死循环// 多线程,每个任务必须是死循环
  {

    display.clear();
    display.drawIco16x16(0, 0, qian_xian_shi, 0);
    display.drawIco16x16(17, 0, mi_xian_shi, 0);
    display.drawIco16x16(17, 17, mi_xian_shi, 0);
    display.drawIco16x16(0, 34, hao_xian_shi, 0);
    display.drawIco16x16(17, 34, mi_xian_shi, 0);
    display.drawString(34, 0, String(qian_mi));
    display.drawString(34, 17, String(mi));
    display.drawString(34, 34, String(hao_mi));
    display.display();
  }
}

void TaskBlink2(void *pvParameters)  // 多线程1 主程序
{
  while (1)  // for死循环// 多线程,每个任务必须是死循环
  {
    //OLED.setBufferCurrTileRow(3);//只清除第四行数字
    /*OLED.clearBuffer();
    OLED.setCursor(0, 0);
    OLED.print("千米");
    OLED.setCursor(34, 0);
    OLED.print(qian_mi);
    OLED.setCursor(17, 17);
    OLED.print("米");
    OLED.setCursor(34, 17);
    OLED.print(mi);
    OLED.setCursor(0, 34);
    OLED.print("毫米");
    OLED.setCursor(34, 34);
    OLED.print(hao_mi);
    OLED.sendBuffer();

    Serial.print(zong_ma_zhi);
    Serial.print("-");
    Serial.print(qian_mi);
    Serial.print("-");
    Serial.print(mi);
    Serial.print("-");
    Serial.println(hao_mi);*/
    /*delay(1000);

    OLED.setBufferCurrTileRow(4);//只清除第四行数字
    OLED.clearBuffer();
    OLED.sendBuffer();
    delay(1000);*/
  }
}


void TaskBlink3(void *pvParameters)  // 多线程1 主程序
{
  while (1)  // for死循环// 多线程,每个任务必须是死循环
  {
    Serial.print(zong_ma_zhi);Serial.print("-");Serial.print(qian_mi);Serial.print("-");Serial.print(mi);Serial.print("-");Serial.println(hao_mi);

  }
}

标签:编码器,zong,Arduino,0x00,ESP32,mi,0x80,ma
From: https://blog.csdn.net/2401_84959098/article/details/142285364

相关文章

  • Arduino Uno控制LED灯闪烁设计方案
        以下是使用ArduinoUno控制LED灯闪烁的设计方案: 一、硬件准备1. ArduinoUno开发板。2. 一个LED灯。3. 220Ω电阻(用于限流,保护LED和Arduino引脚)。4. 面包板。5. 若干杜邦线。                       ......
  • Arduino IDE离线配置第三方库文件-ESP32开发板
    简洁版可以使用uget等,将文件下载到对应文件夹下,然后安装。esp32之arduino配置下载提速录屏ArduinoIDE离线配置第三方库文件ESP32资源 Linuxhttps://download.csdn.net/download/ZhangRelay/89749063第三方开发板非默认支持的开发板linux系统下,下载存放文件目......
  • 【IPV6从入门到起飞】5-2 IPV6+Home Assistant(ESP32+MQTT+DHT11+BH1750)传感器采集上
    IPV6+HomeAssistant[ESP32+MQTT+DHT11+BH1750]传感器采集上传监测1背景2实现效果3HomeAssistant配置3-1MQTT配置3-2yaml配置3-3加载配置4ESP32搭建4-1开发环境4-2工程代码5实现效果1背景在上一小节【IPV6从入门到起飞】5-1IPV6+HomeAssistant(搭建......
  • 物联网毕设 -- 图传种植监测控制(STM32+ESP32+APP)
    目录一连线图1原理图2PCB效果(面包版不适用)3实物效果4APP效果5功能概括(1)硬件端(2)APP端(4)云平台使用(需要可以找我获取)(5)演示视频二底层代码使用方式1.使用说明2.下载程序三APP使用方式1下载APP四程序架构及修改(通用) 前言该智能环境监测与控制系统......
  • 《ESP32从0到1》之MQTT与阿里iot通信(中)
    文章目录文章内容硬件增加定时器,实现定时发布MQTT主题移植smart_config程序最终程序逻辑运行测试保存ssid和password上电自动配网最终运行测试补充说明欢迎关注并留言文章内容基于MQTT->tcp结合wifi->smart_config示例工程,读懂程序,最终实现MQTT与阿里iot平台通信。......
  • 让ESP32-C3系列的卓越表现助力智能生活:四博智联全新推出的ESPC3-20E模块
    让ESP32-C3系列的卓越表现助力智能生活:四博智联全新推出的ESPC3-20E模块在智能生活和物联网领域,稳定的无线连接和低功耗设计已经成为推动技术发展的关键。作为行业领先的企业,四博智联凭借创新的产品设计,推出了全新的ESPC3-20EWi-Fi和蓝牙5.0双模模块。该模块结合了高性能......
  • 【花雕学编程】Arduino动手做(230)---ESP32 CAM 长时延时摄影:在拍摄之间使设备休眠并记
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......
  • 使用WebSocket协议实现在ESP32上音频接收播放
     主要目的:学习WebSocket通讯协议和ESP32开发所需配置:Pycharm,python3.12,ESP32S3N16R8, 扬声器(8欧,2W), 功放模块:MAX98357I2SAMP。一、介绍 1、WebSocket协议 WebSocket是一种网络通信协议,位于OSI模型的应用层。它提供了在单个TCP连接上进行全双工通信的能力,使得客......
  • 使用Arduino Uno作为烧录器为Atmega328PB芯片直接烧录程序
    目录摘要烧录方式操作过程准备工作将Arduinouno设置为烧录器烧录器和目标板电路连接添加第三方库设置参数程序烧写使用ArduinoIDE进行烧写使用Ardudess进行烧写成果展示摘要通过将一块ArduinoUno设置成ISP模式作为烧录器,从而实现为ArduinoProMini空白的ATMega328PB芯片直接......
  • 器件:EC11编码器
    1序  编码器型号为"黄海电子有限公司"的"EC11A-227";参数特性和ALPS的EC11B区别不大,EC11A性能较好;  出于图片规整考虑,本文截取ALPS的EC11B的datasheet来分析EC11A,推荐电路截取自"黄海电子"的"EC11B";2编码原理  EC11编码器为增量式编码器;由encoderA和encoderB两个光电传......