2020-1-8 10:35:10 [显示全部楼层]
2382浏览
查看: 2382|回复: 4

[入门] 亮度传感器识别光线摩尔斯代码

[复制链接]
根据摩尔斯代码表由一个Arduino编辑并发送光摩尔斯代码
亮度传感器识别光线摩尔斯代码图1

另一个arduino学习摩尔斯代码t值,接收并显示信息。
亮度传感器识别光线摩尔斯代码图2

这是发送端代码
volatile int t_base = 200; //莫尔斯电码基准时长
String sent;
volatile int sent_l;
void setup() {
  // put your setup code here, to run once:
  pinMode(2, OUTPUT);

  digitalWrite(2, LOW);
  delay(5000);
  digitalWrite(2, HIGH);
  delay(t_base);
  digitalWrite(2, LOW);
  delay(1000);
}

void loop() {
  sent = "welcome to dang jia zhuang school ";
  sent_l = String(sent).length();
  for (int ii = 0; ii < sent_l; ii++) {
    fanyi(String(sent).charAt(ii));
  }
}
void di() {
  digitalWrite(2, HIGH);
  delay(t_base);
  digitalWrite(2, LOW);
  delay(t_base);
}
void da() {
  digitalWrite(2, HIGH);
  delay(t_base * 3);
  digitalWrite(2, LOW);
  delay(t_base);
}
void fujian() {
  digitalWrite(2, LOW);
  delay(t_base * 3);
}
void zijian() {
  digitalWrite(2, LOW);
  delay(t_base * 6);
}
void fanyi(char fu) {
  switch (fu) {
    case 'a': a(); break;
    case 'b': b(); break;
    case 'c': c(); break;
    case 'd': d(); break;
    case 'e': e(); break;
    case 'f': f(); break;
    case 'g': g(); break;
    case 'h': h(); break;
    case 'i': i(); break;
    case 'j': j(); break;
    case 'k': k(); break;
    case 'l': l(); break;
    case 'm': m(); break;
    case 'n': n(); break;
    case 'o': o(); break;
    case 'p': p(); break;
    case 'q': q(); break;
    case 'r': r(); break;
    case 's': s(); break;
    case 't': t(); break;
    case 'u': u(); break;
    case 'v': v(); break;
    case 'w': w(); break;
    case 'x': x(); break;
    case 'y': y(); break;
    case 'z': z(); break;
    case '0': n0(); break;
    case '1': n1(); break;
    case '2': n2(); break;
    case '3': n3(); break;
    case '4': n4(); break;
    case '5': n5(); break;
    case '6': n6(); break;
    case '7': n7(); break;
    case '8': n8(); break;
    case '9': n9(); break;
    case ' ': zijian(); break;
  }
}
void n0() {
  da(); da(); da(); da(); da();
  fujian();
}
void n1() {
  di(); da(); da(); da(); da();
  fujian();
}
void n2() {
  di(); di(); da(); da(); da();

  fujian();
}
void n3() {
  di(); di(); di(); da(); da();
  fujian();
}
void n4() {
  di(); di(); di(); di(); da();
  fujian();
}
void n5() {
  di(); di(); di(); di(); di();
  fujian();
}
void n6() {
  da(); di(); di(); di(); di();
  fujian();
}
void n7() {
  da(); da(); di(); di(); di();
  fujian();
}
void n8() {
  da(); da(); da(); di(); di();
  fujian();
}
void n9() {
  da(); da(); da(); da(); di();
  fujian();
}
void a() {
  di(); da();
  fujian();
}
void b() {
  da(); di(); di(); di();
  fujian();
}
void c() {
  da(); di(); da(); di();
  fujian();
}
void d() {
  da(); di(); di();
  fujian();
}
void e() {
  di();
  fujian();
}
void f() {
  di(); di(); da(); di();
  fujian();
}
void g() {
  da(); da(); di();
  fujian();
}
void h() {
  di(); di(); di(); di();
  fujian();
}
void i() {
  di(); di();
  fujian();
}
void j() {
  di(); da(); da(); da();
  fujian();
}
void k() {
  da(); di(); da();
  fujian();
}
void l() {
  di(); da(); di(); di();
  fujian();
}
void m() {
  da(); da();
  fujian();
}
void n() {
  da(); di();
  fujian();
}
void o() {
  da(); da(); da();
  fujian();
}
void p() {
  di(); da(); da(); di();
  fujian();
}
void q() {
  da(); da(); di(); da();
  fujian();
}
void r() {
  di(); da(); di();
  fujian();
}
void s() {
  di(); di(); di();
  fujian();
}
void t() {
  da();
  fujian();
}
void u() {
  di(); di(); da();
  fujian();
}
void v() {
  di(); di(); di(); da();
  fujian();
}
void w() {
  di(); da(); da();
  fujian();
}
void x() {
  da(); di(); di(); da();
  fujian();
}
void y() {
  da(); di(); da(); da();
  fujian();
}
void z() {
  da(); da(); di(); di();
  fujian();
}


这是接收端代码
#include <MsTimer2.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C mylcd(0x20, 16, 2);

volatile int t = 0;//莫尔斯电码基准时长
volatile int gy = 0;//计时变量
volatile int tmp;//临时存储LED亮度
String mylist = "";//存储滴答
String wrd = ""; //存储单词
volatile boolean i, l; //防止串口监视器连续回车
volatile int temp;//存储每一次的值,1代表嘀3代表嗒

void setup() {
  mylcd.init();
  mylcd.backlight();
  Serial.begin(9600);
  /*计时开始,1毫秒调用一次*/
  MsTimer2::set(1,  jishi);
  MsTimer2::start( );
  tmp = analogRead(A0);
}

void loop() {
  if (t > 0) {
    /*如果亮度大于1000,开始计时 */
    if (analogRead(A0) >= 1000) {
      /*如果上一次测得亮度小于1000,计时器归零,
        也就是看是不是由暗变亮*/
      if (tmp < 1000) {
        gy = 0;
      }
    } else {
      /*如果亮度小于10,开始计时 */
      //if (analogRead(A0) < 10){
      /*如果上一次测得亮度大于10,计时器归零,
        也就是看是不是由亮变暗*/
      if (tmp >= 1000) {
        mylcd.clear();
        mylcd.setCursor(1 - 1, 1 - 1);
        mylcd.print(gy);
        mylcd.setCursor(1 - 1, 2 - 1);
        temp = round(gy / t);
        if (temp > 3)
          temp = 3;
        mylist = mylist + String(temp);
        mylcd.print(temp);
        Serial.print(temp);
        gy = 0;//计算间隔有多长
        i = true;//防止串口监视器连续回车
        l = true;
      }

      if (gy > 4 * t && l) {
        Serial.println();
        l = false;
        mylcd.setCursor(5 - 1, 1 - 1);
        mylcd.print(wrd);
        wrd = "";
      } else if (gy > 2 * t && i) {
        Serial.println();
        i = false;
        mylcd.setCursor(4 - 1, 2 - 1);
        mylcd.print(mylist);
        char jieguo = zidian(mylist);
        mylist = "";
        wrd = wrd + String(jieguo);
        mylcd.setCursor(10 - 1, 2 - 1);
        mylcd.print(jieguo);
      }
    }

    tmp = analogRead(A0);
    delay(5);
  } else {
    mylcd.setCursor(1 - 1, 1 - 1);
    mylcd.print("Learning T");
    mylcd.setCursor(1 - 1, 2 - 1);
    mylcd.print("T=?");
    t = check_t();
    mylcd.setCursor(1 - 1, 2 - 1);
    mylcd.print("T="+String(t));
  }
}

//计时函数
void jishi( ) {
  gy++;
}
//检测T值
int check_t() {
  int ch = 0;
  boolean tiaochu = true, tou = false;

  while (tiaochu) {
    if (!tou && analogRead(A0) < 10)
      ch++;
    if (!tou && analogRead(A0) >= 1000)
      ch = 0;

    if (ch >= 4990) {
      if (analogRead(A0) >= 1000) {
        if (tmp < 1000) {
          gy = 0;
        }
      } else {
        if (tmp >= 1000) {
          tiaochu = false;
        }
      }
      tou = true;
    }

    tmp = analogRead(A0);
    delay(1);
  }
  return round(gy / 10) * 10;
}
//字典
char zidian(String jieshou) {
  int x = jieshou.toInt();
  char fanhui;
  switch (x) {
    case 33333: fanhui = '0'; break;
    case 13333: fanhui = '1'; break;
    case 11333: fanhui = '2'; break;
    case 11133: fanhui = '3'; break;
    case 11113: fanhui = '4'; break;
    case 11111: fanhui = '5'; break;
    case 31111: fanhui = '6'; break;
    case 33111: fanhui = '7'; break;
    case 33311: fanhui = '8'; break;
    case 33331: fanhui = '9'; break;
    case 13: fanhui = 'A'; break;
    case 3111: fanhui = 'B'; break;
    case 3131: fanhui = 'C'; break;
    case 311: fanhui = 'D'; break;
    case 1: fanhui = 'E'; break;
    case 1131: fanhui = 'F'; break;
    case 331: fanhui = 'G'; break;
    case 1111: fanhui = 'H'; break;
    case 11: fanhui = 'I'; break;
    case 1333: fanhui = 'J'; break;
    case 313: fanhui = 'K'; break;
    case 1311: fanhui = 'L'; break;
    case 33: fanhui = 'M'; break;
    case 31: fanhui = 'N'; break;
    case 333: fanhui = 'O'; break;
    case 1331: fanhui = 'P'; break;
    case 3313: fanhui = 'Q'; break;
    case 131: fanhui = 'R'; break;
    case 111: fanhui = 'S'; break;
    case 3: fanhui = 'T'; break;
    case 113: fanhui = 'U'; break;
    case 1113: fanhui = 'V'; break;
    case 133: fanhui = 'W'; break;
    case 3113: fanhui = 'X'; break;
    case 3133: fanhui = 'Y'; break;
    case 3311: fanhui = 'Z'; break;
    default: fanhui = '?'; break;
  }
  return fanhui;
}

Forgotten  版主

发表于 2020-1-8 10:53:20

前排围观,这个思路不错,相当于光藕隔离的用法了
回复

使用道具 举报

壮梽棱云  见习技师

发表于 2020-1-11 16:38:26

您这也是新人(入门)?
回复

使用道具 举报

gada888  版主

发表于 2020-1-19 08:42:01

纯支持
回复

使用道具 举报

kylinpoet  初级技神

发表于 2020-2-18 12:56:42

多谢分享,学习了。
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail