九层楼房电梯数字滚动显示 - Processing 示例代码

这是一个使用 Processing 实现九层楼房电梯数字滚动显示的示例代码,模拟了电梯显示屏上下滚动显示楼层的效果,点击相应的楼层,数字就会滚动显示到相应的数字。

// 九层电梯数字滚动显示
// 点击相应的楼层,单片机上面的数字就会滚动显示到相应的数字

import processing.serial.*;

Serial myPort;  // 串口通信对象
int currentLevel = 1;  // 当前楼层
int destLevel = 1;  // 目标楼层
int offsetX = 0;  // X轴偏移量
int offsetY = 0;  // Y轴偏移量
int r = 0;  // 当前数字的字节偏移量
int counter = 0;  // 刷新计数器
int[] table = {  // 数字编码表
  0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, // 0
  0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, // 1
  0x00, 0x7E, 0x02, 0x02, 0x7E, 0x40, 0x40, 0x7E, // 2
  0x00, 0x7E, 0x02, 0x02, 0x7E, 0x02, 0x02, 0x7E, // 3
  0x00, 0x48, 0x48, 0x48, 0x7E, 0x08, 0x08, 0x08, // 4
  0x00, 0x7E, 0x40, 0x40, 0x7E, 0x02, 0x02, 0x7E, // 5
  0x00, 0x7C, 0x40, 0x40, 0x7C, 0x44, 0x44, 0x7C, // 6
  0x00, 0x7C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, // 7
  0x00, 0x7C, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x7C, // 8
  0x00, 0x7E, 0x42, 0x42, 0x7E, 0x02, 0x02, 0x7E  // 9
};

void setup() {
  size(800, 600);
  myPort = new Serial(this, Serial.list()[0], 9600);  // 打开串口
}

void draw() {
  background(255);
  // 绘制楼层标签
  for (int i = 1; i <= 9; i++) {
    fill(0);
    textSize(32);
    text(i, 50, 600 - i * 60);
  }
  // 绘制电梯数字滚动显示
  int[] currentNum = getNumber(currentLevel);
  int[] destNum = getNumber(destLevel);
  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 9; j++) {
      int num = currentNum[i] & (1 << j);
      if (num != 0) {
        fill(0);
      } else {
        fill(255);
      }
      rect(j * 60 + offsetX, i * 60 + offsetY, 50, 50);
      num = destNum[i] & (1 << j);
      if (num != 0) {
        fill(0);
      } else {
        fill(255);
      }
      rect(j * 60 + offsetX, (i + 9) * 60 + offsetY, 50, 50);
    }
  }
  // 发送目标楼层给单片机
  if (currentLevel == destLevel) {
    if (mousePressed) {
      int floor = (600 - mouseY) / 60;
      if (floor >= 1 && floor <= 9 && floor != destLevel) {
        destLevel = floor;
        myPort.write(destLevel);
      }
    }
  }
  // 刷新数字滚动显示
  counter++;
  if (counter == 10) {
    counter = 0;
    r++;
    if (r == 8) {
      r = 0;
      if (currentLevel < destLevel) {
        offsetX--;
        if (offsetX == -540) {
          offsetX = 0;
          currentLevel++;
        }
      } else if (currentLevel > destLevel) {
        offsetX++;
        if (offsetX == 540) {
          offsetX = 0;
          currentLevel--;
        }
      }
    }
  }
}

// 获取数字的编码数组
int[] getNumber(int num) {
  int[] result = new int[8];
  int index = (num - 1) * 8;
  for (int i = 0; i < 8; i++) {
    result[i] = table[index + i];
  }
  return result;
} 

void serialEvent(Serial myPort) {
  // 接收单片机的数据
  String inString = myPort.readStringUntil('
');
  if (inString != null) {
    inString = trim(inString);
    if (inString.length() > 0) {
      destLevel = int(inString);
    }
  }
}

在 processing 中,我们使用了鼠标交互来选择目标楼层,并通过串口通信将目标楼层发送给单片机。同时,我们绘制了一个九层楼房的图画,并在每个楼层上标注了数字。数字滚动显示的实现方式与 51 单片机上的代码类似,不同点在于我们使用了偏移量来控制数字的滚动方向和速度。

这个示例代码仅供参考,你可以根据自己的需求进行修改和扩展。例如,你可以添加更多功能,例如:

  • 添加电梯开门和关门动画
  • 添加电梯运行声音效果
  • 添加楼层按钮的显示和交互
  • 添加电梯内部乘客的显示

原文地址: https://www.cveoy.top/t/topic/k43l 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录