须知前提:
arduino的A0、A1、、等口为模拟信号输入口,arduino板子通过测得A0口的电势来产生A0口的数据,测压的范围是0~5V,产生的数值为0~1023。使用模拟输入测电势时,需将被测物的负极与GND连接,否则无法测量,且因浮空产生一系列错误数值。
核心思想:
1、arduino模拟输入的读电压功能。
2、串联电阻的电阻分压。
3、将模拟输入数值经计算得到电压值。
左侧为串口监视器传出数值,右侧为电压表测值。
本例的设计为0~1030V量程的测压电路。

电路图:
看左边图就好,右边有点乱。


因为电阻往往不会精确地如标注或万用表测得的数值一般,所以,电路的设计最好有一定弹性。我们可以在电路上串联一个变值电阻来调节测试精度。调节精度还有一个途径,即在计算程序中修改一些参数,本例中的数值就如此调试过。
关于变值电阻的选择,个人建议选择总值有10k欧姆的,在计算时,可以让大分压电阻取一个略小于实际的值计算,后通过滑动变阻器补偿。比如47k电阻,可取值45k进行计算,不够的话再通过调变值电阻补。
计算:
我们知道串联电阻的各电阻分压比与电阻比程正比,所以我们可以计算出我们从原本的5v量程放大了多少倍。

注意:我们前面提到了电子元件阻值不完全精准,所以在阻值取值上有问题,后续会利用变值电阻和调整数值的方法校准,所以这是一场粗略的计算。
程序:
只测量一个电压的话,程序时十分简易的,但是大家在设计其他项目时,如果想测得某处电压,可使用本方法。
void setup() {
pinMode(A0,INPUT); //令A0为模拟输入
Serial.begin(9600);
}
void loop() {
int i =analogRead(A0); //令A0口读出电压,但此时是0~1023的数字。
float V=0.00;
Serial.print(" i=");
Serial.print(i); //传出i的大小。
V=i*(5.00/1023.00)*206.00; //206.00为测试电压的放大倍数(根据实际情调整,原数为205.55)
Serial.print(" V="); Serial.println(V); //传出电压V的大小
delay(100);
}
本程序将A0口读到的值i和最终计算结果V输出到电脑,其中 i*(5.00/1023.00)是为了将A0口测出的0~1023的数变为实际测出的电压(本操作也可以用map函数映射实现)。之后,乘上206.00(放大倍数)即可得到测压端电压V。
校准:
上面也反复提到过,我们在电路设计中留下弹性空间。这里简述一下具体操作:
1,利用变值电阻。在连接电路后,将变值电阻电阻调为0,之后测压端连接被测物,同时被测物连接一个成品电压表,arduino连接电脑,并打开串口监视器。观察成品电压表数值与串口监视器中传回的V值。反复调节变值电阻,直到两读数基本吻合。多试几组。
2,(非必要)如果通过变值电阻调节仍不可校准,即可修改我们上面计算的倍数。
最终,我们可以尽可能使arduino算出精准数值,不过,肯定不能百分百精准。下图是本人的一些测压结果。
第一组


第二组


第三组


是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac
假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl
在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定
我有一个gem,它有一个根据Rails.env的不同行为的方法:defself.envifdefined?(Rails)Rails.envelsif...现在我想编写一个规范来测试这个代码路径。目前我是这样做的:Kernel.const_set(:Rails,nil)Rails.should_receive(:env).and_return('production')...没关系,只是感觉很丑。另一种方法是在spec_helper中声明:moduleRails;end而且效果也很好。但也许有更好的方法?理想情况下,这应该有效:rails=double('Rails')rails.sho
我的ruby脚本从命令行参数获取某些输入。它检查是否缺少任何命令行参数,然后提示用户输入。但是我无法使用gets从用户那里获得输入。示例代码:test.rbname=""ARGV.eachdo|a|ifa.include?('-n')name=aputs"Argument:#{a}"endendifname==""puts"entername:"name=getsputsnameend运行脚本:rubytest.rbraghav-k错误结果:test.rb:6:in`gets':Nosuchfileordirectory-raghav-k(Errno::ENOENT)fromtes
我正在为我的用户实现一些rubyonrails代码推特内容。我正在创建正确的oauth链接...类似http://twitter.com/oauth/authorize?oauth_token=y2RkuftYAEkbEuIF7zKMuzWN30O2XxM8U9j0egtzKv但在我的测试帐户授予对twitter的访问权限后,它会弹出一个页面,上面写着“您已成功授予对.我不知道用户应该在哪里输入此PIN以及他们为什么必须这样做。我认为这不是必要的步骤。Twitter应该将用户重定向到我在应用程序设置中提供的回调URL。有谁知道为什么会这样?更新我找到了thisarticle声明我需
我有一个rspec模拟对象,一个值赋给了属性。我正在努力在我的rspec测试中满足这种期望。只是想知道语法是什么?代码:defcreate@new_campaign=AdCampaign.new(params[:new_campaign])@new_campaign.creationDate="#{Time.now.year}/#{Time.now.mon}/#{Time.now.day}"if@new_campaign.saveflash[:status]="Success"elseflash[:status]="Failed"endend测试it"shouldabletocreat
我正在尝试测试命令行工具的输出。如何使用rspec来“伪造”命令行调用?执行以下操作不起作用:it"shouldcallthecommandlineandreturn'text'"do@p=Pig.new@p.should_receive(:run).with('my_command_line_tool_call').and_return('resulttext')end如何创建stub? 最佳答案 使用newmessageexpectationsyntax:规范/虚拟规范.rbrequire"dummy"describeDummy
我相信我对这个问题有一个很好的答案,但我想确保ruby-philes没有更好的方法来做到这一点。基本上,给定一个输入字符串,我想在适当的情况下将该字符串转换为整数,或在适当的情况下将其转换为float。否则,只返回字符串。我会在下面发布我的答案,但我想知道是否有更好的方法。例如:to_f_or_i_or_s("0523.49")#=>523.49to_f_or_i_or_s("0000029")#=>29to_f_or_i_or_s("kittens")#=>"kittens" 最佳答案 我会尽可能避免在Ruby中使用正则表达式