《超圖解Arduino 互動設計入門》第三版內容更新說明

《超圖解Arduino 互動設計入門》第三版封面

作者:趙英傑
出版社:旗標科技股份有限公司
出版日期:2016.12.24
頁數:656頁,雙色印刷。
定價:NT$680

本書已授權Arduino原廠發行多國語言版本。

自第一版推出三年多,感謝眾多讀者和老師的支持與推薦。Aduino原廠(arduino.org)執行長Federico Musto先生,在上海的某間書店翻閱到本書後,大為讚賞,到台灣與筆者聯繫,讓本書有機會推廣到國際舞台,2017年第一季英文版將率先問市。

本書的目標是讓高中以上,沒有電子電路基礎,對微電腦、電子DIY 及交互裝置有興趣的人士,也能輕鬆閱讀,進而順利使用Arduino 控制板完成互動應用。因此,實驗用到的電子和程式觀念,皆以手繪圖解的方式說明。

第三版插圖更新

本書DIY實驗單元的控制板,採用主流的Arduino UNO。書中所有插圖都是筆者採用Adobe Flash軟體手繪完成(註:Flash在2015年末更名為Animate CC),零組件也全都改用手繪插圖取代照片。

底下是第二版裡的可變電阻照片:

可變電阻照片

第三版的可變電阻手繪插畫:

可變電阻手繪插畫

第三版的Arduino Uno控制板依據arduino.org生產的版本繪製,並修正插孔和編號之間的視差,圖說字體也換成更易讀的樣式。

第三版的Arduino Uno控制板

這是第二版書籍的Arduino Uno控制板插圖:

第二版書籍的Arduino Uno控制板插圖

除了控制板和零組件,第三版裡的許多Arduino IDE軟體開發工具,以及「序列埠監控視窗」截圖,也改用手繪方式呈現,讓圖像更清晰銳利。這是第二版採用的IDE及「序列埠監控視窗」螢幕截圖:

Arduino IDE截圖

Arduino IDE截圖

序列埠監控視窗截圖

這是第三版的手繪介面:

Arduino IDE手繪插圖

 

Arduino IDE手繪插圖

 

序列埠監控視窗手繪插圖

第三版內容更新

第二版第17和18章中的Flash互動單元主題,在第三版以PDF格式收錄在光碟,當作附錄G和H。第三版重新改寫17和18章,加入觸控按鍵以及門禁系統應用等主題。這兩個章節的內容改编自筆者網站的下列文章:

第三版書籍第10章的「動手做10-4:使用atoi()轉換字串成數字」單元,補充「序列接收字元」的說明,取自筆者網站的「Arduino序列埠通訊程式Serial.read()讀取到 ÿ 字元的補充說明」這篇貼文。

第14章的藍牙控制單元,明確採用HC-05和HC-06模組,並依筆者網站的下列貼文改寫:

第7章新增一個「串聯兩個74HC575」單元,改寫自筆者網站的「串入並出的IC 74HC595補充說明:串聯多個74HC595 的Arduino程式示範」。

第1章的Arduino控制板簡介,參考「Arduino傳奇故事:開發秘辛」這篇貼文改寫。

延伸閱讀

Posts created 467

183 thoughts on “《超圖解Arduino 互動設計入門》第三版內容更新說明

  1. 赵老师,您好,看过《超圖解Arduino 互動設計入門》一书,觉着里边的内容很适合讲解给学生听,请问可有电子版吗?

    1. 您好,本书没有电子版,但是第二版有授权科学出版社出版简体中文版,谢谢!

      thanks,
      jeffrey

  2. 趙老師我買了您的Arduino互動設計一書,寫得非常清楚與好!! 我想詢問第五章Serial 序列通訊,
    我想透過Arduino 去擷取RS-232 信號!! 目前看到內容有寫Transmit code中 要填寫Ascii code
    如 #AASUM2 Cr與 $C,DR,CH*SUM1 CRLF 內容,這部分要如何填寫呢/! Recive code
    的一樣有Ascii code 如$R ,AD,CH*N/P,0.00*SUM1CRLF 等,請問這樣要如何寫呢!? 有方向嗎?! 謝謝老師

    1. 從你的描述看來,那應該是指訊息的「格式」,CRLF代表訊息以\r\n字元結尾(參閱5-14頁)、SUM也許是數據的加總,請詳閱該裝置的技術文件說明。

      thanks,
      jeffrey

  3. 您好我目前已訂購此書但尚未收到,想先請問需要購買哪些搭配的套件才能配合此書閱讀呢?

  4. 趙老師,您好,想請教《超圖解Arduino 互動設計入門》第3版跟第2版最大差別在哪? 插圖嗎?
    請問第2版是以甚麼型號的arduino板子為撰寫題材?(uno?或其他?)感恩!

  5. 老師您好:
    我根據您書上第十四章連接藍芽晶片與LED燈,當NOTEBOOK(Win10版本)找到藍芽時,顯示COM4連出,COM5連入,
    接著開啟AccessPort時,我 串口設定試過COM4,COM5,但都不能讓LED亮,也沒有顯示”BT is ready”請問這是什麼原因呢?

  6. 老師您好~
    您的書寫的真好,我受益良多。

    在這小弟有問題請教
    我根據書中16-7
    我上傳diy16_02.ino檔後
    我的網頁出現亂碼
    �o�O�L�����������C
    此外,我發現光碟提供的程式碼跟書中有多出char *, bool)。
    void defaultCmd(WebServer &server, WebServer::ConnectionType type, char *, bool)
    麻煩老師解惑~
    這是我網站的截圖:https://ppt.cc/fOChvx

    1. hi nelson:

      請確認一下你的瀏覽器的網頁編碼是否為UTF-8,
      函式定義後面的這兩個參數:char *, bool
      僅列出參數的類型char和bool,代表函式不接收這兩個參數。

      只有在接收與解析GET參數時,才會用到這兩個參數,
      如16-31頁的第一行程式碼。

      thanks,
      jeffrey

  7. 老師您好~
    這是我的程式碼:
    P(homePage) =
    “”
    “”
    “”
    “Arduino微網站”
    “”
    “這是微網站的首頁。”
    “”;

    麻煩老師過目

    1. 應該跟我的一樣吧…文字編碼指定UTF-8。

      P(homePage) = 
          "<!doctype html>"
          "<html><head><meta charset=\"utf-8\" />"
          "<title>Arduino微網站</title>"
          "</head><body>"
          "這是微網站的首頁。"
          "</body></html>";
      

      thanks,
      jeffrey

    2. 老師您好~
      我確認過程式碼了是正確的,但一樣出現亂碼。
      我用Chrome 或 IE處理器打開都發現一樣的結果…

      我複製了相同的程式碼,打了一份html檔,他就沒有出現亂碼。
      動手做15-2我用UTF-8也成功。

      不知道是否與Webserver.h的內建程式有關?
      有勞老師了~~

  8. 趙老師您好:敝人有購買第2版,但在燒錄到其他MCU的部分著墨較少,雖然也在網路上查詢許多資料,但敝人最近在這部分遇到很困擾的問題,原本燒錄於ATtiny85的程式,均可正常運作,但是燒錄於ATtiny44時,相對應的腳位號碼也已經在程式中修改好,卻無法像ATtiny85那樣運作正常,試了2天了,實在不知道是哪裡出了問題?照理說,這2個MCU應該沒有太大差異才是?

    1. 我手邊沒有ATtiny44,大致比對了一下ATtiny85ATtiny44的技術文件,我猜想你是因為需要更多控制腳位才改用ATtiny44。
      它們兩個是不同系列,記憶體容量也差了一倍,若排除這些條件,假如連閃爍LED之類的程式都無法正常運作的話…
      拍謝,我也不知道問題出在哪…

      thanks,
      jeffrey

    2. 謝謝老師的回覆!
      其實Blink是可以正常工作的,記憶體的部分,燒錄時軟體並沒有反應,也都可以順利燒進去,但是有可能燒錄時沒問題,但是實際執行程式的時候卻記憶體不足嗎?下面是燒錄時的記憶體訊息:

      草稿碼使用了 2710 bytes (66%) 的程式儲存空間。上限為 4096 bytes。
      全域變數使用了 46 bytes (17%) 的動態記憶體,剩餘 210 bytes 給區域變數。上限為 256 bytes 。

      或者買一顆ATtiny84回來用看看?

      附帶一提:
      在網路上查到的ATtiny44應對於Arduino的腳位很奇怪,有二種配置,腳位編號不同,也是我疑惑的原因之一。

    3. 從記憶體的訊息看來是OK的,大概只能從序列埠輸出訊息檢測運作狀態了。

      thanks,
      jeffrey

    4. 光老師的書就幫很大的忙了,讓我從程式門外漢,慢慢進入有趣的程式領域,但這問題實在太讓我苦惱了,所以只好上來求助老師,真不好意思讓老師花時間了…後面測試結果,再更新給老師知道。

  9. 趙老師,
    請問此本書2或3版的英文版是否已經出版,我想要買英文版,相對應的英文書名為何?作者名?以方便買對書。

    1. 本書英文版已經由Arduino S.R.L公司(arduino.org)創辦人Federico Musto先生新創的What’s Next公司在義大利出版,連同書本所有DIY實驗的零組件,以及兩個Arduino控制板(Uno和Uno Wi-Fi)一起販售,商品名稱是yellow D.I.Y. kit。英文版共610頁,沒有中文版的附錄A~H。

      thanks,
      jeffrey

  10. 趙老師 ~ 想請教一個問題
    我有個100顆的LED燈條(WS2812B),用ARDUINO UNO +5V作為電源,燈光會閃爍,於是我用兩顆18650串聯然後用降壓模組將他降壓到5V作為燈條的電源,可是卻發現燈條的燈光比用UNO板子還不穩定,燈條的LED顏色亂跑,這會是甚麼原因呢? 18650的電流不是更充足嗎? 另外,我有用MP3模組(DFPlayer Mini),用ARDUINO UNO供電可以正常跑,用18650串聯降壓供電也是發生異常,請問會是電流的問題嗎?

    1. 是電流不足的原因,建議使用5V/3A或更高的電源供應器供電給燈條。

      thanks,
      jeffrey

  11. 趙老師你好
    很喜歡超圖解Arduino這本書
    解釋的非常詳盡又涵括所有必要的電子電路與程式設計概念
    真的是最適合我們這種初學者的一本書
    讓我收穫無窮

    關於書的內文
    有一個小地方想要請教老師 希望不會太擔誤時間

    在2018年9月出版的三版10刷繁體中文版本裡, P5-23頁
    上方的藍色框框裡寫道

    關於這行,
    想請教這個時候是想透過序列埠監控視窗傳送資料給Arduino,
    或是想透過Arduino經由數位1(Arduino Tx)傳送資料?
    若是前者, 那這行是否應該改成

    較為恰當呢?

    一點小小意見
    不知道是否正確
    還請老師不吝指教

    1. 拍謝,你的訊息裡面可能包含HTML標籤,所以重點部份被留言系統過濾掉了。
      如果要在此輸入HTML標籤,請將小於和大於符號分別改成這兩個編碼:
      &lt; 和 &gt;

      thanks,
      jeffrey

    2. 老師好,
      我修改一下尖括號再重貼一次
      ====
      關於這行,
      “”” 假若選擇”NL”,那麼當Arduino送出”1″時,實際傳送的資料… “””
      想請教這個時候是想透過序列埠監控視窗傳送資料給Arduino,
      或是想透過Arduino經由數位1(Arduino Tx)傳送資料?
      若是前者, 那這行是否應該改成
      “”” 假若選擇”NL”,那麼當送出”1″給Arduino時,實際傳送的資料… “””
      較為恰當呢?

    3. 非常感謝gene的糾錯~「假若選擇”NL”,那麼當送出”1″給Arduino時,實際傳送的資料…」的說法才是對的。

      thanks,
      jeffrey

  12. 老師好,
    請問書內有zigbee相關的實作嗎?
    找了很多書都沒有zigbee,
    網路上幾乎都是XBee相關,需安裝其他軟體,想要單純zigbee模組相關
    還請老師不吝指教

    1. 沒有ZigBee的相關實作,因為對大多數的自造者來說,ZigBee沒有價格優勢。
      一塊Arduino的Wi-Fi擴展板最初要價台幣上千元,ESP8266問世之後,價格降到台幣100多元,而且內建微控制器。
      Wi-Fi和藍牙也新增了mesh通訊標準,相形之下,ZigBee又少了一項優勢。

      我在三年前有寫幾篇ZigBee的文章,提供你參考。

      thanks,
      jeffrey

  13. 請問老師︰第 2-11頁中的電阻色環的誤差率之值,金色與銀色的數值是否誤植(相反)?

  14. 趙老師您好,想請教您 我是否能把手機的電量資料傳送至arduino上,進而控制led燈的亮和暗,如果可以,想請問您該從何開始著手和大概的方法是如何。非常謝謝您!

    1. 軟體程式方面,你需要撰寫手機App和Arduino兩方的程式。

      手機App有多種開發工具和程式語言可選,以JavaScript語言的Cordova為例,它的battery status(電量狀態)外掛,可傳回0~100的電量整數值。

      取得電量數值後,可透過手機的序列埠、藍牙或Wi-Fi等介面,傳遞給Arduino控制板。

      thanks,
      jeffrey

  15. 請問老師
    關於跑馬燈範例程式(二)使用for迴圈
    若要改成若要改成來回循環的跑馬燈的話,要如何修改增加程式?
    PS.外面網路範例程式都是用兩個for迴圈,兩個變數加加減減,就能來回無窮迴圈。
    書本上的範例程式,我卡在else,只能來回一次就不亮了…

    我修改程式如下:
    // 跑馬燈範例程式二
    // 詳細的程式說明,請參閱第四章,4-24頁。

    const byte startPin = 6; // 宣告儲存起始腳位的常數
    const byte endPin = 13; // 宣告儲存結束腳位的常數
    byte lightPin = startPin; // 儲存目前點亮的腳位的變數
    byte rightPin = endPin; // 自己增加目前點亮的腳位的變數
    void setup() {
    for (byte i = startPin; i <= endPin; i++) {
    pinMode(i, OUTPUT);
    digitalWrite(i, HIGH);
    delay(100);
    }
    }
    void loop() {
    for (byte i = startPin; i <= endPin ; i++) {
    digitalWrite(i, HIGH);
    }
    digitalWrite(lightPin, LOW);
    if (lightPin = startPin; j–) {
    digitalWrite(j, HIGH);
    }
    digitalWrite(rightPin, LOW);
    if (rightPin >= startPin) {
    rightPin –;
    }
    else {
    lightPin = startPin;
    }
    }
    delay(100);
    }

    1. 這是改自DIY 4-4的第一種寫法,用兩個獨立的for迴圈:

      const byte LEDs[] = {8,9,10,11,12};
      const byte total = sizeof(LEDs);
      
      void setup() {
        for (byte i=0; i<total; i++) {
          pinMode(LEDs[i], OUTPUT);
          digitalWrite(LEDs[i], LOW);
        }
      }
      
      void loop() {  
        for (byte i=0; i<total; i++){    // LED從左往右移動
          digitalWrite(LEDs[i], HIGH);
          delay(100);
          digitalWrite(LEDs[i], LOW);
        }
        for (byte i=total-1; i>0; i-=1){   // LED從右往左移動
          digitalWrite(LEDs[i], HIGH); 
          delay(100);
          digitalWrite(LEDs[i], LOW);
        }
      }
      

      第二種寫法,不需要for迴圈。
      用一個變數(index)儲存每次的累加數字:1或-1
      int8_t資料類型相當於char,其值介於-127~128

      const byte LEDs[] = {8,9,10,11,12};
      const byte total = sizeof(LEDs);
      int8_t index = 1;  // 儲存正、負1
      byte i = 0;
      
      void setup() {
        for (byte i=0; i<total; i++) {
          pinMode(LEDs[i], OUTPUT);
          digitalWrite(LEDs[i], LOW);
        }
      }
      
      void loop() {
        digitalWrite(LEDs[i], HIGH);
        delay(100);
        digitalWrite(LEDs[i], LOW);
      
        i += index;
        
        if (i < 0 || i >= total) {
            index *= -1;   // 原本的1變成-1
            i += (index*2);  // 或者:i += index;
        }
      }
      

      thanks,
      jeffrey

  16. 作者您好:
    最近依照書中的紅外線發射raw格式的方式實作(page 12-16), 發現無法成功.
    後來發現不需刪除第一個數字.我使用IRremote的dump範例程式來印出數到的紅外線raw格式,
    看一下他印出的方式會跳過第0個,程式片段如下:
    for (int i = 1; i rawbuf[i]*USECPERTICK, DEC);
    }
    else {
    Serial.write(‘-‘);
    Serial.print((unsigned long) results->rawbuf[i]*USECPERTICK, DEC);
    }
    Serial.print(” “);
    }
    不知是不是程式庫版本的問題?

  17. 趙老師好

    上次留言回覆內容讓我受益良多,我自己改良做出RGB LED跑馬燈的程式,每來回一次換顏色。
    下次再改中斷計時看看。

    我的問題是第八章用MAX7219控制矩陣圖像,我想要改成七段顯示器做計數器功能。
    我改出來了…但無法理解程式是什麼進位?若把八位數分成兩個四位數獨立或同時計數。

    // 動手做8-7:在7段顯示器顯示數字
    // 詳細的程式說明,請參閱第八章,8-23頁。

    #include // 引用 SPI 程式庫

    byte symbol[16] = {
    B01111110, // 0
    B00110000, // 1
    B01101101, // 2
    B01111001, // 3
    B00110011, // 4
    B01011011, // 5
    B01011111, // 6
    B01110000, // 7
    B01111111, // 8
    B01111011, // 9
    B01110111, // A
    B00011111, // b
    B01001110, // C
    B00111101, // d
    B01001111, // E
    B01000111 // F
    };
    unsigned int counter = 0;
    unsigned int digit_base = 10;

    // 定義 MAX7219 暫存器
    const byte NOOP = 0x00; // 不運作
    const byte DECODEMODE = 0x09; // 解碼模式
    const byte INTENSITY = 0x0A; // 顯示強度
    const byte SCANLIMIT = 0x0B; // 掃描限制
    const byte SHUTDOWN = 0x0C; // 停機
    const byte DISPLAYTEST = 0x0F; // 顯示器檢測

    #define NUM_OF_DIGITS (8)
    #define MAX7219_DIGIT_REG(pos) ((pos) + 1)

    // 設定 MAX7219 暫存器資料的自訂函數
    void max7219(byte reg, byte data) {
    digitalWrite (SS, LOW);
    SPI.transfer (reg);
    SPI.transfer (data);
    digitalWrite (SS, HIGH);
    }

    void setup () {
    pinMode(SS, OUTPUT); // 將預設的 SS 腳(數位 10)設成「輸出」
    digitalWrite(SS, HIGH); // 先在 SS 腳輸出高電位
    //(代表「尚不選取周邊」)
    SPI.begin (); // 啟動 SPI 連線
    Serial.begin(9600);
    max7219 (SCANLIMIT, 7); // 設定掃描 8 行
    max7219 (DECODEMODE, 0); // 不使用 BCD 解碼
    max7219 (INTENSITY, 8); // 設定成中等亮度
    max7219 (DISPLAYTEST, 0);// 關閉顯示器測試
    max7219 (SHUTDOWN, 1); // 關閉停機模式(亦即,「開機」)

    // 清除顯示畫面(LED 矩陣中的八行都設定成 0)
    for (byte i = 0; i < 8; i++) {
    max7219 (i + 1, symbol[0]);
    }
    }

    void loop () {

    int i;
    unsigned int number;
    unsigned int digit_value;
    byte byte_data;

    number = counter++;

    // turn off display first
    max7219 (SHUTDOWN, 0);

    for ( i = 0; i < NUM_OF_DIGITS; i++) {
    digit_value = number % digit_base;
    number /= digit_base;

    max7219 (MAX7219_DIGIT_REG(i) , symbol[digit_value]);
    }
    max7219 (SHUTDOWN, 1);
    delay(10);
    }

    1. 趙老師好
      我已經寫出來了…再增加變數宣告,多一個FOR迴圈,這樣就能有兩個四位數計數時間。
      功能:高位元增加計數,低位元倒數。
      不知趙老師有更好的語法?
      謝謝~~

      #include // 引用 SPI 程式庫

      byte symbol[16] = {
      B01111110, // 0
      B00110000, // 1
      B01101101, // 2
      B01111001, // 3
      B00110011, // 4
      B01011011, // 5
      B01011111, // 6
      B01110000, // 7
      B01111111, // 8
      B01111011, // 9
      B01110111, // A
      B00011111, // b
      B01001110, // C
      B00111101, // d
      B01001111, // E
      B01000111 // F
      };
      unsigned int counter = 60;
      unsigned int counter1 = 0;
      unsigned int digit_base = 10;

      // 定義 MAX7219 暫存器
      const byte NOOP = 0x00; // 不運作
      const byte DECODEMODE = 0x09; // 解碼模式
      const byte INTENSITY = 0x0A; // 顯示強度
      const byte SCANLIMIT = 0x0B; // 掃描限制
      const byte SHUTDOWN = 0x0C; // 停機
      const byte DISPLAYTEST = 0xF; // 顯示器檢測

      //#define DP_FLAG (B10000000)
      #define NUM_OF_DIGITS (8)
      #define MAX7219_DIGIT_REG(pos) ((pos) + 1)

      // 設定 MAX7219 暫存器資料的自訂函數
      void max7219(byte reg, byte data) {
      digitalWrite (SS, LOW);
      SPI.transfer (reg);
      SPI.transfer (data);
      digitalWrite (SS, HIGH);
      }

      void setup () {
      pinMode(SS, OUTPUT); // 將預設的 SS 腳(數位 10)設成「輸出」
      digitalWrite(SS, HIGH); // 先在 SS 腳輸出高電位
      //(代表「尚不選取周邊」)
      SPI.begin (); // 啟動 SPI 連線
      max7219 (SCANLIMIT, 7); // 設定掃描 8 行
      max7219 (DECODEMODE, 0); // 不使用 BCD 解碼
      max7219 (INTENSITY, 8); // 設定成中等亮度
      max7219 (DISPLAYTEST, 0);// 關閉顯示器測試
      max7219 (SHUTDOWN, 1); // 關閉停機模式(亦即,「開機」)

      // 清除顯示畫面(LED 矩陣中的八行都設定成 0)
      for (byte i = 0; i < 8; i++) {
      max7219 (i + 1, symbol[0]);
      }
      }

      void loop ()
      {
      int i;
      unsigned int number;
      unsigned int number1;
      unsigned int digit_value;
      unsigned int digit_value1;

      number = counter–;
      if (counter + 1 60) {
      counter1 = 0;
      }

      // turn off display first
      max7219 (SHUTDOWN, 0);

      for ( i = 0; i < NUM_OF_DIGITS; i++) {
      digit_value = number % digit_base;
      number /= digit_base;
      max7219 (MAX7219_DIGIT_REG(i) , symbol[digit_value]);

      }
      for ( i = 4; i < NUM_OF_DIGITS; i++) {

      digit_value1 = number1 % digit_base;
      number1 /= digit_base;
      max7219 (MAX7219_DIGIT_REG(i) , symbol[digit_value1]);
      }

      max7219 (SHUTDOWN, 1);
      delay(1000);
      }

  18. 赵老师,你好,我是大陆的读者,购买的是您第二版的书,在第16章里使用您光盘里的16_1的程序编译时确实通不过,后来翻阅您网站前面的留言发现也有大陆的朋友碰到了相同的问题,所以使用了您在留言里提供的Webduino库后,顺利编译成功,可能是附带光盘里的库文件有些问题。
    关于赵老师的超图解Python系列图书,是否有计划在大陆出版简体呢?必竟繁体版由于语言习惯及名称的不同,学习起来还是不太方便,期待您的新作能在中国大陆地区出版。

    1. 感谢告知!八月初我有收到中国水利水电出版社 智博尚书分社杨编辑的来信,洽询《超图解Python程式设计入门》简体版授权。但因为该书部份内容所涉及的云端服务,例如LINE通信、Google试算表和云盘以及YouTube,都被和谐了,简体版势必要大幅改写,所以我并没有打算授权简体中文版。

      预祝圣诞快乐!
      jeffrey

  19. 赵老师,我是您大陆的读者。我在使用光盘提供的16-4从浏览器控制远端的灯光开关的程序时,Arduino上的连接的LED灯默认状态下是亮的,在选择“关”后点“送出”按钮,LED灯只是瞬间闪了一下还是处于长亮状态,您的程序没有进行任何修改,LED连接的端口和程序里设置的一致,我使用的是IDE 1.8.9版,请老师帮忙解惑!谢谢!

    1. 请在接收POST数据的postCmd函数中,加入类似底下的代码,让Uno板在串口监视器输出接收到的值,看看是否符合预期:

      Serial.println(String("data: ") + value);
      

      thanks,
      jeffrey

    2. void post(WebServer &server,WebServer::ConnectionType type,char *,bool)
      { char name[16],value[16];
      server.httpSuccess();
      if(type==WebServer::POST)
      {
      while(server.readPOSTparam(name,16,value,16))
      {
      if (strcmp(name,”msg”)==0)
      {server<<"”<<value<<"”;}
      if(strcmp(name,”light”)==0)
      {
      server<<"灯光已经”;
      if(strcmp(value,”ON”)==0)
      {
      server<<"打开”;
      digitalWrite(13,1);
      Serial.println(String(“data:”)+value);
      }else{
      server<<"关闭”;
      digitalWrite(13,0);
      Serial.println(String(“data:”)+value);
      }
      }
      }
      }
      }

      赵老师,上面是我修改过的的post函数,我分别在LED灯打开和关闭两段语句里增加了您提供的程序,通过串口查看器可以看到显示的Value值和我的预期一致。当我点“开”,Value值在串口查看器中显示”data:ON”,当我点”关”,Value值在串口查看器中显示”data:OFF”,但无论是开还是关,LED灯只会瞬间闪一下后仍然长亮。

    3. 奇怪了…从串口的信息看来,解析POST数据的程序运行无误,请检查一下代码还有什么地方控制第8脚的LED输出?

      thanks,
      jeffrey

  20. 赵老师您好:
    在《Arduino互动设计入门》动手做16-3″建立接收POST表单数据的自定义命令”的例子中关于
    char name[16],value[16];
    server.readPOSTparam(name,16,value,16)
    的具体含义和参数使用方法能讲的具体一些吗?特别是有多个内容传递过来的时候是如何存储的?比如传递过来的有单选项和文本框,我该如何去调用传递过来的内容呢?

    下面是我写的程序,form里是单选项、文本框、按钮,选择单选项后,确定文本框输入的信息是否正确,给出相应的回复,经过测试发现,程序仅能对单选项进行判断后就停止了,不会进行接下来的文本框判断,还请赵老师在百忙之中帮忙查阅,谢谢!祝您圣诞快乐!
    程序如下:
    #include
    #include
    #include
    #include
    #include
    static byte mac[] = { 0xF0, 0x7B, 0xCB, 0x4B, 0x7C, 0x9F };
    IPAddress ip(192, 168, 101, 66);
    IPAddress subnet(255, 255, 255, 0);
    IPAddress gateway(192, 168, 101, 1);
    WebServer webserver(“”, 80);
    Servo servo;

    P(htmlHead) =
    “”
    “”
    “列车座位认证管理系统”
    “” ;

    P(htmlForm)= “”
    “欢迎使用列车座位认证管理系统”
    “请输入您的车票编号(左上角红色编号)或身份证号(或护照号)”
    “请选择编号类型:身份证”
    “车票编号”
    “编号:”
    “”
    “”;

    P(htmlFoot)=””;

    void defaultCmd(WebServer &server,WebServer::ConnectionType type,char *,bool)
    {
    server.httpSuccess();
    if(type!=WebServer::HEAD)
    {
    server.printP(htmlHead);
    server.printP(htmlForm);
    server.printP(htmlFoot);
    }
    }

    void postCmd(WebServer &server,WebServer::ConnectionType type,char *,bool)
    {
    char name[18],value[18];
    server.httpSuccess();
    server.printP(htmlHead);

    while(server.readPOSTparam(name,18,value,18)){
    if (strcmp(name,”style”)==0){
    if(strcmp(value,”CNcode”)==0){
    if(strcmp(name,”msg”)==0){//程序到这里就不走了
    if(strcmp(value,”410104198003160514″)==0){
    server<<"欢迎您乘座本次列车,座椅将在10秒钟后自动为您打开,请确保座椅附近无任何障碍物,以防夹伤!”;
    delay(1000);
    servo.write(90);
    }else{
    server<<"对不起,您的信息有误,请返回上一页重新填写,或联系乘务员予以解决”;
    }
    }
    }else{;
    if(strcmp(name,”msg”)==0){//程序到这里就不走了
    if(strcmp(value,”000316″)==0){
    server<<"欢迎您乘座本次列车,座椅将在10秒钟后自动为您打开,请确保座椅附近无任何障碍物,以防夹伤!”;
    delay(1000);
    servo.write(90);
    }else{
    server<<"对不起,您的信息有误,请返回上一页重新填写,或联系乘务员予以解决”;
    }
    }
    }
    }
    }
    server.printP(htmlFoot);
    }
    void setup() {
    // put your setup code here, to run once:
    Ethernet.begin(mac, ip, gateway, subnet);
    webserver.setDefaultCommand(&defaultCmd); // 处理「首页」请求
    webserver.addCommand(“sw”, &postCmd); // 处理「sw表单处理页面」请求
    // webserver.addCommand(“form.html”, &formCmd); // 处理「表单页面」请求
    webserver.begin();
    servo.attach(8);

    }

    void loop() {
    // put your main code here, to run repeatedly:
    webserver.processConnection();
    }

    1. Arduino是微电脑控制板,只适合传送物联网设备的少量数据,从你的网页表单的需求看来,请改用电脑的服务器。

      thanks,
      jeffrey

  21. 赵老师:
    您好!
    《超图解Arduino互动设计入门》第2版中讲述的Webduino扩展库目前除了可以用于W5100Ethernet扩展卡外,是否还能支持其它型号的扩展卡?
    目前通过学习了Webduino扩展库写了一个完整的小程序并在W5100卡上调试通过,但由于W5100是有线网卡使用起来不太方便,想请教赵老师有没有其它型号的无线网卡也可以使用Webduino扩展库,这样我的程序就不用过多的修改了。
    谢谢!

    1. Wi-Fi无线网卡我目前都使用ESP8266,它有自己的扩展库,例如,连接无线网络的ESP8266WiFi.h、建立Web服務器的ESP8266WebServer.h以及扮演前台的ESP8266HTTPClient.h。他们的指令和Webduino不太一样,所以要自行改写程序。

      thanks,
      jeffrey

  22. 趙老師您好
    我有拜讀老師的 入門設計互動,想請教一個問題,
    我的水質感應器是4~20mA輸出的訊號,
    要如何接到Arduino顯示訊號狀態?
    只有類比訊號輸入電壓,該怎麼接呢?加250歐姆電阻?
    有範例程式嗎?
    謝謝!

    1. 我猜想你指的是20mV電壓,如果是的話,因為訊號電壓太弱,可採用第六章介紹的運算放大器處理。拍謝,我沒用過這類型感測器。

      thanks,
      jeffrey

  23. 趙老師,您好
    請問如果我要燒錄程式碼到麵包板Arduino,
    但是USB to TTL的轉接線沒有DTR腳,
    可以直接在按下上傳按鈕後馬上把RESET腳接地來達到效果嗎?
    謝謝!

  24. 趙老師,您好
    我還有個問題想請教,
    所謂的開始上傳指的是按下上傳按鈕後?
    還是按下上傳按鈕且編譯完之後?
    感謝!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top