Ошибки при компиляции

Тема в разделе "Arduino & Shields", создана пользователем blackcatw, 22 май 2016.

  1. blackcatw

    blackcatw Нерд

    День добрый.
    Установил новый IDE и в него старые дополнения от старого экземпляра добавил. Диск у меня слетал и я систему поставил на SSD а тот остался. И на нём вся старая инфа.
    Взял готовый скетч
    Код (C++):
    #include <OneWire.h>
    #include <EtherCard.h>

    // настройки Ethernet

    #define BUF_SIZE 512

    byte mac[] = { 0x00, 0x04, 0xA3, 0x21, 0xCA, 0x38 }; // MAC-адрес

    byte fixed = false; // =false: пробовать получить адрес по DHCP,
                       //         в случае неудачи использовать статический;
                       // =true:  сразу использовать статический

    uint8_t ip[] = { 169, 254, 8, 200 };     // Статический IP-адрес
    uint8_t subnet[] = { 255, 255, 0, 0 };   // Маска подсети
    uint8_t gateway[] = { 192, 168, 1, 20 }; // Адрес шлюза
    uint8_t dns[] = { 192, 168, 1, 20 };     // Адрес DNS-сервера (необязателен)

    byte Ethernet::buffer[BUF_SIZE];
    static BufferFiller bfill;  // used as cursor while filling the buffer

    // настройки OneWire

    #define DS18B20PIN  9
    OneWire ds(DS18B20PIN);

    // команды DS18B20

    void setConversionTime(byte conf) {
      ds.reset();
      ds.skip(); // skip ROM
      ds.write(0x4E); // write scratchpad
      ds.write(0); // Th
      ds.write(0); // Tl
      ds.write(conf); // configuration
    }

    void startConversionAll() {
      ds.reset();
      ds.skip(); // skip ROM
      ds.write(0x44,0); // start conversion
      delay(10);
    }

    void setup(void)
    {
        Serial.begin(57600);
        delay(2000);

        /* Проверяем, что контроллер Ethernet доступен для работы */
        Serial.println("Initialising the Ethernet controller");
        if (ether.begin(sizeof Ethernet::buffer, mac, 10) == 0) {
            Serial.println( "Ethernet controller NOT initialised");
            while (true);
        }

        // Пытаемся получить адрес динамически
        Serial.println("Attempting to get an IP address using DHCP");
        if (ether.dhcpSetup()) {
            ether.printIp("Got an IP address using DHCP: ", ether.myip);
        } else {
            // Если DHCP не доступен, используем статический ip-адрес
            ether.staticSetup(ip, gateway, dns);
            ether.printIp("DHCP FAILED, using fixed address: ", ether.myip);
            fixed = true;
        }
    }

    char okHeader[] PROGMEM =
      "HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\n"
      "Pragma: no-cache\r\n"
    ;

    char authorLink[] PROGMEM =
      "</pre><hr>Read about me <a href=\"<a href="">http://mk90.blogspot.com\</a>" target=\"_blank\">here</a>"
    ;

    static void homePage (BufferFiller& buf) {
     
      buf.emit_p(PSTR("$F\r\n"
        "<title>Arduino web-thermometr</title>"
        "<h2>DS18B20 Network:</h2>"
        "<pre>"), okHeader);
     
      byte counter = 0;
      byte addr[8];
      byte data[12];
     
      setConversionTime(0x7F); // установить 9-битное разрешение
      startConversionAll(); // запустить конвертацию температуры
      delay(100); // на конвертацию 9-битного значения требуется 93,75 мс
     
      // ищем устройства и выводим результаты
      ds.reset_search();
      delay(250);
      while (ds.search(addr)) {
        buf.emit_p(PSTR("$D: "),++counter);
        if ( OneWire::crc8(addr, 7) != addr[7]) {
          buf.emit_p(PSTR("- address CRC is not valid!\n"));
          continue;
        } else if (addr[0] != 0x28) {
          buf.emit_p(PSTR("- is not a DS18B20 family device!\n"));
          continue;
        }
        ds.reset();
        ds.select(addr);
        ds.write(0xBE); // читать scratchpad
        for (byte k=0; k<9; k++) {  // нам потребуется 9 байт
          data[k] = ds.read();
        }    
        if ( OneWire::crc8( data, 8) != data[8]) {
          buf.emit_p(PSTR("- value CRC is not valid!\n"));
          continue;
        }
        buf.emit_p(PSTR(" $D.$D °C\n"), *(int *)data/16, (int) (abs(*(int *)data % 16) * 0.625));
      }
      buf.emit_p(PSTR("\nTotal: $D devices."), counter);
      buf.emit_p(authorLink);
    }


    void loop(void)
    {
      word len = ether.packetReceive();
      word pos = ether.packetLoop(len);
      if (pos) {
        bfill = ether.tcpOffset();
        char* data = (char *) Ethernet::buffer + pos;
        Serial.println(data); // распечатываем запрос для отладки
       
        if (strncmp("GET / ", data, 6) == 0)
          homePage(bfill);
        else
          bfill.emit_p(PSTR(
            "HTTP/1.0 401 Unauthorized\r\n"
            "Content-Type: text/html\r\n"
            "\r\n"
            "<h1>401 Unauthorized</h1>"));
           
        // отправить ответ клиенту
        ether.httpServerReply(bfill.position());
      }
    }
    Решил его скомпелировать. А там выдаются ошибки:
    Никак не пойму что где нужно исправить или обновить. Уже вроде все дополнения обновил.
    И ещё, в домашней папке создаётся каталог "./arduino15". И вот пока этот каталог принудительно не удалить, выдаётся ошибка "Ваша копия IDE установленно в подпапку вашей папки со скетчами. Пожалуйста переместите IDE в другую папку".

    И что делать, ума не прилажу. Уже всё что мог куда мог перенёс. И там где у меня мои наработки, находятся вне каталога с IDE.
     
  2. ZAZ-965

    ZAZ-965 Гуру

    Для использования модификатора переменной PROGMEM надо подключить #include <avr/pgmspace.h>, ну и переменные okHeader, authorLink, homePage объявить константными.
     
  3. blackcatw

    blackcatw Нерд

    Я правильно понимаю, нужно в самом скетче добавить строчку:
    #include <avr/pgmspace.h>,
    ?
    И переменные, где как константы объявить? В начале скетча? И просто их сделать строковыми текстовыми константами?
     
  4. ZAZ-965

    ZAZ-965 Гуру

    Верно.
    Добавить const при объявлении переменной
    Код (C++):
    const char okHeader[] PROGMEM =
    const char authorLink[] PROGMEM =
     
  5. blackcatw

    blackcatw Нерд

    Понятно.
    А по ошибке
    "Ваша копия IDE установленно в подпапку вашей папки со скетчами. Пожалуйста переместите IDE в другую папку".
    и созданию папки в домашнем каталоге? ("./arduino15") Ничего не подскажите?
     
  6. ZAZ-965

    ZAZ-965 Гуру

    Не знаю, под Linux Arduino не ставил.
     
  7. blackcatw

    blackcatw Нерд

    скетч скомпилировался.