技能梳理3@NODEMCU+串口屏+随机抽签+物理按键

194 阅读2分钟

串口屏抽签,类似抽奖,物理按键选中和清除,mcu是stm32

1、项目简介

在这里插入图片描述

2、实现逻辑

#屏幕页面放58个图标控件,每个图标控件上显示一个人名,控件下面位置再放一个控件,可在语数外物化生6个字(6个字不同颜色)之间选择
#按下随机选择按键,人名背景随机变深,20次后,最后一个背景变深的为选中者
#通过如下图的下或者右按键,选中要选择的人,图标开始闪烁,点击确认后,再通过按键选择这个人下面的学科
#点击清屏按键,页面所有带深色背景的人及学科字都被清除在这里插入图片描述

3、应用场景

#商场随机抽奖
#课堂随机选人签到或者答题
#课堂记录学生哪一科没有交作业或者需要课后找老师

4、核心代码梳理

void setup(void)
{

    //USART
    Serial.begin(115200);
   
    pinMode(LED_BUILTIN, OUTPUT);

    pinMode(KEY1, INPUT);
    pinMode(KEY1, INPUT_PULLUP);
    
    pinMode(KEY2, INPUT);
    pinMode(KEY2, INPUT_PULLUP);
    
    pinMode(KEY3, INPUT);
    pinMode(KEY3, INPUT_PULLUP);
    
    pinMode(KEY4, INPUT);
    pinMode(KEY4, INPUT_PULLUP);
    
    pinMode(KEY5, INPUT);
    pinMode(KEY5, INPUT_PULLUP);

    Serial.print("START");
}

void loop(void)
{
    //LED
    digitalWrite(LED_BUILTIN, HIGH);
    delay(300);
    digitalWrite(LED_BUILTIN, LOW);
    delay(300);

    right = digitalRead(KEY1);
    down = digitalRead(KEY2);
    ok = digitalRead(KEY3);
    clear = digitalRead(KEY4);
    randomDraw = digitalRead(KEY5);

    
  //check///  

    if(right == 0)
    {
        if(ok_flag)
        {
            right_sub_num++;
            right_sub_num = right_sub_num % 7;
        }     
        else right_num++;  
    }

    if(down == 0)
    {
        down_num++;
    }
    
    if(ok == 0)
    {
        ok_num = 1;
    }
    if(ok_num)
    {
        if(ok == 1)
        {
            ok_num = 0;
            ok_flag++;
            ok_flag = ok_flag % 2;
            right_sub_num = 0;
        }
    }

    if(clear == 0)
    {
        clear_flag = 1;
    }


  //clear///      
    
   if((down_flag || right_flag) && clear_flag)
   {
         clear_flag = 0;
         right_num = 1;
         down_num = 0;
   }
   if(clear_flag == 1)
   {
         clear_flag = 2;
         ok_flag = 0;
         right_num = 0;
         down_num = 0;

         for(uint8_t i=0; i<8; i++)
         {
            tx_data[7] = 0;
            Serial.printf("%c", tx_data[i]);
         }
       //clear
        for(uint8_t j=0x3A; j<0x73; j++)
        {
            delay(50);
            for(uint8_t i=0; i<8; i++)
            {
                tx_data_sub[5] = j;
                tx_data_sub[7] = 0;
                Serial.printf("%c", tx_data_sub[i]);
            }
        }
   }

  //select///    

    if(!ok_flag)//name
    {
        if(down_num == 6)
        {
            if(right_num >= 4)
                right_num = 1;
        }
        else if(down_num == 7)
            down_num = 0;

        if(right_num >= 10)
            right_num = 1;

         for(uint8_t i=0; i<8; i++)
         {
            tx_data[7] = 0;
            Serial.printf("%c", tx_data[i]);
         }
        delay(100);
        tx_data[5] = down_num*9 + right_num;

        for(uint8_t i=0; i<8; i++)
        {
            tx_data[7] = 1;
            Serial.printf("%c", tx_data[i]);
        }
    }
    else//subject
    {
        for(uint8_t i=0; i<8; i++)
        {
            tx_data_sub[5] = tx_data[5] + 0x39;
            if(right_sub_num == 6)
                tx_data_sub[7] = 0;
            else tx_data_sub[7] = 8 - right_sub_num;
            Serial.printf("%c", tx_data_sub[i]);
        }
    }



  //random select ///  
    if(randomDraw == 0)
    {
         //random
         for(uint8_t j=0; j<20; j++)
         {
            delay(500);
            for(uint8_t i=0; i<8; i++)
            {
                tx_data[7] = 0;
                Serial.printf("%c", tx_data[i]);
            }
            delay(500);
            randomDraw_num = random(1,57);
            //Serial.println(randomDraw_num);
            right_num = randomDraw_num % 9;
            down_num = randomDraw_num / 9;
            
            for(uint8_t i=0; i<8; i++)
            {
                tx_data[5] = randomDraw_num; //random num
                tx_data[7] = 1;
                
                Serial.printf("%c", tx_data[i]);
            }
         }
        

    }
    
    
    //Serial.printf("KEY: %d,%d,%d,%d,%d",right, down, ok, clear, randomDraw);

}

5、部分参考资料

#显示屏官网:www.viewtech.cn/ 型号SDWB070T84N

6、注意事项

#串口屏固件使用sd卡下载
#串口屏连线参考HardwareConnection.pdf
#串口屏开发工具是VGUS2021开发工具.exe
#图标生成使用自带的icon生成工具
#nodemcu注意连线

完整可运行项目地址带串口屏固件

开发者涨薪指南

48位大咖的思考法则、工作方式、逻辑体系