查看: 2054|回复: 1

M5Stick C 做一个简单的测试仪

[复制链接]

该用户从未签到

发表于 2020-9-2 17:31 | 显示全部楼层 |阅读模式
使用M5StickC,我制作了一个简单的测试仪,它只能检查导通性并测量电压,支持StickC Plus
  1. #include <M5StackAuto.h>

  2. const int inputBeepPin    = 26;
  3. const int inputAnalogPin  = 36;

  4. hw_timer_t *timer;
  5. QueueHandle_t xQueue;
  6. TaskHandle_t taskHandle;

  7. const int16_t listCount = 1000;
  8. int16_t list[listCount];
  9. int16_t listIndex = 0;

  10. // 定时器中断
  11. void IRAM_ATTR onTimer() {
  12.   int16_t data;

  13.   // 数据采集
  14.   data = analogRead(inputAnalogPin);

  15.   // 发送队列
  16.   xQueueSendFromISR(xQueue, &data, 0);
  17. }

  18. // 实际计时器处理任务
  19. void task(void *pvParameters) {
  20.   int16_t data;
  21.   int drawX = 9999;

  22.   // 初始化屏幕
  23.   M5.Lcd.fillRect(0, 8 * 3, M5.Lcd.width(), M5.Lcd.height(), DARKGREY);

  24.   // 初始化变量
  25.   data = analogRead(inputAnalogPin);
  26.   for (int i = 0; i < M5.Lcd.width(); i++) {
  27.     list[i] = data;
  28.   }

  29.   while (1) {
  30.     // 等待直到定时器中断
  31.     xQueueReceive(xQueue, &data, portMAX_DELAY);

  32.     // 更新数据
  33.     list[listIndex] = data;
  34.     listIndex++;
  35.     listIndex = listIndex % M5.Lcd.width();
  36.     int16_t minVal = 4096;
  37.     int16_t maxVal = 0;
  38.     for (int i = 0; i < M5.Lcd.width(); i++) {
  39.       minVal = min(minVal, list[i]);
  40.       maxVal = max(maxVal, list[i]);
  41.     }

  42.     //X轴计算
  43.     drawX++;
  44.     if (M5.Lcd.width() <= drawX) {
  45.       // 进行右端初始化
  46.       drawX = 0;
  47.     }

  48.     // 处理显示
  49.     int drawY = map(4095 - data, 0, 4095, 8 * 3, M5.Lcd.height() - 1);
  50.     M5.Lcd.fillRect(drawX, 8 * 3, 16, M5.Lcd.height(), DARKGREY);
  51.     M5.Lcd.drawPixel(drawX, drawY, WHITE);
  52.     Serial.println(data);
  53.     M5.Lcd.setCursor(M5.Lcd.width() - (6 * 10), 8 * 0);
  54.     M5.Lcd.printf("min %5.3fV\n", 3.3 * minVal / 4095);
  55.     M5.Lcd.setCursor(M5.Lcd.width() - (6 * 10), 8 * 1);
  56.     M5.Lcd.printf("max %5.3fV\n", 3.3 * maxVal / 4095);
  57.     M5.Lcd.setCursor(M5.Lcd.width() - (6 * 10), 8 * 2);
  58.     M5.Lcd.printf("now %5.3fV\n", 3.3 * data / 4095);
  59.   }
  60. }

  61. void setup() {
  62.   M5.begin();
  63.   pinMode(inputBeepPin, INPUT_PULLUP);
  64.   pinMode(inputAnalogPin, ANALOG);
  65.   pinMode(M5_LED, OUTPUT_OPEN_DRAIN);
  66.   digitalWrite(M5_LED, HIGH);
  67.   M5.Beep.setVolume(1);

  68.   // 画面
  69.   M5.Lcd.setRotation(3);
  70.   M5.Lcd.fillScreen(BLACK);
  71.   M5.Lcd.setCursor(0, 0);
  72.   M5.Lcd.println("M5StickC Tester");
  73.   M5.Lcd.println(" GPIO26 LowBeep");
  74.   M5.Lcd.println(" GPIO36 AnalogIn");

  75.   //队列创建
  76.   xQueue = xQueueCreate(1, sizeof(int16_t));

  77.   // 以Core1的优先级5启动任务
  78.   xTaskCreateUniversal(
  79.     task,           // 任务功能
  80.     "task",         // 任务名称(无意义)
  81.     8192,           // 堆大小
  82.     NULL,           // 任务参数
  83.     5,              // 优先级(越大越高)
  84.     &taskHandle,    // 任务句柄
  85.     APP_CPU_NUM     // 执行的CPU(PRO_CPU_NUM or APP_CPU_NUM)
  86.   );

  87.   // 使用四个计时器中的第一个
  88.   // 每1微秒计数一次(任意频率)
  89.   // true:计数
  90.   timer = timerBegin(0, getApbFrequency() / 1000000, true);

  91.   // 定时器中断设定
  92.   timerAttachInterrupt(timer, &onTimer, true);

  93.   // 计时器设置为微秒
  94.   timerAlarmWrite(timer, 20 * 1000, true);

  95.   // 定时器启动
  96.   timerAlarmEnable(timer);
  97. }

  98. void loop() {
  99.   static bool beep = false;
  100.   M5.update();
  101.   if (!digitalRead(inputBeepPin)) {
  102.     if (!beep) {
  103.       beep = true;
  104.       M5.Beep.tone(1000, 1000000);
  105.       digitalWrite(M5_LED, LOW);
  106.     }
  107.   } else {
  108.     if (beep) {
  109.       beep = false;
  110.       M5.Beep.mute();
  111.       digitalWrite(M5_LED, HIGH);
  112.     }
  113.   }

  114.   delay(1);
  115. }
复制代码

IMG_6113.jpg


该用户从未签到

发表于 2020-9-2 17:54 | 显示全部楼层
介绍详细就很舒服
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

arduino程序设计基础 blinker物联网解决方案

热门推荐

【教程】pico+hx711电子秤
【教程】pico+hx711电子秤
pico+hx711电子秤 【前言】 我做过多款电子秤,这次移植到pico上
ESP8266+Onenet平台远程数据传输和控制
ESP8266+Onenet平台远程数
这是我的第一个diy,主要功能实现了onenet云平台温湿度数据的传输和远程控制LED灯平台
【Arduino】108种传感器模块系列实验(48)---三轴ADXL345模块
【Arduino】108种传感器模
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
ps2遥控小车——uno实现
ps2遥控小车——uno实现
前几天在阁楼发现了好久以前3d打印,激光切割的底盘,于是决定做这个东西 正好手上又
震惊!OLED菜单竟只用10行代码就可以完成到完美!!!
震惊!OLED菜单竟只用10行
震惊!OLED菜单竟只用10行代码就可
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表