2023年电赛F题——基于声传播的智能定位系统(基础部分实现)

目录

前言

一、题目简述

二、效果展示

三、实现方案

1.声电转换

 2.信号分析

方案策

方案实行

最终代码


前言

        2023电赛结束,这篇文章记录一下自己的实现方案与反思其中的仍可改进部分,能力的限制,四天三夜真正开始有进展时间就已经只剩下了一天了,只做完了基础部分,实现效果在电赛评比阶段基础部分满分拿下,结果为省二。

本文章会简述在电赛期间的所有设想与验证方式(由于竞赛期间并未考虑写这篇文章,因此很多数据与图片都是电赛后拍摄采集的),旨在对思路方法的分析与改进,本人三本末流院校,技术与思路十分不堪,如果没有什么帮助,推荐去hub上瞅一瞅。

一、题目简述

         题目要求在指定大小的亚克力板作为测试平台,四个指定大小边角位置为检测装置与发射装置布置区域(Z区域),基础部分要求能预留接口以验证系统检测声音信号(信号要求为15khz至20khz频率步进为1khz的扫频信号)。在中心指定大小区域为敲击区域(M区域),要求划分为6x6大小共36个检测点位,通过显示设备显示敲击的36中点位的具体点位(通过题目指定编号进行显示)。

附: f2023年全国大学生电子设计竞赛题目下载

二、成果展示

  

三、实现方案

1.声电转换与信号发生

        在题目发出第一次审题时便多次出现了声电电声转换部件。本题目相对于去年的音源定位题目而言,传播介质由空气转变为固体传播,咪头明显并不使用与固体传播的应用情况,我们也并未使用此传感器进行试验,进而由固体震动联想到压电传感器原理(由压电片形变从而产生电信号)。

        在采取了压电传感器后对其灵敏度与实际应用效果进行了测试​​(使用arduino uno平台测试)

最终采取的声电传感器
敲击后采集模拟量数值绘图

压电陶瓷传感测试

        测试结果发现该传感器能够读取到由音频产生的震动数据。而单片机读取到的模拟量数值呈现出了读取量少,分辨率低的情况。经过对于arduino的推测得出可能是因为程序运行模式为转换ad信号后立即通过串口通信发送,而串口通信需要调用时钟通信占用大量程序时间。因此需要测试ad转换速率究竟如何,以下 程序为测试在一秒时间内的ad转换次数,最后得出为8910次转换,每次转换大约耗时112us,根据《建筑外墙敲击声音振动特征分析》(知网)可得敲击声音大约可持续0.02至0.04秒,期间可ad转换约200-400次左右,分辨率完全够用。

        在第一问的指定频率声音产生上可以使用NE555制作,但要对频率一段时间后更改却不好实现,,思路为可以使用信号发生器产生所需信号,然后通过功率放大器链接扬声器单元产生所需声波。

#include <MsTimer2.h>
int dat;
unsigned long lop;
void fun()
{
  Serial.println(lop);
  lop=0;
}
void setup() {
// put your setup code here, to run once:
pinMode(A0,INPUT);
Serial.begin(9600);
MsTimer2 :: set(1000,fun);
MsTimer2 :: start();
}

void loop() {
  // put your main code here, to run repeatedly: 
  //Serial.print(lop);
dat=analogRead(A0);
lop++;

}

 2.信号分析

        方案策划

//方案策划为按时间描述的对该题目的分析与实践,最终实行方案请看下一节

        在采集到信号之后就是对与信号该如何进行分析的问题了。

对于声音信号波形的分析可以实现对声音的采集、预处理、特征提取、分类、合成、增强和编码等操作。

        根据题目要求为分析敲击点位置来分析。可以将敲击点视为声音发生点,通过四个边角得到的声音信号来进行识别声音发生点位置。也就是说我们需要分析在不同敲击点敲击时四个边角位置所接受到的信号是否有特征。根据声音传播特性要分析声音在空间中位置,那只能去识别声音传播速度或声音衰弱值来判断具体空间位置。

        在布置并连接了四个边角的声电传感器后,开始进行测试后发觉了一个十分重要的问题:

根据上文单个arduino uno的ad转换采集声音波形约为200-400个点数据,但如果同时采集四个ad数据,那么单个信号只能采集到50-100个点数据,导致单通道数据分辨率大大下降。

         于是为了实现采集更多的波形数据,采用了四块arduino uno来进行采集数据,通过串口通信在采集信息后将数据发送至一块arduino上进行分析。由于本方案考虑的是分析声音在传播途中的声音衰弱来分析不同的声音波形区分敲击点位,默认是同一时间收集到信号,除一号机外其他机器延迟机器编号(四块arduino分为ID1,2,3,4)单位时间后发送至一号机进行集中处理,由此解决了波形分辨率不够的问题。

搭建效果

         搭建完成后对于声音波形的分许却出现了问题,因为敲击角度力度还有回波的干扰等原因导致采集到的数据处于一个完全不可用的情况。由于平台搭建已经花费了大量的时间,于是在不改变搭建的情况下想到了另一个解决方案便是,将波形的最高点提取出来进行分析。

        随后发现收信号的互相差值与不同振幅也就是敲击力度的大小关系很大,除非是完全一样的敲击,否则十分难以进行分析。

方格间距离
距离差

         进入此困境后,需要放松一下改变思路。在去钓了一条鱼之后,将思路进行了变更,从采集AD数值来分析波型变更为通过模块集成的比较器来采集收集到声音信号的一瞬间。从而通过分析声音的传播速度差来进行分析。由于四个主板组已经搭建完成,同时考虑到由于固体传播的因素加上每个相邻方格之间距离仅为5cm,而两个相邻方格距离最远的传感器仅有34cm的差值,于是我决定在原有基础上继续使用多mcu采集的方案,这个时候问题就开始出现了,由于每个单片机就算是同时上电启动,一样的程序,也不能保证能够使定时器同时开始定时,使用一个IO口拉高登待释放时开始同时计时可以使在头几个计时里比较稳定,往后还是会出现偏差,加上仅有34cm的差值,定时器的微小偏差也会使得整个系统出现毁灭性灾难

方案实行

        由于以上情况加上经验不足,犯了很蠢的错误,就是在不确定可以使用该方案的情况下就继续优化方案。导致在此方案上花费了太多时间,在此也着重提醒大家,在进行方案实行前一定要多次分析是否方案可行。在搭建好后如果有更好方案或当前方案一直达不到预期,请立刻放弃该方案,不要因为已经搭建成功而继续使用,这样会浪费非常多的时间在这个最终很有可能不会使用的方案上。

在第一问的频率生成上并没有什么好的方法,最后采用了dds加功放的方式来产生每隔一段时间变化频率的音频信号。

dds生成
dds加功放生成信号

        在识别敲击点位方面,对于Arduino定时器的分频为8,一个计时会持续2毫秒。Arduino使用的定时器是基于16MHz的系统时钟,而分频系数为8意味着每个计时周期需要8个时钟周期,因此一个计时周期为8 * (1 / 16MHz) = 0.5微秒。 

        

在确定了定时器的最小分辨率后便可以进行初步判断可否对敲击范围进行判定,以下为声速在不同介质中的近似传播速度表。


以下声速为近似值

材料声速
 Inch/µSM/s
空气0.013330
0.2506300

矾土氧化物

0.3909900
0.51012900
碳化硼0.43011000
黄铜0.1704300
0.1102800
0.1804700
玻璃0.2105300
甘油0.0751900
0.1303200
0.1604000
铬镍铁合金0.2205700
0.2305900
铁(铸铁)0.1804600
0.0852200
0.2305800
水银0.0571400
0.2506300
蒙乃尔(铜镍合金)0.2105400
氯丁橡胶0.0631600
0.2205600
尼龙,6.60.1002600
油(SAE 30)0.0671700
白金0.1303300
有机玻璃0.1101700
聚乙烯0.0701900
聚苯乙烯0.09302400
聚氨酯0.07001900
石英0.2305800
橡胶,丁基合成橡胶0.0701800
0.1403600
钢,低碳钢0.2305900
钢,不锈钢0.2305800
特氟隆0.0601400
0.1303300
0.2406100
0.2005200
0.1303400
0.5841480
0.1704200

根据声速在亚克力板(有机玻璃)中的传播速度为1700m每秒,那么在不同方格中的5cm差值传播时间约为30us。定时器0.5us的计时周期可以说是绰绰有余。因此我们将振动传感器固定后就开始了测试。首先通过对同一点位进行多次敲击采集数据来判断是否可以对该点位采集到一个固定特性的数据,随后通过对两个不同点位进行多次敲击来确定是否可以通过这个固定特性来对不同的点位进行特征识别。

单点敲击数据与计算值

 由于考虑到要采集四个位置的数据,因此每个中断的运行时间不易过长,因此定时器中断函数中仅放置了将定时器计时数据导出的程序,在等待四个定时器数据均导出至全局变量后再使用串口输出函数向电脑输出数据,以免产生较大误差。在将单点敲击数据汇总后(如上图),由于数据为计时器原始数据无参考性质,因此我们将各个传感器的点位原始数据相减得出特征值k1,k2,k3,k4后。可以观测到数据有明显规律,在进行多次敲击同一点位并计算出特征值后将数据汇总后某点位k1特征值可得出下表。

某点位多次敲击得出k1特征值

 可观测到k1特征值明显具有特征性。并且十分明显,只需对其他数据进行检测并验证是否符合特征便可将该点特征值录入系统进行识别。

最终结果(部分)

3328333283131-2019727.0025857058570203-4622398579857-82184-128-26.00四个数字采集处在图片的四个角412991299-99-19-53-171.005
19:56:35.352 -> 331523315220:05:23.372 -> 583675836720:09:28.649 -> 9939 9939三个采集点,一组四个数据,四个数据是根据时差采集的左上21:13:30.131 -> 1398 1398右下
19:56:35.352 -> 333533335320:05:23.372 -> 584135841320:09:28.649 -> 9755 9755要分析出采集点21:13:30.131 -> 1417 1417
19:56:35.352 -> 332563325620:05:23.372 -> 583915839120:09:28.649 -> 9883 988321:13:30.131 -> 1470 1470
3547335473127-1444730.001901819018125-54243149831498-21147-10125.0069236923-111-9-51-171.00
19:56:58.447 -> 353463534620:05:52.027 -> 188931889320:09:45.222 -> 315193151921:14:00.814 -> 7034 7034
19:56:58.447 -> 354903549020:05:52.068 -> 189471894720:09:45.264 -> 313723137221:14:00.814 -> 7043 7043
19:56:58.447 -> 354433544320:05:52.068 -> 189231892320:09:45.264 -> 314733147321:14:00.814 -> 7094 7094
5072950729134-20872-2.00640640245-482257005700-21146-10520.003178431784-95-24-51-170.00
19:57:16.033 -> 505955059520:06:09.816 -> 39539520:10:07.418 -> 5721 572121:14:17.706 -> 3187931879
19:57:16.065 -> 508035080320:06:09.816 -> 44344320:10:07.418 -> 5575 557521:14:17.706 -> 3190331903
19:57:16.065 -> 507315073120:06:09.816 -> 42142120:10:07.460 -> 5680 568021:14:17.706 -> 3195431954
1114911149135-21010328.002875028750126-482125402540-24152-10523.0047954795-116-2

-55
-173.00
19:57:34.772 -> 110141101420:06:34.058 -> 286242862420:10:26.026 -> 2564 256421:14:34.103 -> 4911 4911
19:57:34.772 -> 112241122420:06:34.058 -> 286722867220:10:26.026 -> 2412 241221:14:34.103 -> 4913 4913
19:57:34.772 -> 111211112120:06:34.058 -> 286512865120:10:26.070 -> 2517 251721:14:34.150 -> 4968 4968
5797157971132-20510027.005045650456126-54251962619626-23151-10523.0023232323-96-23-50-169.00
19:57:52.817 -> 578395783920:06:56.961 -> 503305033020:10:50.491 -> 196491964921:14:50.874 -> 2419 2419
19:57:52.817 -> 580445804420:06:56.961 -> 503845038420:10:50.491 -> 194981949821:14:50.919 -> 2442 2442
19:57:52.817 -> 579445794420:06:56.961 -> 503595035920:10:50.491 -> 196031960321:14:50.919 -> 2492 2492
1458714587137-209764.005700570060-49203386433864-23147-10222.004483944839-74-30-25-129.00
20:01:53.925 -> 144501445020:07:25.876 -> 5640564020:11:13.639 -> 338873388721:15:09.437 -> 4491344913
20:01:53.925 -> 146591465920:07:25.876 -> 5689 568920:11:13.639 -> 337403374021:15:09.437 -> 4494344943
20:01:53.925 -> 145831458320:07:25.876 -> 5669 566920:11:13.639 -> 338423384221:15:09.437 -> 4496844968
3031230312135-208752.00278412784160-3-255975559755-22150-10325.002094720947-97-24-12-133.00
20:02:18.085 -> 301773017720:07:45.099 -> 277812778120:11:36.826 -> 597775977721:15:29.785 -> 2104421044
20:02:18.085 -> 303853038520:07:45.140 -> 277842778420:11:36.827 -> 596275962721:15:29.785 -> 2106821068
20:02:18.085 -> 303103031020:07:45.140 -> 278092780920:11:36.827 -> 597305973021:15:29.785 -> 2108021080
5252352523166-26811210.008951895162-7-234762147621-10115-1014.004377343773-95-25-50-170.00
20:03:11.957 -> 523575235720:08:08.915 -> 8889 888920:12:17.137 -> 476314763121:15:44.577 -> 4386843868
20:03:11.957 -> 526255262520:08:08.915 -> 8896 889620:12:17.183 -> 475164751621:15:44.577 -> 4389343893
20:03:11.957 -> 525135251320:08:08.915 -> 8919 891920:12:17.183 -> 476174761721:15:44.577 -> 4394343943
5811658116129-2039622.00472914729159-6-2660266026-23151-10424.006487264872-94-12-24-130.00
20:03:28.738 -> 579875798720:08:44.993 -> 472324723220:12:37.183 -> 6049 604921:17:13.571 -> 6496664966
20:03:28.738 -> 581905819020:08:44.993 -> 472384723820:12:37.183 -> 5898 589821:17:13.571 -> 6497864978
20:03:28.782 -> 580945809420:08:44.993 -> 472644726420:12:37.183 -> 6002 600221:17:13.571 -> 6500265002
1072710727130-1524624.00260632606364-9-205379753797-24146-10121.004983049830-98-19-54-171.00
20:04:01.336 -> 105971059720:09:06.399 -> 259992599920:12:58.873 -> 538215382121:17:28.425 -> 4992849928
20:04:01.336 -> 107491074920:09:06.399 -> 260082600820:12:58.873 -> 536755367521:17:28.469 -> 4994749947
20:04:01.336 -> 107031070320:09:06.444 -> 260282602820:12:58.873 -> 537765377621:17:28.469 -> 5000150001
5628456284131-1514828.004669466938-6-222331323313-21145-9925.004998849988-101-19-55-175.00
20:14:43.278 -> 561535615320:39:16.161 -> 4631 463120:46:57.528 -> 233342333421:17:43.907 -> 5008950089
20:14:43.278 -> 563045630420:39:16.161 -> 4637 463720:46:57.528 -> 231892318921:17:43.907 -> 5010850108
20:14:43.278 -> 562565625620:39:16.161 -> 4659 465920:46:57.528 -> 232882328821:17:43.907 -> 5016350163
4778947789130-1494627.0063622636227-2-244537945379-40144-995.004330943309-98-25-52-175.00
20:15:07.374 -> 476594765920:39:29.514 -> 636156361520:47:25.675 -> 454194541921:17:57.251 -> 4340743407
20:15:07.374 -> 478084780820:39:29.514 -> 636176361720:47:25.675 -> 452754527521:17:57.251 -> 4343243432
20:15:07.374 -> 477624776220:39:29.514 -> 636416364120:47:25.675 -> 453744537421:17:57.295 -> 4348443484
13621362135-207742.0070270238-4-233143531435-6112-988.004436444364-113-8-55-176.00
20:31:18.559 -> 1227 122720:39:43.945 -> 664 66420:47:42.405 -> 314413144121:20:02.365 -> 4447744477
20:31:18.559 -> 1434 143420:39:43.945 -> 66866820:47:42.405 -> 313293132921:20:02.365 -> 4448544485
20:31:18.559 -> 1360 136020:39:43.945 -> 69169120:47:42.405 -> 314273142721:20:02.365 -> 4454044540
2535725357131-1534624.0049484948-14111029110291-22147-10124.003198131981-99-18-53-170.00
20:31:43.060 -> 252262522620:39:58.618 -> 4949 494920:48:03.024 -> 103131031321:21:09.440 -> 3208032080
20:31:43.061 -> 253792537920:39:58.618 -> 4945 494520:48:03.067 -> 101661016621:21:09.440 -> 3209832098
20:31:43.061 -> 253332533320:39:58.663 -> 4934 493420:48:03.067 -> 102671026721:21:09.482 -> 3215132151
6068460684130-1514625.00272162721613115846058460-39146-998.005145651456-78-29-26-133.00
20:32:08.102 -> 605546055420:40:15.000 -> 272152721520:48:19.481 -> 584995849921:21:28.402 -> 5153451534
20:32:08.102 -> 607056070520:40:15.000 -> 272122721220:48:19.481 -> 583535835321:21:28.402 -> 5156351563
20:32:08.147 -> 606596065920:40:15.000 -> 272012720120:48:19.524 -> 584525845221:21:28.402 -> 5158951589
23972397133-1544928.003643236432292-2781978197-10113-985.005819358193-109-12-50-171.00
20:32:26.771 -> 2264 226420:40:32.322 -> 364033640320:48:46.054 -> 8207 820721:22:45.287 -> 5830258302
20:32:26.771 -> 2418 241820:40:32.322 -> 364013640120:48:46.054 -> 8094 809421:22:45.287 -> 5831458314
20:32:26.771 -> 2369 236920:40:32.322 -> 364283642820:48:46.054 -> 8192 819221:22:45.287 -> 5836458364
2740927409125-1494319.00588305883034-2-2475487548-24152-10523.006376163761-97-24-52-173.00
20:32:44.674 -> 272842728420:41:32.729 -> 587965879620:49:04.379 -> 7572 757221:22:12.772 -> 6385863858
20:32:44.719 -> 274332743320:41:32.729 -> 587985879820:49:04.422 -> 7420 742021:22:12.772 -> 6388263882
20:32:44.719 -> 273902739020:41:32.729 -> 588225882220:49:04.422 -> 7525 752521:22:12.772 -> 6393463934
4342443424125-1454424.00639746397452-296206362063-40150-1028.005660756607-97-25-11-133.00
20:33:15.438 -> 432994329920:42:15.792 -> 639696396920:49:21.905 -> 621036210321:23:51.113 -> 5670456704
20:33:15.438 -> 434444344420:42:15.792 -> 639676396720:49:21.950 -> 619536195321:23:51.113 -> 5672956729
20:33:15.438 -> 434004340020:42:15.792 -> 639966399620:49:21.950 -> 620556205521:23:51.113 -> 5674056740
5670756707126-1464424.0037379373799-2-246336163361-8111-985.004580745807-106-11-48-165.00
20:33:30.197 -> 565815658120:42:37.414 -> 373703737020:49:52.368 -> 633696336921:24:33.552 -> 4591345913
20:33:30.197 -> 567275672720:42:37.458 -> 373723737220:49:52.368 -> 632586325821:24:33.552 -> 4592445924
20:33:30.197 -> 566835668320:42:37.458 -> 373963739620:49:52.368 -> 633566335621:24:33.552 -> 4597245972
1075610756136-21010430.00793579357-2-126101861018-21148-10126.001669916699-110-8-51-169.00
20:34:10.637 -> 106201062020:42:50.178 -> 7928 792820:50:07.812 -> 610396103921:24:47.856 -> 1680916809
20:34:10.637 -> 108301083020:42:50.178 -> 7930 793020:50:07.812 -> 608916089121:24:47.856 -> 1681716817
20:34:10.679 -> 107261072620:42:50.178 -> 7942 794220:50:07.812 -> 609926099221:24:47.856 -> 1686816868
2192721927138-21272-2.004048404832125052450524-10115-1005.0085338533-115-4-55-174.00
20:34:31.652 -> 217892178920:43:02.464 -> 4045 404520:50:24.308 -> 505345053421:25:06.708 -> 8648 8648
20:34:31.697 -> 220012200120:43:02.464 -> 4043 404320:50:24.308 -> 504195041921:25:06.708 -> 8652 8652
20:34:31.697 -> 219292192920:43:02.464 -> 4031 403120:50:24.308 -> 505195051921:25:06.708 -> 8707 8707
6307663076129-1514725.006563656331-1141014101-39147-999.004611146111-94-27-10-131.00
20:34:48.366 -> 629476294720:43:24.791 -> 6560 656020:50:39.829 -> 4140 414021:25:22.840 -> 4620546205
20:34:48.366 -> 630986309820:43:24.791 -> 6559 655920:50:39.875 -> 3993 399321:25:22.840 -> 4623246232
20:34:48.366 -> 630516305120:43:24.791 -> 6570 657020:50:39.875 -> 4092 409221:25:22.840 -> 4624246242
6346263462129-1504625.0058840588405-3143358233582-22146-10024.001111211112-94-24-12-130.00
20:35:21.156 -> 633336333320:43:37.835 -> 588355883520:50:57.277 -> 336043360421:26:26.678 -> 1120611206
20:35:21.156 -> 634836348320:43:37.835 -> 588385883820:50:57.277 -> 334583345821:26:26.723 -> 1123011230
20:35:21.156 -> 634376343720:43:37.835 -> 588245882420:50:57.277 -> 335583355821:26:26.723 -> 1124211242
6204362043132-1544725.0049374493744-2144952349523-42152-1055.002723227232-107-12-48-167.00
20:35:36.341 -> 619116191120:43:53.548 -> 493704937020:51:08.357 -> 495654956521:26:48.509 -> 2733927339
20:35:36.341 -> 620656206520:43:53.548 -> 493724937220:51:08.357 -> 494134941321:26:48.552 -> 2735127351
20:35:36.341 -> 620186201820:43:53.548 -> 493584935820:51:08.357 -> 495184951821:26:48.552 -> 2739927399
68576857112-150468.00555355553533-1-261171311713-23149-10521.004388743887-114-4-57-175.00
20:35:53.445 -> 6745 674520:44:09.032 -> 555025550220:51:26.550 -> 117361173621:27:53.088 -> 4400144001
20:35:53.445 -> 6895 689520:44:09.032 -> 555035550320:51:26.550 -> 115871158721:27:53.132 -> 4400544005
20:35:53.445 -> 6849 684920:44:09.032 -> 555295552920:51:26.596 -> 116921169221:27:53.132 -> 4406244062
4667546675127-1464627.0032334323347-2-102263622636-23147-10123.005867558675-97-21-53-171.00
20:36:12.987 -> 465484654820:44:24.131 -> 323273232720:51:50.482 -> 226592265921:28:13.113 -> 5877258772
20:36:12.987 -> 466944669420:44:24.175 -> 323293232920:51:50.482 -> 225122251221:28:13.113 -> 5879358793
20:36:13.031 -> 466484664820:44:24.175 -> 323393233920:51:50.482 -> 226132261321:28:13.113 -> 5884658846
61976197125-1464423.0028684286849-4-242364923649-8112-986.006463064630-112-7-52-171.00
20:36:27.007 -> 6072 607220:44:38.836 -> 286752867520:52:02.551 -> 236572365721:28:29.912 -> 6474264742
20:36:27.007 -> 6218 621820:44:38.836 -> 286792867920:52:02.551 -> 235452354521:28:29.912 -> 6474964749
20:36:27.007 -> 6174 617420:44:38.836 -> 287032870320:52:02.551 -> 236432364321:28:29.912 -> 6480164801
2479124791130-1494930.00516445164424122565225652-42148-1015.003724937249-114-5-54-173.00
20:36:40.726 -> 246612466120:44:52.562 -> 516425164220:52:16.944 -> 256942569421:28:46.825 -> 3736337363
20:36:40.726 -> 248102481020:44:52.562 -> 516385163820:52:16.990 -> 255462554621:28:46.868 -> 3736837368
20:36:40.726 -> 247612476120:44:52.562 -> 516265162620:52:16.990 -> 256472564721:28:46.868 -> 3742237422
1600016000125-1474422.00344323443242-285108851088-9114-1005.004440944409-99-19-53-171.00
20:37:06.394 -> 158751587520:45:07.149 -> 344283442820:52:32.546 -> 510975109721:29:03.638 -> 4450844508
20:37:06.394 -> 160221602220:45:07.192 -> 344263442620:52:32.546 -> 509835098321:29:03.685 -> 4452744527
20:37:06.394 -> 159781597820:45:07.192 -> 344543445420:52:32.546 -> 510835108321:29:03.685 -> 4458044580
2682226822133-21010124.00508550855-2-111563115631-23145-10022.002442224422-108-11-53-172.00
20:37:29.223 -> 266892668920:45:24.111 -> 5080 508020:52:47.864 -> 156541565421:29:17.737 -> 2453024530
20:37:29.223 -> 268992689920:45:24.111 -> 5082 508220:52:47.864 -> 155091550921:29:17.737 -> 2454124541
20:37:29.269 -> 267982679820:45:24.111 -> 5093 509320:52:47.908 -> 156091560921:29:17.737 -> 2459424594
5275152751129-1504625.00755775579-3-241665016650-40148-1026.001799717997-113-5-53-171.00
20:37:45.608 -> 526225262220:45:47.724 -> 7548 754820:53:01.761 -> 166901669021:29:34.519 -> 1811018110
20:37:45.608 -> 527725277220:45:47.724 -> 7551 755120:53:01.761 -> 165421654221:29:34.519 -> 1811518115
20:37:45.608 -> 527265272620:45:47.724 -> 7575 757520:53:01.804 -> 166441664421:29:34.519 -> 1816818168

 将一组数据写入程序进行检测验证结果展示

23电赛测试成果

最终代码

// 引入Arduino库
#include <Arduino.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
int K1,K2,K3,K4;
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library. 
// On an arduino UNO:       A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO:   2(SDA),  3(SCL), ...
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NUMFLAKES     10 // Number of snowflakes in the animation example

#define ID 1
// 定义中断触发的引脚
#define INTERRUPT_PIN 2
//int ready=0;
// 定义定时器1的寄存器指数
volatile unsigned long timer1Time;
volatile unsigned long timer1Time2;
volatile unsigned long timer1Time3;
volatile unsigned long timer1Time4;
int print=0;

// 中断服务函数
void interruptHandler() {
  // 读取定时器1的计数值
  timer1Time = TCNT1;
  //TCNT1 = 0;
 // ready=0;
  // 复位定时器1的计数值
 // print =1;
/*
 if(ready)
  {
    print =1;
  }
   
else {TCNT1 = 0; ready = 1; delay(400*ID); Serial.println("system,ready");}
*/
 
}

void interruptHandler2() {
  // 读取定时器1的计数值
  timer1Time2 = TCNT1;

  //TCNT1 = 0;
 // ready=0;
  // 复位定时器1的计数值
  
/*
 if(ready)
  {
    print =1;
  }
  
else {TCNT1 = 0; ready = 1; delay(400*ID); Serial.println("system,ready");}
*/
  
}

void interruptHandler3() {timer1Time3 = TCNT1;}
void interruptHandler4() {timer1Time4 = TCNT1;  print =1;  }

void setup() {
  // 初始化串口通信
  Serial.begin(9600);
    // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  display.display();
  //delay(2000); // Pause for 2 seconds
   display.clearDisplay();
  display.drawPixel(10, 10, SSD1306_WHITE);
  display.display();
  delay(2000);

      pinMode(3,INPUT);
  // 配置2号引脚为输入
  pinMode(INTERRUPT_PIN, INPUT);
  pinMode(18, INPUT);
  pinMode(19, INPUT);
  // 配置定时器1
  TCCR1A = 0; // 清除计时器1的控制寄存器A
  TCCR1B = 0; // 清除计时器1的控制寄存器B

  // 配置计时器1为正常模式
 // TCCR1A |= (0 << WGM10) | (0 << WGM11);
 // TCCR1B |= (0 << WGM12) | (0 << WGM13);
  TCCR1B |= (1 << CS11)  |  (1 << CS10)  ;
  // 配置计时器1的时钟源为外部下降沿触发
  //TCCR1B |= (1 << CS10) | (0 << CS11) | (1 << CS12);

  // 启用定时器1的溢出中断
  //TIMSK1 |= (1 << TOIE1);

  // 配置中断触发
  attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), interruptHandler,  RISING);
  attachInterrupt(digitalPinToInterrupt(3), interruptHandler2,  RISING);
  attachInterrupt(digitalPinToInterrupt(18), interruptHandler3,  RISING);
  attachInterrupt(digitalPinToInterrupt(19), interruptHandler4,  RISING);
}


 void screem(int a,int b)
{
   display.setTextSize(3);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0,0);
if(a==1)display.print("AB");
else
 {if(a==2)display.print("CD");
 else
 if(a==3)display.print("EF");
 else
 if(a==4)display.print("GH");
 else
 if(a==5)display.print("IJ");
 else
 if(a==6)display.print("KL");}
 
if(b==1)display.print(",0102");
else

 {if(b==2)display.print(",0304");
 else
 if(b==3)display.print(",0506");
 else
 if(b==4)display.print(",0708");
 else
 if(b==5)display.print(",0910");
 else
  if(b==6)display.print(",1112");}
  delay(10);
  yield();
  display.display();

}


void loop() {
  // 读取定时器1的时间并输出

  //if (Serial.available()) {
    // 读取串口接收到的数据
   // int receivedData = Serial.parseInt();
    // 打印接收到的数据
         if(print)
         {
delay (500*ID);
//Serial.println("begin");

K1=timer1Time-timer1Time2;
K2=timer1Time2-timer1Time3;
K3=timer1Time3-timer1Time4;
K4=timer1Time-timer1Time4;

/*   
Serial.println(K1);
Serial.println(K2);
Serial.println(K3);
Serial.println(K4);
*/


// 定义目标数据数组和可调误差范围
//                     1     2    3    4    5     6     7      8      9     10      11        12      13    14     15     16       17     18    19   20    21     22    23   24    25    26   27     28    29   30    31   32   33    34    35   36   37
int targetK1Data[] = {12,   15, 0,   -116, 80,   100,  25,    -75,  0,       40,     -35,      8,      0,    0,     0,    -25,     -50,   15,   65,  124,  70,    195,  0,   -65,  -50,  0,   4,     0,   104,  53,   23,  22,  38,  170,   69,  59,  37};
int targetK2Data[] = {1,    15, 110,   0,   0,   0,    -105,  35,   -130,   0,    80,       93,     -20,   -10,   1,    40,      0,     -88,  -160,  -170,  -120,  44,   35, -123,   40,  40,  59,  -48,    27,  -93, -46,  -6,   0,  -120, -90, -50,  0};
int targetK3Data[] = {1,    15, -110,  0,  85,   20,    0,     0,    70,    87,     -140,     0,      0,    0,    -80,    0,      0,      0,    4,   0,     99,   43,  -25,  93,   -47, -103,  -98, -6,   -36,    0,   0,  -4,   0,   -25,  28,  40, 64};
int targetK4Data[] = {1,    15, 0,   -180, 200,  150,  -95,    0,     0,    110,    0,        30,     5,    -45,    0,    -90,    -120,   -64,  0,  40,     110,  290,  60,  -92,    0,   0,   0,   -53,   116,   0,   0,  24,  78,    65,   0,  64, 97};
//
int targetK1Dat[] =  {14,   15, 0,    -94, 150,  181,   55,   -65,   170,   100,    -30,      35,     0,    0,      0,    -21,    -40,    25,  100,  324,   120,   200,  0,   -40,  -20,   0,   8,     0,   143,  85,  60,  30,  93,   190, 164, 100, 62};
int targetK2Dat[] =  {1,    15, 170,   0,   0,    0,   -88,    40,  -90,    -41,    100,      120,    35,   -5,    43,   50,      0,      -80, -100, 153,  -120,   57,   90, -117,   50,  70,   76,   -38,   53, -76, -38,   4,   0,   -75, -80, -37, 0};
int targetK3Dat[] =  {1,    15, -100,  0,  120,  40,     0,     0,    78,   120,    -80,      0,      0,    0,    -50,    0,      0,      0,    14,  0,   100,    75,  -10,   84,  -40,  -50,  -83,   -1,  -16,   0,   0,   4,   0,    20,  36,  53, 76};
int targetK4Dat[] =  {1,    15, 0,   -160, 265,  250,  -40,     0,    0,    200,      0,      45,     30,   -5,    0,    -30,    -114,   -56,   0,   140,  174,    405,  80,  -70,    0,   0,    0,   -46,  140,   0,   0,   31, 140,   90,   0, 106, 125};
#define ERROR_RANGE 5


    // 使用循环和if语句判断指数是否在目标数据数组中,并带有可调误差范围
    int i;
    int index = -1; // 初始化数组编号为-1,表示不在目标数据数组中

    // 同时判断K1、K2、K3和K4的指数是否在目标数据数组中
    for (i = 0; i < sizeof(targetK1Data) / sizeof(targetK1Data[0]); i++) {
        if (((K1 >= targetK1Data[i] - ERROR_RANGE && K1 <= targetK1Dat[i] + ERROR_RANGE) || targetK1Data[i]==0 ) &&
            ((K2 >= targetK2Data[i] - ERROR_RANGE && K2 <= targetK2Dat[i] + ERROR_RANGE) || targetK2Data[i]==0 ) &&
            ((K3 >= targetK3Data[i] - ERROR_RANGE && K3 <= targetK3Dat[i] + ERROR_RANGE) || targetK3Data[i]==0 ) &&
            ((K4 >= targetK4Data[i] - ERROR_RANGE && K4 <= targetK4Dat[i] + ERROR_RANGE) || targetK4Data[i]==0 )) {
            index = i;
            break;
        }
    }
  // 输出结果
    if (index != -1) {
      if(i==2){ display.clearDisplay();
 display.display();screem(6,1);}
        if(i==3){ display.clearDisplay();
 display.display();screem(1,1);}
        Serial.println("success");Serial.println(i);
           if(i==4){ display.clearDisplay();
 display.display();screem(6,6);}
        Serial.println("success");Serial.println(i);
   if(i==5){ display.clearDisplay();
 display.display();screem(6,4);}
        Serial.println("success");Serial.println(i);
           if(i==6){ display.clearDisplay();
 display.display();screem(1,4);}
        Serial.println("success");Serial.println(i);
          if(i==7){ display.clearDisplay();
 display.display();screem(3,1);}
        Serial.println("success");Serial.println(i);
        if(i==8){ display.clearDisplay();
 display.display();screem(3,6);}
        Serial.println("success");Serial.println(i);
               if(i==9){ display.clearDisplay();
 display.display();screem(5,6);}
        Serial.println("success");Serial.println(i);
         if(i==10){ display.clearDisplay();
 display.display();screem(5,1);}
        Serial.println("success");Serial.println(i);
         if(i==11){ display.clearDisplay();
 display.display();screem(6,2);}
        Serial.println("success");Serial.println(i);
         if(i==12){ display.clearDisplay();
 display.display();screem(4,3);}
        Serial.println("success");Serial.println(i);
           if(i==13){ display.clearDisplay();
 display.display();screem(3,3);}
        Serial.println("success");Serial.println(i);
          if(i==14){ display.clearDisplay();
 display.display();screem(2,1);}
        Serial.println("success");Serial.println(i);
           if(i==15){ display.clearDisplay();
 display.display();screem(4,1);}
        Serial.println("success");Serial.println(i);
              if(i==16){ display.clearDisplay();
 display.display();screem(1,2);}
        Serial.println("success");Serial.println(i);
         if(i==17){ display.clearDisplay();
 display.display();screem(1,3);}
        Serial.println("success");Serial.println(i);
        if(i==18){ display.clearDisplay();
 display.display();screem(1,5);}
        Serial.println("success");Serial.println(i);
            if(i==19){ display.clearDisplay();
 display.display();screem(2,6);}
        Serial.println("success");Serial.println(i);
        if(i==20){ display.clearDisplay();
 display.display();screem(4,6);}
        Serial.println("success");Serial.println(i);
        if(i==21){ display.clearDisplay();
 display.display();screem(6,5);}
        Serial.println("success");Serial.println(i);
if(i==22){ display.clearDisplay();
 display.display();screem(6,3);}
        Serial.println("success");Serial.println(i);
if(i==23){ display.clearDisplay();
 display.display();screem(2,2);}
        Serial.println("success");Serial.println(i);
if(i==24){ display.clearDisplay();
 display.display();screem(3,2);}
        Serial.println("success");Serial.println(i);
if(i==25){ display.clearDisplay();
 display.display();screem(4,2);}
        Serial.println("success");Serial.println(i);
if(i==26){ display.clearDisplay();
 display.display();screem(5,2);}
        Serial.println("success");Serial.println(i);
if(i==27){ display.clearDisplay();
 display.display();screem(2,3);}
        Serial.println("success");Serial.println(i);
if(i==28){ display.clearDisplay();
 display.display();screem(5,3);}
        Serial.println("success");Serial.println(i);
if(i==29){ display.clearDisplay();
 display.display();screem(2,4);}
        Serial.println("success");Serial.println(i);
if(i==30){ display.clearDisplay();
 display.display();screem(3,4);}
        Serial.println("success");Serial.println(i);
if(i==31){ display.clearDisplay();
 display.display();screem(4,4);}
        Serial.println("success");Serial.println(i);
if(i==32){ display.clearDisplay();
 display.display();screem(5,4);}
        Serial.println("success");Serial.println(i);
if(i==33){ display.clearDisplay();
 display.display();screem(2,5);}
        Serial.println("success");Serial.println(i);
if(i==34){ display.clearDisplay();
 display.display();screem(3,5);}
        Serial.println("success");Serial.println(i);
if(i==35){ display.clearDisplay();
 display.display();screem(4,5);}
        Serial.println("success");Serial.println(i);
if(i==36){ display.clearDisplay();
 display.display();screem(5,5);}
        Serial.println("success");Serial.println(i);


    }else{
       display.clearDisplay();
 display.display(); Serial.println("fail");Serial.println(i); Serial.println(K1);Serial.println(K2);Serial.println(K3);Serial.println(K4);    
    }
    


//Serial.println(timer1Time4);

print=0;
//ready=0;
      }
}    
   

/*
Serial.println(timer1Time);
Serial.println(timer1Time2);
Serial.println(timer1Time3);
Serial.println(timer1Time4);
*/

  • 27
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值