查看: 548|回复: 0

[经验] arduino驱动p3.75双色led单元64*32

[复制链接]
  • TA的每日心情
    开心
    2019-7-22 10:11
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    发表于 2019-10-15 09:27 | 显示全部楼层 |阅读模式
    本帖最后由 s65moto 于 2019-10-15 09:29 编辑

    使用了MsTimer2库,论坛里有。使用了hx711传感器

    缺点:使用的全局变量偏大,余留289字节。希望高手能优化一下,减少全局变量占用。
    [mw_shl_code=arduino,true]//定时器库的 头文件
    #include <MsTimer2.h>
    #include <Arduino.h>
    #define HX711_SCK 18
    #define HX711_DT 19
    long HX711_Buffer = 0;
    long Weight_Maopi = 0, Weight_Shiwu = 0;
    #define GapValue 430
    float Weight = 0;
    int m, f, flag;
    //extern void Init_Hx711();
    //extern unsigned long HX711_Read(void);
    //extern long Get_Weight();
    //extern void Get_Maopi();
    //****************************************************
    //初始化HX711
    //****************************************************
    void Init_Hx711()
    {
      pinMode(HX711_SCK, OUTPUT);
      pinMode(HX711_DT, INPUT);
    }
    //****************************************************
    //获取毛皮重量
    //****************************************************
    void Get_Maopi()
    {
      Weight_Maopi = HX711_Read();
    }
    //****************************************************
    //称重
    //****************************************************
    long Get_Weight()
    {
      HX711_Buffer = HX711_Read();
      Weight_Shiwu = HX711_Buffer;
      Weight_Shiwu = Weight_Shiwu - Weight_Maopi;       //获取实物的AD采样数值。
      Weight_Shiwu = (long)((float)Weight_Shiwu / GapValue);
      return Weight_Shiwu;
    }
    //****************************************************
    //读取HX711
    //****************************************************
    unsigned long HX711_Read(void)  //增益128
    {
      unsigned long count;
      unsigned char i;
      bool Flag = 0;
      digitalWrite(HX711_DT, HIGH);
      delayMicroseconds(1);
      digitalWrite(HX711_SCK, LOW);
      delayMicroseconds(1);
      count = 0;
      while (digitalRead(HX711_DT));
      for (i = 0; i < 24; i++)
      {
        digitalWrite(HX711_SCK, HIGH);
        delayMicroseconds(1);
        count = count << 1;
        digitalWrite(HX711_SCK, LOW);
        delayMicroseconds(1);
        if (digitalRead(HX711_DT))count++;
      }
      digitalWrite(HX711_SCK, HIGH);
      count ^= 0x800000;
      delayMicroseconds(1);
      digitalWrite(HX711_SCK, LOW);
      delayMicroseconds(1);
      return (count);
    }
    int LEPin = 11;//LE锁存控制
    int CLKPin = 12;//时钟 上升沿输入数据
    int R1Pin = 2;//红色上半部分数据
    int R2Pin = 3;//红色下半部分数据
    int G1Pin = 9;//绿色上半部分数据
    int G2Pin = 10;//绿色下半部分数据
    int OEPin = 4;//使能
    int APin = 5;//A
    int BPin = 6;//B
    int CPin = 7;//C
    int DPin = 8;//D
    int keyPin0 = A6;
    int keyPin1 = A7;
    int dian2[64] =
    {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF}; /*".",0*/
    int shuzi2[12][64] =
    {
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x7F, 0xF3, 0xBF, 0xE7, 0x9F, 0xCF, 0xCF, 0xCF, 0xCF, 0xCF, 0xEF, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0xCF, 0xEF, 0xCF, 0xCF, 0xCF, 0xCF, 0xE7, 0x9F, 0xF3, 0xBF, 0xF8, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, /*"0",0*/
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC, 0xFF, 0xC0, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xFC, 0xFF, 0xF8, 0x7F, 0xC0, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, /*"1",1*/
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xEF, 0x8F, 0xDF, 0xCF, 0xBF, 0xE7, 0xBF, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0xFF, 0xE7, 0xFF, 0xCF, 0xFF, 0xCF, 0xFF, 0x9F, 0xFF, 0x3F, 0xFE, 0x7F, 0xFC, 0xFF, 0xF9, 0xFF, 0xFB, 0xFF, 0xF7, 0xF7, 0xEF, 0xF7, 0xDF, 0xF7, 0xBF, 0xE7, 0x80, 0x0F, 0x80, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, /*"2",2*/
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0xCF, 0x3F, 0x9F, 0x9F, 0x9F, 0xCF, 0x9F, 0xCF, 0x9F, 0xCF, 0xFF, 0xCF, 0xFF, 0xCF, 0xFF, 0x9F, 0xFF, 0x3F, 0xF8, 0x7F, 0xFF, 0x1F, 0xFF, 0xCF, 0xFF, 0xEF, 0xFF, 0xE7, 0xFF, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xEF, 0x9F, 0xCF, 0xCF, 0x9F, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, /*"3",3*/
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0x3F, 0xFE, 0x3F, 0xFE, 0x3F, 0xFD, 0x3F, 0xFD, 0x3F, 0xFB, 0x3F, 0xF7, 0x3F, 0xF7, 0x3F, 0xEF, 0x3F, 0xEF, 0x3F, 0xDF, 0x3F, 0x9F, 0x3F, 0xBF, 0x3F, 0x7F, 0x3F, 0x00, 0x07, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0xFF, 0x3F, 0xF8, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, /*"4",4*/
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x07, 0xE0, 0x07, 0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0xD8, 0x3F, 0xD7, 0x9F, 0xCF, 0xCF, 0xDF, 0xEF, 0xFF, 0xE7, 0xFF, 0xE7, 0xFF, 0xE7, 0xFF, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0xBF, 0xCF, 0xBF, 0xCF, 0xCF, 0x9F, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, /*"5",5*/
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x3F, 0xF3, 0xCF, 0xE7, 0xCF, 0xEF, 0xCF, 0xCF, 0xFF, 0xDF, 0xFF, 0xDF, 0xFF, 0x9F, 0xFF, 0x98, 0x3F, 0x93, 0x9F, 0x8F, 0xCF, 0x8F, 0xEF, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0xCF, 0xE7, 0xCF, 0xEF, 0xE7, 0xCF, 0xE3, 0x9F, 0xF8, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, /*"6",6*/
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x07, 0xC0, 0x07, 0xDF, 0xEF, 0x9F, 0xDF, 0xBF, 0xDF, 0xBF, 0xBF, 0xFF, 0xBF, 0xFF, 0x7F, 0xFF, 0x7F, 0xFF, 0x7F, 0xFE, 0xFF, 0xFE, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xF9, 0xFF, 0xF9, 0xFF, 0xF9, 0xFF, 0xF9, 0xFF, 0xF9, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, /*"7",7*/
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xE7, 0x9F, 0xCF, 0xCF, 0x9F, 0xE7, 0x9F, 0xE7, 0x9F, 0xE7, 0x8F, 0xE7, 0x8F, 0xEF, 0xC3, 0xCF, 0xE1, 0xBF, 0xF0, 0x7F, 0xCE, 0x1F, 0x9F, 0x0F, 0x9F, 0x8F, 0x3F, 0xC7, 0x3F, 0xE7, 0x3F, 0xE7, 0x3F, 0xE7, 0x3F, 0xE7, 0x9F, 0xCF, 0xCF, 0x9F, 0xF0, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, /*"8",8*/
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x7F, 0xCF, 0xBF, 0x9F, 0xDF, 0x9F, 0xCF, 0x3F, 0xEF, 0x3F, 0xE7, 0x3F, 0xE7, 0x3F, 0xE7, 0x3F, 0xE7, 0x3F, 0xE7, 0x1F, 0xC7, 0x9F, 0xA7, 0xCF, 0x27, 0xE0, 0xE7, 0xFF, 0xE7, 0xFF, 0xCF, 0xFF, 0xCF, 0xFF, 0xDF, 0x9F, 0x9F, 0x9F, 0x3F, 0x9E, 0x7F, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, /*"9",9*/
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0xE0, 0xC7, 0xFB, 0xC7, 0xFB, 0xD3, 0xFB, 0xD3, 0xFB, 0xD9, 0xFB, 0xD9, 0xFB, 0xDC, 0xFB, 0xDC, 0xFB, 0xDE, 0x7B, 0xDE, 0x7B, 0xDF, 0x3B, 0xDF, 0x3B, 0xDF, 0x9B, 0xDF, 0x9B, 0xDF, 0xCB, 0xDF, 0xCB, 0xDF, 0xE3, 0xDF, 0xE3, 0xDF, 0xF3, 0xDF, 0xF3, 0x07, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, /*"N",10*/
      {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x11, 0xF3, 0xC9, 0xF7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xF7, 0xE7, 0xF3, 0xCF, 0xF0, 0x1F, 0xE7, 0xFF, 0xE7, 0xFF, 0xE0, 0x3F, 0xF0, 0x07, 0xE7, 0xE3, 0xCF, 0xF3, 0xCF, 0xF3, 0xCF, 0xF3, 0xE7, 0xE7, 0xF8, 0x1F}, /*"g",11*/
    };
    void SendDate(unsigned char DataR1, unsigned char DataG1,  unsigned char DataR2, unsigned char DataG2 )
    {
      unsigned char i;
      for (i = 0; i < 8; i++)
      {
        digitalWrite(CLKPin, LOW);
        digitalWrite(R1Pin, DataR1 & 0x80);
        digitalWrite(R2Pin, DataR2 & 0x80);
        //    digitalWrite(G1Pin, DataR1 & 0x80);
        //    digitalWrite(G2Pin, DataR2 & 0x80);
        digitalWrite(CLKPin, HIGH);
        DataR1 <<= 1;
        //    DataG1 <<= 1;
        DataR2 <<= 1;
        //    DataG2 <<= 1;
      }
    };
    void flash()
    {
      /******************
        显示质量,单位克
      ******************/
      if (!flag)
      {
        for (int i = 0; i < 16; i++)
        {
          //      digitalWrite(CLKPin, LOW);
          digitalWrite(LEPin, LOW);//锁存,传递数据
          if (m < 100)
          {
            SendDate( 0xFF, 0xFF, 0xFF, 0xFF );
            SendDate( 0xFF, 0xFF, 0xFF, 0xFF);
          }
          else
          {
            SendDate(shuzi2[m / 100][2 * i], 0xFF, shuzi2[m / 100][2 * i + 32], 0xFF);
            SendDate(shuzi2[m / 100][2 * i + 1], 0xFF, shuzi2[m / 100][2 * i + 33], 0xFF);
          }
          if (m < 10)
          {
            SendDate( 0xFF, 0xFF, 0xFF, 0xFF);
            SendDate( 0xFF, 0xFF, 0xFF, 0xFF);
          }
          else
          {
            SendDate(shuzi2[(m / 10) % 10][2 * i], 0xFF, shuzi2[(m / 10) % 10][2 * i + 32], 0xFF);
            SendDate(shuzi2[(m / 10) % 10][2 * i + 1], 0xFF, shuzi2[(m / 10) % 10][2 * i + 33],  0xFF);
          }
          SendDate(shuzi2[m  % 10][2 * i], 0xFF, shuzi2[m  % 10][2 * i + 32],  0xFF);
          SendDate(shuzi2[m % 10][2 * i + 1], 0xFF,  shuzi2[m  % 10][2 * i + 33], 0xFF);
          SendDate(shuzi2[11][2 * i], 0xFF,  shuzi2[11][2 * i + 32],  0xFF);
          SendDate(shuzi2[11][2 * i + 1], 0xFF,  shuzi2[11][2 * i + 33], 0xFF);
          digitalWrite(APin, i & 0x01); digitalWrite(BPin, i & 0x02); digitalWrite(CPin, i & 0x04); digitalWrite(DPin,  i & 0x08);
          digitalWrite(LEPin, HIGH);//锁存,显示
          digitalWrite(OEPin, LOW  );
          delayMicroseconds(200);
          digitalWrite(OEPin, HIGH);
        }
      }
      else
      {
        /******************
          显示力,单位牛顿
        ******************/
        for (int i = 0; i < 16; i++)
        {
          digitalWrite(CLKPin, LOW);
          digitalWrite(LEPin,  LOW);//锁存,传递数据
          if (f < 100)
          {
            SendDate(shuzi2[0][2 * i], 0xFF,  shuzi2[0][2 * i + 32] & dian2[2 * i + 32], 0xFF);
            SendDate(shuzi2[0][2 * i + 1], 0xFF, shuzi2[0][2 * i + 33] & dian2[2 * i + 33],  0xFF);
          } else
          {
            SendDate(shuzi2[f / 100][2 * i], 0xFF,  shuzi2[f / 100][2 * i + 32] & dian2[2 * i + 32], 0xFF);
            SendDate(shuzi2[f / 100][2 * i + 1], 0xFF, shuzi2[f / 100][2 * i + 33] & dian2[2 * i + 33],  0xFF);
          }
          if (f < 10)
          {
            SendDate(shuzi2[0][2 * i], 0xFF,  shuzi2[0][2 * i + 32] , 0xFF);
            SendDate(shuzi2[0][2 * i + 1], 0xFF, shuzi2[0][2 * i + 33] ,  0xFF);
          }
          else
          {
            SendDate(shuzi2[(f / 10) % 10][2 * i], 0xFF, shuzi2[(f / 10) % 10][2 * i + 32], 0xFF);
            SendDate(shuzi2[(f / 10) % 10][2 * i + 1], 0xFF, shuzi2[(f / 10) % 10][2 * i + 33], 0xFF);
          }
          SendDate(shuzi2[f  % 10][2 * i], 0xFF,  shuzi2[f  % 10][2 * i + 32],  0xFF);
          SendDate(shuzi2[f % 10][2 * i + 1], 0xFF,  shuzi2[f  % 10][2 * i + 33], 0xFF);
          SendDate( shuzi2[10][2 * i], 0xFF,  shuzi2[10][2 * i + 32],  0xFF);
          SendDate(shuzi2[10][2 * i + 1], 0xFF, shuzi2[10][2 * i + 33],  0xFF);
          digitalWrite(APin, i & 0x01); digitalWrite(BPin, i & 0x02); digitalWrite(CPin, i & 0x04); digitalWrite(DPin,  i & 0x08);
          digitalWrite(LEPin, HIGH);//锁存,显示
          digitalWrite(OEPin, LOW );
          delayMicroseconds(200);
          digitalWrite(OEPin, HIGH);
        }
      }
    }
    void setup()
    {
      pinMode(LEPin, OUTPUT);
      pinMode(CLKPin, OUTPUT);
      pinMode(R1Pin, OUTPUT);
      pinMode(R2Pin, OUTPUT);
      pinMode(G1Pin, OUTPUT);
      pinMode(G2Pin, OUTPUT);
      pinMode(APin, OUTPUT);
      pinMode(BPin, OUTPUT);
      pinMode(CPin, OUTPUT);
      pinMode(DPin, OUTPUT);
      pinMode(OEPin, OUTPUT);
      pinMode(keyPin0, INPUT_PULLUP);
      pinMode(keyPin1, INPUT_PULLUP);
       Init_Hx711();       //初始化HX711模块连接的IO设置
      digitalWrite(G1Pin, HIGH);
      digitalWrite(G2Pin, HIGH);
      digitalWrite(R1Pin, HIGH);
      digitalWrite(R2Pin, HIGH);
      Serial.begin(9600);
      Serial.print("Welcome to use!\n");
      delay(3000);
      Get_Maopi();    //获取毛皮
      // 中断设置函数,每 2ms 进入一次中断
      MsTimer2::set(2, flash);
      //开始计时
      MsTimer2::start();
    }
    void loop()
    {
       Weight = Get_Weight();  //计算放在传感器上的重物重量
      m = Weight;
      if (m < 0)m = 0;
      f = m * 9.8 / 10;
      if (f < 0)f = 0;
    }[/mw_shl_code]

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

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    来了 Arduino Portenta H7
    来了 Arduino Portenta H7
    今年2月份下的订单 6月底才发货 7月中旬收到期待已久的 Arduino Portenta H7 预售的
    请教DS1302如何单独获取小时数据?
    请教DS1302如何单独获取小
    [mw_shl_code=arduino,true] // CONNECTIONS: // DS1302 CLK/SCLK --> 5 // DS1302 DA
    blinker库 示例文件编译也总出错
    blinker库 示例文件编译也
    不知道为什么。
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表