Может ли библиотека Arduino LiquidCrystal мешать работе библиотеки Wi-Fi?

Однажды я баловался со своим Arduino, и мне пришла в голову крутая идея. Может быть, я мог бы сделать беспроводное соединение БЕЗ последовательного монитора! Вместо этого я мог бы использовать ЖК-дисплей! Итак, я пошел на работу. Я заменил все серийные номера на жидкокристаллические.

Наконец у меня не было ошибок в моем коде (согласно клиенту Arduino, то есть).

Вот мой код:

#include <LiquidCrystal.h>
#include <WiFi.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

char ssid[] = "Fake Network";                    // Your network SSID (name)
char key[] = "1";       // your network key
int keyIndex = 0;                                // Your network key Index number
int status = WL_IDLE_STATUS;                     // The Wi-Fi radio's status

void setup() {

    lcd.begin(16, 2);

    // Check for the presence of the shield:
    if (WiFi.status() == WL_NO_SHIELD) {
        lcd.println("WiFi shield not present");
        // Don't continue:
        while(true);
    }

    // Attempt to connect to Wi-Fi network:
    while ( status != WL_CONNECTED) {
        lcd.print("Attempting to connect to WEP network, SSID: ");
        lcd.println(ssid);
        status = WiFi.begin(ssid, keyIndex, key);

        // Wait 10 seconds for connection:
        delay(10000);
    }

    // Once you are connected:
    lcd.print("You're connected to the network");
    printCurrentNet();
    printWifiData();
}

void loop() {
    // Check the network connection once every 10 seconds:
    delay(10000);
    printCurrentNet();
}

void printWifiData() {
  // Print your Wi-Fi shield's IP address:
  IPAddress IPaddr = WiFi.localIP();
  lcd.print("IP Address: ");
  lcd.println(IPaddr);
  lcd.println(IPaddr);

  // Print your MAC address:
  byte MACaddr[6];
  WiFi.macAddress(MACaddr);
  lcd.print("MAC address: ");
  lcd.print(MACaddr[5],HEX);
  lcd.print(":");
  lcd.print(MACaddr[4],HEX);
  lcd.print(":");
  lcd.print(MACaddr[3],HEX);
  lcd.print(":");
  lcd.print(MACaddr[2],HEX);
  lcd.print(":");
  lcd.print(MACaddr[1],HEX);
  lcd.print(":");
  lcd.println(MACaddr[0],HEX);
}

void printCurrentNet() {
    // Print the SSID of the network you're attached to:
    lcd.print("SSID: ");
    lcd.println(WiFi.SSID());

    // Print the MAC address of the router you're attached to:
    byte bssid[6];
    WiFi.BSSID(bssid);
    lcd.print("BSSID: ");
    lcd.print(bssid[5],HEX);
    lcd.print(":");
    lcd.print(bssid[4],HEX);
    lcd.print(":");
    lcd.print(bssid[3],HEX);
    lcd.print(":");
    lcd.print(bssid[2],HEX);
    lcd.print(":");
    lcd.print(bssid[1],HEX);
    lcd.print(":");
    lcd.println(bssid[0],HEX);

    // Print the received signal strength:
    long rssi = WiFi.RSSI();
    lcd.print("signal strength (RSSI):");
    lcd.println(rssi);

    // Print the encryption type:
    byte encryption = WiFi.encryptionType();
    lcd.print("Encryption Type:");
    lcd.println(encryption,HEX);
    lcd.println();
}

И в результате... ничего. Ничего не отображается.

Затем я пошел и сделал свою версию отладки. Обратите внимание, что я начал с нижней части кода.

lcd.print("bug");

Я помещаю это под каждой строкой моего кода. Наконец я добрался до самого верха, под этой строкой:

lcd.begin(16, 2);

И УГАДАЙТЕ, ЧТО! Нет отображения ни в одной из строк! Я посмотрел везде, и я проверил контакты дисплея.

НАКОНЕЦ-ТО я нашел проблему!

Это ужасная ошибка, от которой я не могу избавиться! Дисплей не будет отображаться с библиотекой WiFi.h! Я не знаю почему, но если я даже #include <WiFi.h> зайду в свою программу (или любую программу с библиотекой LiquidCrystal... Все будет точно так же!

В чем причина этой проблемы и как ее исправить? Мне пока не повезло.


person Jake L.    schedule 14.03.2013    source источник
comment
Кажется, этот парень работает нормально: bradsduino. blogspot.com/2012/10/   -  person Pete    schedule 15.03.2013


Ответы (1)


Согласно документации:

Arduino взаимодействует как с процессором экрана Wi-Fi, так и с SD-картой, используя шину SPI (через заголовок ICSP). Это цифровые контакты 11, 12 и 13 на Uno и контакты 50, 51 и 52 на Mega. На Uno 11 это MOSI, а 12 это MISO.

По вашему коду

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

вы используете контакты 11 и 12 для ЖК-дисплея. Теперь, если ЖК-дисплей использует SPI, тогда ЖК-дисплей может использовать контакты 11 и 12 с Wi-Fi экран, потому что тот же набор контактов, что и для функции SS (Slave Select), сообщает периферийным устройствам, какое из них должно прослушиваться. Однако библиотека LiquidCrystal использует первые два вывода аргументов для RS и Enable соответственно, что делает ее несовместимой с SPI. Решение: переместите ЖК-дисплей на другие контакты.

person angelatlarge    schedule 14.03.2013
comment
Спасибо! Пит дал ссылку, подтверждающую эту концепцию! Я это попробую! - person Jake L.; 15.03.2013