Метеостанция 2.1 + чайник начинающий

zztop1967
Offline
Зарегистрирован: 02.01.2017

Добрый день!

Всех с Новым 2017 годом!

Не пинайте сильно ногами.

Пробовал найти ветку для самых\свмых новичков - видимо плохо искал.

Ситуация следующая:

Метеостанция 2.1 
Открыл скетч в arduino 1.6.13
Подключил все нужные библиотеки
Пытаюсь Проверить/Компилировать и получаю:
exit status 1 
'DsCount' was not declared in this scope
Что я делаю не так?
При этом куча других скетчей, например Arduino CNC Shield прекрасно проверяются и компилируются
А эта вот метеостанция, во всех своих реинкарнациях, начиная с первой и по последнюю - вылетают с вышеуказанной ошибкой.
Такое ощущение, что какая то библиотека не подгрузилась. Но только какая? Смотрю те, что в скетче явно прописаны - таки они есть.
Может следует перенисти библиотеки в папку без русских букв и пробелов? И как тогда об этом сообщить arduino 1.6.13, что бы он больше не спотыкался?
В общем - хелп!
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

zztop1967 пишет:

Что я делаю не так?

Берете чужие скетчи, смысла которых не понимаете. вместо того, чтобы учиться писать свои.

zztop1967 пишет:

'DsCount' was not declared in this scope

Перенесите функцию DsCount (строки 3671-376) выше функции setup

Наверняка там ещё встрется аналогичные ошибки - переносите всё так, чтобы любая функция была объвлено ДО использования, а не после.

-----------------

Пожалуйста, если Вам нужна помощь, публикуйте скетч здесь. Мне, например, неудомно лазать по посторонним сайтам. 

 

zztop1967
Offline
Зарегистрирован: 02.01.2017

Ну что тут сказать... 

К чеиу читать Чуковского, Чехова или Шоу? Надо же сразу самому писать!

Причем сразу. Нквзирая.

Я же сначала учился собирать чужой детекторный приемник, магнитофон, усилитель, а уже после свой аудиокомплекс, и админки.

1. Строки DsCount (строки 3671-376) - это за гранью добра и зла. Как не крути строки мимо нумкрации.

2. Вот интересно, скетч опубликован. Скетч - рабочий. Вопрос конечно идиотский, но, какого спрашивается рожна в рабочем скетче переставлять куски промеж собой, что бы заработало в новом компиляторе? Вопрос обратной совместимости не функционирует?

3. То,что переменная, фунция или процедура должна использоваться после того, как она должна бытьобъявлена - понятно и ежу. Вы объясните, почему у других этот скетч компилируется а у меня - нет.

Скетч живой. Рабочий. Многими заюзаный. Если бы нужно было что то поменять местами - давно бы уже поменяли. Использумые библиотеке все на месте. Вроде бы. Т.е. в интерфейсе они есть, а при компиляции могут и косяки вылезти. Про это и спрашиваю

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Молодой человек, я нахожу Ваш тон хамским. Если Вам хочется знать почему компилируется у других, а у Вас нет, об этом можно спросить вежливо. 

Я отвечу на Ваши вопросы, на этот раз. Но если Вам еще раз потребуется моя помощь, то только после извинений.

Итак, я не буду комментировать Вашу придирку к опечатке человека, который Вам помогает, которая, к тому же не особо влияет на понимание, т.к. номера строк там очевидны. Перейду сразу к сути дела.

Этот скетч был рабочим раньше. Он и сейчас будет работать, если Вы возьмёте старую версию IDE (например, 1.6.5).

Разработчики IDE сначала решили «позаботиться» о безграмотных чайниках и сами, перед передачей текста компилятору, собирали все заголовки функций и делали «предобъявление» в начале файла. Именно потому, всё и работало. Но из-за этого идиотизма, они столько всего сломали, и столько всего правильно написанного перестало работать, что потом они отказались от этого маразма и теперь писать надо как положено, а старые скетчи не работают.

Переставьте функции местами, скажите спасибо и впредь не хамите старшим.

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

zztop1967 пишет:

 Про это и спрашиваю

Так и ответили про это. Установите IDE версии 1.6.7 и ниже, очень приятно удивит обратная совместимость при компиляции. Ошибок не будет. 

И что интересно сами себе противоречите. Так то правильно пишите сначала приемник, потом ....
А тут сразу бац и погодная станция, может попроще взять разобрать программу?

И опять же насчет читать Чуковского, Чехова или Шоу... Есть так назывемый  Release Notes там как раз все написано, что и как менялось в IDE. И про ту самую обратную совместимость тоже. 

Думаю ответил на все ваши вопросы. Так что вместо того чтобы сразу на коня и в атаку пробуйте что советуют, а потом уж - Скетч живой. Рабочий. Многими заюзаный и тд и тп.

 

 

zztop1967
Offline
Зарегистрирован: 02.01.2017

Достопочтенный Сэр, примите искренние увкрения в глубочайшем к Вам почтении! Смиею заметить, однако, что тон диалога задали именно Вы. Т.о. извинения должны быть обоюдными. ИначИ мои секунданты свяжутся с Вами через ВаЦап! Выбор оружия за Вами. Рогатки с жованой бумагой или трубочки. А там ещё поглядим, кто из нас молодой человек!

По сути вопроса - тут даже и говорить грустно. То, что я 1989 писал на паскале - сейчас любым компилятором пролетает без ошибк. А то, что было написано всего пару лет назад - уже требует напильника.

Господа, это - не просто грустно, это какой то треш.

Нет, я и сейчас могу, как раньше, спаять из диодов, проводов, земли и опилок многие чудеса, но, брацци мои, если одна и та же схема, с одними и теми же копмаанентами, седня работает а завтра нет - эт уже о многом говорит.

Грустно, разбойники, грустно (с) Кто в теме - тот поймет.

ПыСы: Сказали бы просто - откатись на такую то версию. И будет счастье. А то наехали...На старого перешника - и рады :)

За сим примите искренние уверения в глубочайшем к Вам почтении.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

zztop1967, к сожалению, Мир таков, как он есть, а не таков, каким бы нам хотелось его видеть.

И разработчики Ардуино, вероятно, талантливые маркетологи, но не очень хорошие программисты. ПОэтому они, создав хороший проект, понаделали в нем много глупостей, которые приходится исправлять, и из-за которых страдает совместимость с ранними версиями. Но это лучше того, что было раньше - несовместимость с С/С++. Так что если бы Вы не брали чужие скетчи, написанные вопреки правилам языка, а писали свои - с учетом этих правил, никакой несовместимости бы Вы не заметили.

PS. И позвольте выразить сомнение, что то, что Вы писали в 89 году на Паскале (кстати, на каком? Борланд 5.0 или GNU?) сегодня компилируется любым компилятором паскаля. Попытайтесь откомпилировать хотя бы в Дельфи. Или ABC. Крайне сомневаюсь, что у Вас что-то получится. Тем более, что во-первых, уже в 89 году существовало, минимум, две несовместимые между собой версии Паскаля, а во-второых, пример Паскаля не показателен, т.к. в 89 году он был вполне себе рабочим инструментом, а сегодння - давным давно заброшен и не развивается.

Тексты на латыни (мертвом языке) сегодня читаются точно так же, как 500 лет назад, но попытайтесь прочитать что-нибудь написанное 500 лет назад по-русски (на языке живом и развивающимся).

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

лучше код поправить и сюда выложить )))

PS как хорошо, что я на ASMе  1.27 писал ))) и в debug
 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

zztop1967 пишет:

Я же сначала учился собирать чужой детекторный приемник,

Эт ты молодец, не то, что некоторые умники! Скачают чужой скетч сразу на целую метеостанцию ....

zztop1967 пишет:

Скетч живой. Рабочий. Многими заюзаный. 

Так и ты юзай! И не слушай тут всяких умничающих! А то они, сцуко за " Вопрос обратной совместимости" ни хера не слышали, а туда же, мля, советы раздавать!

zztop1967
Offline
Зарегистрирован: 02.01.2017

andriano пишет:

PS. И позвольте выразить сомнение, что то, что Вы писали в 89 году на Паскале (кстати, на каком? Борланд 5.0 или GNU?)

Эх! Взяли и под корень моё хвастовство рубанули! :)

Нет, не 89 конечно. Чуточку позже. Где то 91-92 спаял я себе синклер-профи. По тем временам не аппарат - а сказка! Разгонялся до 7 мГц!!! 1 Мб ОЗУ!!! Можно было цеплять HDD!!! Музыкальный сопроцессор! Порт центроникс! И, самое главное - Режим CP/M!!! :) А там были настоящие инструменты в виде турбопаскаля(или борланд?) 3.0, dBase и прочие радости. Я писал дома, записывал на дискету, тащил на работу, там конвертил KOI8- забыл какая кодировка Досовская, и продолжал писать на 386DX2 :)

Лет 5-7 назад из спортивного интереса взял фри паскаль - откомпилилось :) Библиотечки подсунул и откомпилилось :)

Сейчас конечно уже глаз не тот, навык программирования потускнел, но кое что еще помнится. Будем потрести стариной и разбираться с ардуиной. Тем более в чем проблема - мне уже подсказали :)

Огромнейшее спасибо! :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А библиотеку BMP085 откуда скачали? У Меня правленый в 1.8.0 не компилируется с найденной на просторах библиотекой, поставид адафрутовскую, три строки добавил, компилируется, но проверить не на чем, из датчиков есть только DS18B20 )))
 

Правленный код

// Скетч для Arduino для отправки метеоданных на Народный мониторинг
// Версия 2.1 (25.11.2014)
//
// Автор: Гладышев Дмитрий (2012-2014)
// http://student-proger.ru/2014/11/meteostanciya-2-1/
 
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <Wire.h>
//#include <BMP085.h>
#include <Adafruit_BMP085.h>
#include <DHT.h>
 
bool Debug = false; //режим отладки
 
//********************************************************************************************
byte mac[] = { 0xDE, 0xAD, 0xBE, 0x00, 0x00, 0x00 }; //MAC-адрес Arduino
#define BMP085_ADA       1
//#define BMP085_EXIST     1      // наличие датчика атмосферного давления
//#define BMP085_TEMP      1      // использовать температурный датчик в BMP085
#define DHT_EXIST        1      // наличие датчика влажности
#define DHT_TEMP         1      // использовать температурный датчик в DHT22
#define DS18B20_PIN      2      // пин подключения термодатчика DS18B20
#define DHTPIN           6      // пин подключения датчика влажности DHT22
#define DHTTYPE          DHT22  // тип датчика влажности DHT22/DHT11
#define postingInterval  600000 // интервал между отправками данных в миллисекундах (10 минут)
//********************************************************************************************
 
char server[] = "narodmon.ru";
char macbuf[13];
 
EthernetClient client;
OneWire ds(DS18B20_PIN);


#if BMP085_ADA == 1
Adafruit_BMP085 dps;
//  BMP085 dps = BMP085();
#endif

#if BMP085_EXIST == 1
  BMP085 dps = BMP085();
#endif
 
#if DHT_EXIST == 1
  DHT dht(DHTPIN, DHTTYPE);
#endif
 
unsigned long lastConnectionTime = 0;           // время последней передачи данных
boolean lastConnected = false;                  // состояние подключения
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
char replyBuffer[160];                          // буфер для отправки
int CountSensors;                               // количество найденных датчиков температуры
long Temperature = 0;
long Pressure = 0;                              // давление
float Humidity = 0;                             // влажность

//Функция отправки данных
void httpRequest() 
{
  if (client.connect(server, 80))
  {
    if (Debug)
    {
      Serial.println("connecting...");
    }
    // отправляем HTTP POST запрос:
    client.println("POST http://narodmon.ru/post.php HTTP/1.0");
    client.println("Host: narodmon.ru");
    client.println("Content-Type: application/x-www-form-urlencoded");
    client.print("Content-Length: ");
    client.println(len(replyBuffer));
    client.println();
    client.println(replyBuffer);
    client.println();
 
    lastConnectionTime = millis();
  } 
  else
  {
    if (Debug)
    {
      Serial.println("connection failed");
      Serial.println("disconnecting.");
    }
    client.stop();
  }
}
 
//Количество термодатчиков DS18B20 на шине
int DsCount()
{
  int count=0;
  bool thatsall = false;
  byte addr[8];
  do
  {
    if ( !ds.search(addr))
    {
      ds.reset_search();
      thatsall = true;
    }
    count++;
  } while(!thatsall);
  return (count-1);
}
 
//Функция определения длины строки
int len(char *buf)
{
  int i=0; 
  do
  {
    i++;
  } while (buf[i]!='\0');
  return i;
}
 
//Функция переворота строки
void reverse(char s[])
{
  int i, j;
  char c;
 
  for (i = 0, j = strlen(s)-1; i<j; i++, j--) 
  {
    c = s[i];
    s[i] = s[j];
    s[j] = c;
  }
}
 
//Функция конвертирования числа в символьный массив
void itoa(int n, char s[])
{
  int i, sign;
 
  if ((sign = n) < 0)       /* записываем знак */
    n = -n;                 /* делаем n положительным числом */
  i = 0;
  do {                      /* генерируем цифры в обратном порядке */
    s[i++] = n % 10 + '0';  /* берем следующую цифру */
  } while ((n /= 10) > 0);  /* удаляем */
  if (sign < 0)
    s[i++] = '-';
  s[i] = '\0';
  reverse(s);
}
 
void setup() {
 
  if (Debug)
  {
    Serial.begin(9600);
  }
 
  // Пробуем подключиться по Ethernet до тех пор пока это не удастся
  do 
  {
    delay(1000);
  } while (Ethernet.begin(mac) == 0);
 
  //Узнаём количество термодатчиков DS18B20
  CountSensors = DsCount();
  if (Debug)
  {
    Serial.print("Found ");
    Serial.print(CountSensors);
    Serial.println(" sensors."); 
  }
 
  #if BMP085_EXIST == 1
    Wire.begin();
    dps.init();
  #endif
  #if DHT_EXIST == 1
    dht.begin();
  #endif    
 
  lastConnectionTime = millis()-postingInterval+15000; //первое соединение через 15 секунд после запуска
}
 
void loop()
{
  //Если вдруг нам случайно приходят откуда-то какие-то данные,
  //то просто читаем их и игнорируем, чтобы очистить буфер
  if (client.available()) 
  {
    client.read();
  }
 
  if (!client.connected() && lastConnected) 
  {
    if (Debug)
    {
      Serial.println();
      Serial.println("disconnecting.");
    }
    client.stop();
  }
 
  //если не подключены и прошло определённое время, то делаем замер,
  //переподключаемся и отправляем данные
  if (!client.connected() && (millis() - lastConnectionTime > postingInterval)) 
  {
    //формирование HTTP-запроса
    memset(replyBuffer, 0, sizeof(replyBuffer));
    strcpy(replyBuffer,"ID=");
 
    memset(macbuf, 0, sizeof(macbuf));
    //Конвертируем MAC-адрес
    for (int k=0; k<6; k++)
    {
      int b1=mac[k]/16;
      int b2=mac[k]%16;
      char c1[2],c2[2];
 
      if (b1>9) c1[0]=(char)(b1-10)+'A';
      else c1[0] = (char)(b1) + '0';
      if (b2>9) c2[0]=(char)(b2-10)+'A';
      else c2[0] = (char)(b2) + '0';
 
      c1[1]='\0';
      c2[1]='\0';
 
      strcat(macbuf,c1);
      strcat(macbuf,c2);
    }
    strcat(replyBuffer, macbuf);
 
    //Сбрасываем поиск датчиков (кол-во нам уже известно)
    ds.reset_search();
 
    //Теперь в цикле опрашиваем все датчики DS18B20 сразу
    for (int j=0; j<CountSensors; j++)
    {
      byte i;
      byte present = 0;
      byte data[12];
      byte addr[8];
 
      if ( !ds.search(addr)) 
      {
        ds.reset_search();
        return;
      }
 
      ds.reset();
      ds.select(addr);
      ds.write(0x44,1);
 
      delay(1000);
 
      present = ds.reset();
      ds.select(addr);    
      ds.write(0xBE);
 
      for ( i = 0; i < 9; i++) // нам необходимы 9 байт данных от датчика
      {
        data[i] = ds.read();
      }
 
      LowByte = data[0];
      HighByte = data[1];
      TReading = (HighByte << 8) + LowByte;
      SignBit = TReading & 0x8000;  // бит знака
      if (SignBit) // отрицательная температура
      {
        TReading = (TReading ^ 0xffff) + 1;
      }
      Tc_100 = (6 * TReading) + TReading / 4;
 
      Whole = Tc_100 / 100;  // разделяем целую и дробную части
      Fract = Tc_100 % 100;
 
      char temp[3];
 
      itoa(Whole,temp);
      strcat(replyBuffer,"&");
 
      //конвертируем адрес термодатчика
      for (int k=7; k>=0; k--)
      {
        int b1=addr[k]/16;
        int b2=addr[k]%16;
        char c1[2],c2[2];
 
        if (b1>9) c1[0]=(char)(b1-10)+'A';
        else c1[0] = (char)(b1) + '0';
        if (b2>9) c2[0]=(char)(b2-10)+'A';
        else c2[0] = (char)(b2) + '0';
 
        c1[1]='\0';
        c2[1]='\0';
 
        strcat(replyBuffer, c1);
        strcat(replyBuffer, c2);
      }
      strcat(replyBuffer,"=");
      if (SignBit) //если температура отрицательная, добавляем знак минуса
      {
        strcat(replyBuffer,"-");
      }
      strcat(replyBuffer,temp);
      strcat(replyBuffer,".");
      if (Fract<10)
      {
        strcat(replyBuffer,"0");
      }
      itoa(Fract,temp);
      strcat(replyBuffer,temp);
    }
 
    char temp[8];
    long p_100, h_100;
 
    #if BMP085_EXIST == 1
      //получаем значение атмосферного давления
      strcat(replyBuffer, "&");
      strcat(replyBuffer, macbuf);
      strcat(replyBuffer, "01=");
      dps.getPressure(&Pressure);
      p_100 = Pressure/1.333;
      Whole = p_100 / 100;
      Fract = p_100 % 100;
      itoa(Whole, temp);
      strcat(replyBuffer, temp);
      strcat(replyBuffer, ".");
      if (Fract<10)
      {
        strcat(replyBuffer,"0");
      }
      itoa(Fract, temp);
      strcat(replyBuffer, temp);
      #if BMP085_TEMP == 1
        //получаем значение температуры с датчика давления
        strcat(replyBuffer, "&bmpt=");
        dps.getTemperature(&Temperature);
        if (Temperature < 0)
        {
          SignBit = 1;
          Temperature = -Temperature;
        }
        else
        {
          SignBit = 0;
        }
        Whole = Temperature / 10;
        Fract = Temperature % 10;
        itoa(Whole, temp);
        if (SignBit)
        {
          strcat(replyBuffer, "-");
        }
        strcat(replyBuffer, temp);
        strcat(replyBuffer, ".");
        itoa(Fract, temp);
        strcat(replyBuffer, temp);
      #endif
    #endif
 
    #if DHT_EXIST == 1
      //получаем значение влажности
      Humidity = dht.readHumidity();
      strcat(replyBuffer, "&");
      strcat(replyBuffer, macbuf);
      strcat(replyBuffer, "02=");
      h_100 = Humidity*100;
      Whole = h_100 / 100;
      Fract = h_100 % 100;
      itoa(Whole, temp);
      strcat(replyBuffer, temp);
      strcat(replyBuffer, ".");
      if (Fract<10)
      {
        strcat(replyBuffer,"0");
      }
      itoa(Fract, temp);
      strcat(replyBuffer, temp);
      #if DHT_TEMP == 1
        //получаем значение температуры с датчика влажности
        strcat(replyBuffer, "&dhtt=");
        Temperature = dht.readTemperature()*100;
        if (Temperature < 0)
        {
          SignBit = 1;
          Temperature = -Temperature;
        }
        else
        {
          SignBit = 0;
        }
        Whole = Temperature / 100;
        Fract = Temperature % 100;
        itoa(Whole, temp);
        if (SignBit)
        {
          strcat(replyBuffer, "-");
        }
        strcat(replyBuffer, temp);
        strcat(replyBuffer, ".");
        if (Fract<10)
        {
          strcat(replyBuffer,"0");
        }
        itoa(Fract, temp);
        strcat(replyBuffer, temp);
      #endif
    #endif
 
    strcat(replyBuffer,'\0');
 
    if (Debug)
    {
      Serial.println(replyBuffer);
      Serial.print("Content-Length: ");
      Serial.println(len(replyBuffer));
    }
 
    //отправляем запрос
    httpRequest();
  }
  //храним последнее состояние подключения
  lastConnected = client.connected();
}
 

 

zztop1967
Offline
Зарегистрирован: 02.01.2017

Все отлично откомпилировалось! Всего то и нужно было так описание функций поместить до тела программы :) Спасибо огромнейшее за подсказку! А то я грешил на что угодно, только не на сам скетч :)

К сожалению сейчас пока нету под рукой ethernet шилда. Проверить пока не могу. Но, думаю что заработает :)

ua6em пишет:

А библиотеку BMP085 откуда скачали?

Кхм... Я брал библиотеки которые вместе со статьей лежали :)

http://student-proger.ru/2014/11/meteostanciya-2-1/

У автора несколько статей про свою метеостанцию. Поэтапное ее развитие. начиная с первой версии и до сегодняшней. И к каждой есть библиотеки.

В вышепреведённой статье в комментариях от читателя есть дополнение в виде еще какого то датчика. Сейчас не помню какого. Все равно пробовать пока неначем. Вот приедут железки с датчиками буду продолжать :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Слона то я и не приметил...

Попробую на WeMos D1 переделать и залить

nightflash
nightflash аватар
Offline
Зарегистрирован: 22.11.2018

Признаю, ошибки указанного рода (объявление функций) в моих скетчах могут быть. Дело в том, что не привык я обновлять софт до последних версий. Разработчики Arduino IDE постоянно что-то меняют, и это уже надоело. Первый раз это произошло при переходе с версий 0.x на 1.0.x . Большая часть библиотек просто перестала работать. С тех пор и использую чаще всего версию 1.0.5, о чём и предупреждаю в статьях на сайте.