После обновления IDE глючат новые скетчи

Ulliss
Offline
Зарегистрирован: 16.09.2019

Обновил IDE до версии 1.8.10

И теперь новый скетч не компилируется. А его предыдущая версия проходит компиляцию.

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

С чем может быть связано?

Отличия версий скетчей в том, что добавил библиотеку MSTimer и добавил отображений времени.

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Ulliss пишет:
И теперь новый скетч не компилируется...С чем может быть связано?

                                 \/

Ulliss пишет:
Обновил IDE до версии 1.8.10

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

функцию до луп воткнуть, а также напрашивается вариант - откатиться назад

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

В строке №15 же явная ошибка, сами посмотрите!

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Я бы даже сказал - в строке #13 явно что то не чисто..

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

MaksVV пишет:

откатиться назад

Не поможет. Он же скетч поменял. Старый скетч компилируется :)))

Так что что про обновление можно забыть - просто не компилируется скетч.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

«- И голова, - И голова, - Без ***»)))

Ulliss
Offline
Зарегистрирован: 16.09.2019

Вы пошутили - я посмеялся.=))

вот сам скетч: 

прошу не пинать. я стараюсь...


/*Name    : Arduino, походная метеостанция. (датчик BMP280 и LCD дисплей 1602А)

  Выполнено на основании примеров и уроков: http://mypractic.ru http://arduino.ru/forum/proekty
********************************************************************
  данная программа считывает данные о температуре, влажности и давлении с датчика BME280
  и отображает информацию на LCD дисплей 1602
  датчик и дисплей подключены параллельно по одной шине 2C.

  Также программа копит сведения о давлении и температуре за указанное время
  и на основании этих данных сообщает тенденцию к изменению температуры и давления
  составляет краткосрочный прогноз изменения погоды на основании алгоритма Zamretti
*/


//----------НАСТРОЙКИ----------
#define BUTTON_1_PIN 12  // номер вывода кнопки 1 равен 12 (к S pin12 и к Gnd)
#define Time_LCD_On 15000 //время включенного дисплея

//----------БИБЛИОТЕКИ----------
#include <Wire.h>
#include <SPI.h>
#include <iarduino_RTC.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <LiquidCrystal_I2C.h>
#include <MsTimer2.h>
  int count=0;

//----------ПЕРЕМЕННЫЕ, КОНСТАНТЫ, КЛАССЫ И МАССИВЫ----------

    byte simvolGrad1[8] = { // создаем символ градусника и присваиваем ему имя "simvolGrad1"
      0b00100,
      0b01010,
      0b01010,
      0b01110,
      0b01110,
      0b11111,
      0b11011,
      0b01110
    };
    byte simvolGrad2[8] = { // создаем символ градуса и присваиваем ему имя "simvolGrad2"
      0b01100,
      0b10010,
      0b10010,
      0b01100,
      0b00000,
      0b00000,
      0b00000,
      0b00000
    };
    byte simvolHum[8] = { // создаем символ влажности и присваиваем ему имя "simvolHum"
      0b00100,
      0b00100,
      0b01010,
      0b01010,
      0b10001,
      0b10001,
      0b10001,
      0b01110
    };
    byte simvolButt[8] = { // создаем символ батарейки и присваиваем ему имя "simvolButt"
      0b01110,
      0b11111,
      0b10001,
      0b10001,
      0b10001,
      0b10001,
      0b11111
    };
    byte lcdState;         // переменная состояния LCD дисплея
    unsigned int lcdTimeCount; // счетчик времени работы дисплея

class Button { // Описание класса обработки сигналов кнопок
  public:
    Button(byte pin, byte timeButton);  // описание конструктора
    boolean flagPress;    // признак кнопка сейчас нажата
    boolean flagClick;    // признак кнопка была нажата (клик)
    void scanState();     // метод проверки состояние сигнала
void setPinTime(byte pin, byte timeButton); // метод установки номера вывода и времени (числа) подтверждения
  private:
    byte  _buttonCount;    // счетчик подтверждений стабильного состояния
    byte _timeButton;      // время подтверждения состояния кнопки
    byte _pin;             // номер вывода
};

LiquidCrystal_I2C lcd(0x27, 16, 2); // описание объекта LCD дисплея (адрес 0x27 , 16 символов , 2 строки)
Button button1(BUTTON_1_PIN, 15);  // создание объекта для кнопки 1  с параметрами: номер вывода 4, число подтверждений 15
iarduino_RTC time(RTC_DS1302, 7, 5, 6); // подключаем RTC модуль на базе чипа DS1302 (RST, CLK, DAT)
Adafruit_BME280 bme; // создаем ярлык сенсора при подключении сенсора по шине I2C
unsigned long delayTime; // задаем переменную для паузы измерений

//----------SETUP----------
void setup() {
  pinMode(GND_PIN, OUTPUT);
  pinMode(VCC_PIN, OUTPUT);
  digitalWrite (GND_PIN,LOW);
  digitalWrite (VCC_PIN,HIGH);
  delay(300);
  Serial.begin(9600); // подключаем порт монитора
      time.begin();
    //time.settime(0,31,22,25,9,19,3);  // 0  сек, ** мин, ** час, **, месяц, год, день недели чтоб заново ввести время - снять слэши

  Serial.println(F("Произвожу проверку датчика BME/BMP280")); //высвечиваем на мониторе строку
  bool status; // задаем переменную статуса проверки наличия сенсора
  status = bme.begin();
      if (!status) { //проверка положительного статуса наличия сенсора
        Serial.println("Датчик BME280 не обнаружен. Проверьте соединение!");
        while (1); // пока статус не изменится на положительный дальнейшие действия не происходят
      }
  Serial.println("--- Тест пройден успешно. Оборудование готово к работе. ---"); //высвечиваем на мониторе строку окончания проверки сенсора
  delayTime = 10000; //задаем длительность паузы (10 сек) между измерениями (отображением данных на монитор)
  Serial.println(); // печатаем пустую строку для отделения блока проверки от блока отображения данных
  delay(100); // даем время (0.1сек) сенсору на первый замер
  // режим портативного измерения данных (мониторинг в экономичном режиме)
  Serial.println("-- Походная станция погоды --");
  bme.setSampling(Adafruit_BME280::MODE_FORCED,
                  Adafruit_BME280::SAMPLING_X1, // temperature
                  Adafruit_BME280::SAMPLING_X4, // pressure
                  Adafruit_BME280::SAMPLING_X1, // humidity
                  Adafruit_BME280::FILTER_X16   );
  Serial.println();
  Serial.println("первые измерения");
  printValuesSerial();
  //printValuesLCD1();
  delay(3000); // ждем заданное время (пауза)
  //lcd.noDisplay();
  //lcd.noBacklight();
  //delay(3000); // ждем заданное время (пауза)
  
  MsTimer2::set(2, timerInterupt1); // задаем период прерывания по таймеру 2 мс
  MsTimer2::start();              // разрешаем прерывание по таймеру
} // закрытие блока setup

//----------LOOP----------
void loop() {

	bme.takeForcedMeasurement(); //вызов метода измерения
  	  printValuesSerial(); // блок печати данных на монитор (надо перевести на прерывание )
	  delay(delayTime); // ждем заданное время (пауза)
	lcdState = 1;
	lcdTimeCount = 0;
	
mode1: // потом переделать на массив режимов
  if ( lcdTimeCount < Time_LCD_On ; lcdTimeCount ++) {
	  //turnOnLcd();
	  printValuesLCD1(); // блок печати данных на дисплей
  }
	  else goto modeOff;
  
mode2:
  if ( lcdTimeCount < Time_LCD_On ; lcdTimeCount ++) {
	  //turnOnLcd();
	  printValuesLCD2(); // блок печати данных на дисплей
  }
	  else goto modeOff; 
mode3:
  if ( lcdTimeCount < Time_LCD_On ; lcdTimeCount ++) {
	  //turnOnLcd();
	  printValuesLCD3(); // блок печати данных на дисплей
  }
	  else goto modeOff;  
mode4:
  if ( lcdTimeCount < Time_LCD_On ; lcdTimeCount ++) {
	  //turnOnLcd();
	  printValuesLCD4(); // блок печати данных на дисплей
  }
	  else goto modeOff;
modeOff:
        lcd.noDisplay(); // инициируем дисплей LCD
        lcd.noBacklight();
} //закрытие блока loop       
void  timerInterupt1() {     // обработчик прерывания
    count++;
    button1.scanState();  // вызов метода сканирования сигнала кнопки 1
        if ( button1.flagClick == true ) { // блок управления нажатия на кнопку (смена экранов)
        // было нажатие кнопки
        button1.flagClick= false;         // сброс признака клика
		    lcdState ++;
			  lcdTimeCount = 0;
			  goto mode1;
        }
			else if (lcdState = 1) {
			goto mode2;
			}
				else if (lcdState = 2) {
				goto mode3;
				}
					else if (lcdState = 3) {
					goto mode4;
					}
						else if (lcdState = 4) {
						goto mode1;
						}					
        } //закрытие блока управления нажатия на кнопку (смена экранов)
    }

/* здесь будет блок для прогноза (пока не работает)
************
*/

void Button::scanState() { //метод проверки состояния кнопки
//  flagPress= true  - нажата
//  flagPress= false - отжата
//  flagClick= true - была нажата (клик)
    if ( flagPress == (! digitalRead(_pin)) ) {
    // состояние сигнала осталось прежним
    _buttonCount= 0;  // сброс счетчика состояния сигнала
    }
    else {
    // состояние сигнала изменилось
    _buttonCount++;   // +1 к счетчику состояния сигнала
        if ( _buttonCount >= _timeButton ) {
        // состояние сигнала не менялось заданное время
        // состояние сигнала стало устойчивым
        flagPress= ! flagPress; // инверсия признака состояния
        _buttonCount= 0;  // сброс счетчика состояния сигнала
        if ( flagPress == true ) flagClick= true; // признак клика на нажатие
        }
    }
} //закрытие блока метода проверки состояния кнопки

void Button::setPinTime(byte pin, byte timeButton)  { //метод установки номера вывода и времени подтверждения
  _pin= pin;
  _timeButton= timeButton;
  pinMode(_pin, INPUT_PULLUP);  // определяем вывод как вход
}

Button::Button(byte pin, byte timeButton) { //описание конструктора класса Button
  _pin= pin;
  _timeButton= timeButton;
  pinMode(_pin, INPUT_PULLUP);  // определяем вывод как вход
}

void printValuesSerial() { //метод отображения данных на мониторе
  Serial.print("Температура воздуха = ");
  Serial.print(bme.readTemperature());
  Serial.println(" *C");
    Serial.print("Атмосферное давление = ");
    Serial.print(bme.readPressure() / 100.0F / 1.33322368); // добавляем коэффициент если в мм
    Serial.println(" мм рт.ст.");
  //Serial.print("Высота над уровнем моря (примерная) = ");
  //Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  //Serial.println(" м");
    Serial.print("Влажность воздуха = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");
  Serial.println(); //печатаем пустую строку для разделения блоков между измерениями (отображением данных на монитор)
}
void printValuesLCD1() { //метод отображения данных на дисплее (экран №1)
  // включаем подсветку дисплея, задаем начальную позицию курсора, отображаем показания температуры
  turnOnLcd();
  lcd.setCursor(0, 0);
  lcd.print(time.gettime("d-m-Y ")); //дата, символ батареи и уровень заряда
  lcd.print(char(4));
  lcd.print(" 99%"); // вместо 99% будет показание о состоянии батареи

  lcd.setCursor(0, 1); //для отображения на второй строке меняем начальную позицию курсора
  lcd.print(time.gettime("H:i,D"));// часы
} 
void printValuesLCD2() { //метод отображения данных на дисплее (экран №2)
  // включаем подсветку дисплея, задаем начальную позицию курсора, отображаем показания температуры
  turnOnLcd();
  lcd.setCursor(0, 0);
  lcd.print(char(1));
  lcd.print(bme.readTemperature() , 1);
  lcd.print(char(2));
  lcd.print("C; ");

  lcd.print(char(3));
  lcd.print(bme.readHumidity() , 1);
  lcd.print("%");

  lcd.setCursor(0, 1); //для отображения на второй строке меняем начальную позицию курсора
  lcd.print("Pres.=");
  lcd.print(bme.readPressure() / 100.0F / 1.33322368 , 0);
  lcd.print("mm");
}
void printValuesLCD3() { //метод отображения данных на дисплее (экран №3)
  // включаем подсветку дисплея, задаем начальную позицию курсора, отображаем показания температуры
  turnOnLcd();
  lcd.setCursor(0, 0);
  lcd.print("Temp.=");
  lcd.print("xx"); // вставить параметр изменения температуры
  lcd.print(char(2));
  lcd.print("C; ");
  lcd.print("/4AC");

  lcd.setCursor(0, 1); //для отображения на второй строке меняем начальную позицию курсора
  lcd.print("Pres.=");
  lcd.print("xxx"); // вставить параметр изменения давления
  lcd.print("mm");
  lcd.print("/4AC");
} 
void printValuesLCD4() { //метод отображения данных на дисплее (экран №4)
  // включаем подсветку дисплея, задаем начальную позицию курсора, отображаем показания температуры
  turnOnLcd();
  lcd.setCursor(0, 0);
  lcd.print("first line");

  lcd.setCursor(0, 1); //для отображения на второй строке меняем начальную позицию курсора
  lcd.print("second line");
} 
void turnOnLcd() {
        lcd.begin(); // инициируем дисплей LCD
        lcd.backlight();
        lcd.clear();
        lcd.createChar(1, simvolGrad1);
        lcd.createChar(2, simvolGrad2);
        lcd.createChar(3, simvolHum); 
        lcd.createChar(4, simvolButt);
}
Ulliss
Offline
Зарегистрирован: 16.09.2019

алгоритм хотел такой:

при подаче напряжения, срабатывает датчик и загорается экран №1. при нажатии на кнопку экраны меняются по кругу. если нажатия нет 30 сек, то экран гаснет и переход в спящий режим, но датчик работает и данные обновляются. при нажатии снова включается экран и отображает данные .

 

сохранилась версия скетча, когда еще не было библиотеки времени. и на LCD только с сенсора отображалось. и в мониторе дублировалось. сейчас работаю с новой версией и вот она перестала компилироваться, хотя до обновления среды были другие ошибки, над которыми собственно и работал.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Вам же написали в сообщении #2, что функции нужно объявить до loop, а в Вашем случае до setup. Если ещё какие будут ошибки копируйте сообщения полностью сюда.

Ulliss
Offline
Зарегистрирован: 16.09.2019

kalapanga пишет:

Вам же написали в сообщении #2, что функции нужно объявить до loop, а в Вашем случае до setup. Если ещё какие будут ошибки копируйте сообщения полностью сюда.

Спасибо.

Да, с функциями то я разберусь. Скетч еще сырой. Там много что делать еще. Меня больше всего в ступор вводит непонятка с библиотеками:

Цитата:
Arduino: 1.8.10 (Windows 8.1), Плата:"Arduino Nano, ATmega328P (Old Bootloader)"Несколько библиотек найдено для "iarduino_RTC.h"  Используется: C:\Users\Ulliss\Documents\Arduino\libraries\iarduino_RTC Несколько библиотек найдено для "Adafruit_Sensor.h"  Используется: C:\Users\Ulliss\Documents\Arduino\libraries\Adafruit_Sensor-master Несколько библиотек найдено для "Adafruit_BME280.h"  Используется: C:\Users\Ulliss\Documents\Arduino\libraries\Adafruit_BME280_Library Несколько библиотек найдено для "LiquidCrystal_I2C.h"  Используется: C:\Users\Ulliss\Documents\Arduino\libraries\LiquidCrystal_I2C_V112 Несколько библиотек найдено для "MsTimer2.h"  Используется: C:\Users\Ulliss\Documents\Arduino\libraries\MsTimer2 Несколько библиотек найдено для "Wire.h"  Используется: C:\Program Несколько библиотек найдено для "SPI.h"  Используется: C:\Program
 
И в кавычках объявлял библиотеки, и в угловых скобках - одно и тоже пишет. Мол, "несколько библиотек" видит. Как это победить? В корневой папке библиотеки родные, в моей папке с документами, где скетчи и библиотеки, они не повторяются. Почему компилятор воспринимает их как несколько.... 
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну так компилятор же явно указал Вам пути - по ним и смотрите. (ну либо публикуйте на форуме полное содержимое Вашего жесткого диска)

Ulliss
Offline
Зарегистрирован: 16.09.2019

andriano пишет:

Ну так компилятор же явно указал Вам пути - по ним и смотрите. (ну либо публикуйте на форуме полное содержимое Вашего жесткого диска)


По ним смотрел.
Компилятор указал на путь к библиотекам, которые он использует. Всё верно. Там они и лежат. Но где он видит ещё?

Какие-то ещё версии будут?

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

А что, поиск уже отменили?

Посмотрите, где еще у Вас лежать одноименные файлы.

Ulliss
Offline
Зарегистрирован: 16.09.2019

andriano пишет:

А что, поиск уже отменили?

Посмотрите, где еще у Вас лежать одноименные файлы.

Какими словами ещё обьяснить, что эти версии я проверил первым делом.
На компе нет двойных файлов.
Неужели такая ошибка ни у кого не встречалась ранее?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Перенесите на юсб ( cut , paste) ту на которую он говорит что используется.
Что теперь скажет компилятор?

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

Ulliss пишет:
Какими словами ещё обьяснить, что эти версии я проверил первым делом. На компе нет двойных файлов.

Никакими не надо. Если компилятор говорит, что библиотеки дублируются, значит они дублируются.

Ulliss пишет:
Неужели такая ошибка ни у кого не встречалась ранее?
Какая? Чтобы человек сам не знал, что и где у него на дисках и не умел пользоваться поиском? Сплошь и рядом встречается.

А по сути. Включи ты, наконец, нормальный вывод сообщений и получишь полное сообщение, как все нормальные люди, типа такого:

Несколько библиотек найдено для "CallBack.h"
Используется: C:\Users\Admin\GD\Soft\libraries\CallBack
Не используется: C:\Users\Admin\GD\Soft\libraries\CallBack2

У меня же показывает обе копии, и у тебя покажет.

Гриша
Offline
Зарегистрирован: 27.04.2014

я вообще один из примеров в библиотеки засунул... чтоб не потерять, так компилятор мне при каждой компиляции орет, что типа "это не библиотека"... Некоторые библиотеки не подходят к некоторым версиям IDE - так тех версий IDE у меня 3... (все портабельные)...

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