Arduino程序设计基础(第2版)》代码勘误-Arduino中文社区 - Powered by Discuz! Archiver

wangbin526 发表于 2015-11-12 23:07

Arduino程序设计基础(第2版)》代码勘误

本帖最后由 wangbin526 于 2015-11-12 23:34 编辑

    `(*∩_∩*)′
    两天前刚从京东入了第二版,为了做出自家茶园的液体肥发酵管理和喷灌系统、还有组培室的自动温湿度控制,偶个前业余码农也只能开始硬啃触硬件方面的东东了,偶倒是没注意别人提交的漏字错字之类的问题,不过这才看了五十页不到,就有两处代码错误了,都是试验的时候发现不对的,这都第二版了,难道之前的读者都没试验过代码吗?当然也可能是偶初学者自己弄错了,所以专门来发个帖问问,
    PS:书本身写的不错,偶入门很轻松。


首先,P44的流水灯
/*
OpenJumper LED Module
流水灯效果
www.openjumper.com
*/

void setup()
{
//初始化I/O口
for(int i=2;i<8;i++)
pinMode(i,OUTPUT);
}

void loop()
{
//从引脚2到引脚7,逐个点亮LED,等待1秒再熄灭LED
for(int i=2;i<7;i++)
{
    digitalWrite(i,HIGH);
    delay(1000);
    digitalWrite(i,LOW);   
}
//从引脚7到引脚2,逐个点亮LED,等待1秒再熄灭LED
for(int i=7;i>2;i--)
{
    digitalWrite(i,HIGH);
    delay(1000);
    digitalWrite(i,LOW);   
}
}电路图和代码都表明,使用的是引脚2到引脚7,第10行也写着(for(int i=2;i<8;i++))没问题,可第17和第24行又变成了(for(int i=2;i<7;i++))和 for(int i=7;i>2;i--),这样引脚7和引脚2的LED根本不会亮,像第十行那样(i<8)或者干脆写(i<=7)都可以。


上面那个算是笔误,可P50的新的按键控制方式,给的代码压根是不稳定的,用延时delay(500)来控制,只要按下按键不放的时间稍微长一点就会出问题,按的快一点又会不响应。最后居然还在末尾专门强调延时的重要性,真心不能这样误导初学者如此控制按键呐,还不如不给这个案例代码,否则做项目用这个办法控制按键估计就得直接悲剧了,偶贴了份自己写的。
// 去抖延时
int buttonDelay = 10;
// 有上拉电阻,按钮未按下时为HIGH
int preButtonState = HIGH;

void setup() {
// put your setup code here, to run once:
pinMode(2,INPUT);
// 设置上拉电阻
digitalWrite(2,HIGH);
pinMode(13,OUTPUT);
// 将LED默认设置为关
digitalWrite(13,LOW);
}

// 读取按钮状态(去抖)
bool getButtonState(int pin)
{
bool state;
bool preState = digitalRead(pin);
for(int count=1; count<=buttonDelay; count++)
{
    delay(1);
    state = digitalRead(pin);
    // 前后两次状态不一致时,重置循环
    if (state != preState)
    {
      count = 1;
      preState = state;   
    }
}
return state;
}

void loop() {
int buttonState = getButtonState(2);
if(buttonState == LOW)
{
    if(preButtonState == HIGH)
    {
      digitalWrite(13,!digitalRead(13));
    }
}
preButtonState = buttonState;
}去掉去抖函数也能用,但就是偶尔会在按键按下的瞬间,估计是触点快速反复接触分离导致反应错误,加了去抖以后实验了一阵子貌似没问题了。

偶目前只看到这里,书本身看着很轻松舒服,当然,Arduino方面偶还是小白,希望各位大神多多指导。

coloz 发表于 2015-11-14 08:43

您说的问题都在本书写作之初认真思考过。
首先第一个程序是没问题的,有人发帖也提过这个问题,这个写法只是为了更好看,按你的方式写也行,只是2、7会连续亮两次;
第二程序的存在就是为了讲解一次loop可能会很快,至于去抖的方法,后面的其他例程中应该包含的有~

wangbin526 发表于 2015-11-15 14:57

coloz 发表于 2015-11-14 08:43
您说的问题都在本书写作之初认真思考过。
首先第一个程序是没问题的,有人发帖也提过这个问题,这个写法只 ...

抱歉,仔细想想的确是这样。
第一个程序偶自己试的时候忘记打开7端口之后自己改回来了,所以认为7号不亮,第二个的话,的确,作为从新手开始的书,才50页也正常。

dzm1988 发表于 2016-6-1 21:18

楼主好,我是个初学者,学到下啦拉电阻这块发现根本试验不通,测试有几天了,能留个qq么,想跟您请教一下。非常感谢!

SAMWERSON 发表于 2016-6-14 15:34

coloz 发表于 2015-11-14 08:43
您说的问题都在本书写作之初认真思考过。
首先第一个程序是没问题的,有人发帖也提过这个问题,这个写法只 ...

对,我当时也注意到了,代码对的没错,
页: [1]
查看完整版本: Arduino程序设计基础(第2版)》代码勘误