помогите по братски ошибка компиляции на ардуино нано

Тема в разделе "Arduino & Shields", создана пользователем ардуинщик, 31 авг 2017.

  1. ВОТ ВАМ СКЕЧТ


    //-------НАСТРОЙКИ---------
    #define coin_amount 5 // число монет, которые нужно распознать
    float coin_value[coin_amount] = {
    0.5, 1.0, 2.0, 5.0, 10.0}; // стоимость монет
    String currency = "RUB"; // валюта (английские буквы!!!)
    int stb_time = 10000; // время бездействия, через которое система уйдёт в сон (миллисекунды)
    //-------НАСТРОЙКИ---------

    int coin_signal[coin_amount]; // тут хранится значение сигнала для каждого размера монет
    int coin_quantity[coin_amount]; // количество монет
    byte empty_signal; // храним уровень пустого сигнала
    unsigned long standby_timer, reset_timer; // таймеры
    float summ_money = 0; // сумма монет в копилке

    //-------БИБЛИОТЕКИ---------
    #include "LowPower.h"
    #include "EEPROMex.h"
    #include "LCD_1602_RUS.h"
    //-------БИБЛИОТЕКИ---------

    LCD_1602_RUS lcd(0x27, 16, 2); // создать дисплей
    boolean recogn_flag, sleep_flag = true; // флажки
    //-------КНОПКИ---------
    byte button = 2; // кнопка "проснуться"
    byte calibr_button = 3; // скрытая кнопка калибровкии сброса
    byte disp_power = 12; // питание дисплея
    byte LEDpin = 11; // питание светодиода
    byte IRpin = 17; // питание фототранзистора
    byte IRsens = 14; // сигнал фототранзистора
    //-------КНОПКИ---------
    int sens_signal, last_sens_signal;
    boolean coin_flag = false;

    void setup() {
    Serial.begin(9600); // открыть порт для связи с ПК для отладки
    delay(500);

    // подтягиваем кнопки
    pinMode(button, INPUT_PULLUP);
    pinMode(calibr_button, INPUT_PULLUP);

    // пины питания как выходы
    pinMode(disp_power, OUTPUT);
    pinMode(LEDpin, OUTPUT);
    pinMode(IRpin, OUTPUT);

    // подать питание на дисплей и датчик
    digitalWrite(disp_power, 1);
    digitalWrite(LEDpin, 1);
    digitalWrite(IRpin, 1);

    // подключить прерывание
    attachInterrupt(0, wake_up, CHANGE);

    empty_signal = analogRead(IRsens); // считать пустой (опорный) сигнал

    // инициализация дисплея
    lcd.init();
    lcd.backlight();

    if (!digitalRead(calibr_button)) { // если при запуске нажата кнопка калибровки
    lcd.clear();
    lcd.setCursor(3, 0);
    lcd.print(L"Сервис");
    delay(500);
    reset_timer = millis();
    while (1) { // бесконечный цикл
    if (millis() - reset_timer > 3000) { // если кнопка всё ещё удерживается и прошло 3 секунды
    // очистить количество монет
    for (byte i = 0; i < coin_amount; i++) {
    coin_quantity = 0;
    EEPROM.writeInt(20 + i * 2, 0);
    }
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(L"Память очищена");
    delay(100);
    }
    if (digitalRead(calibr_button)) { // если отпустили кнопку, перейти к калибровке
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(L"Калибровка");
    break;
    }
    }
    while (1) {
    for (byte i = 0; i < coin_amount; i++) {
    lcd.setCursor(0, 1);
    lcd.print(coin_value); // отобразить цену монеты, размер которой калибруется
    lcd.setCursor(13, 1);
    lcd.print(currency); // отобразить валюту
    last_sens_signal = empty_signal;
    while (1) {
    sens_signal = analogRead(IRsens); // считать датчик
    if (sens_signal > last_sens_signal) last_sens_signal = sens_signal; // если текущее значение больше предыдущего
    if (sens_signal - empty_signal > 3) coin_flag = true; // если значение упало почти до "пустого", считать что монета улетела
    if (coin_flag && (abs(sens_signal - empty_signal)) < 2) { // если монета точно улетела
    coin_signal = last_sens_signal; // записать максимальное значение в память
    EEPROM.writeInt(i * 2, coin_signal);
    coin_flag = false;
    break;
    }
    }
    }
    break;
    }
    }

    // при старте системы считать из памяти сигналы монет для дальнейшей работы, а также их количество в банке
    for (byte i = 0; i < coin_amount; i++) {
    coin_signal = EEPROM.readInt(i * 2);
    coin_quantity = EEPROM.readInt(20 + i * 2);
    summ_money += coin_quantity * coin_value; // ну и сумму сразу посчитать, как произведение цены монеты на количество
    }

    /*
    // для отладки, вывести сигналы монет в порт
    for (byte i = 0; i < coin_amount; i++) {
    Serial.println(coin_signal);
    }
    */
    standby_timer = millis(); // обнулить таймер ухода в сон
    }

    void loop() {
    if (sleep_flag) { // если проснулись после сна, инициализировать дисплей и вывести текст, сумму и валюту
    delay(500);
    lcd.init();
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(L"На яхту");
    lcd.setCursor(0, 1);
    lcd.print(summ_money);
    lcd.setCursor(13, 1);
    lcd.print(currency);
    empty_signal = analogRead(IRsens);
    sleep_flag = false;
    }

    // далее работаем в бесконечном цикле
    last_sens_signal = empty_signal;
    while (1) {
    sens_signal = analogRead(IRsens); // далее такой же алгоритм, как при калибровке
    if (sens_signal > last_sens_signal) last_sens_signal = sens_signal;
    if (sens_signal - empty_signal > 3) coin_flag = true;
    if (coin_flag && (abs(sens_signal - empty_signal)) < 2) {
    recogn_flag = false; // флажок ошибки, пока что не используется
    // в общем нашли максимум для пролетевшей монетки, записали в last_sens_signal
    // далее начинаем сравнивать со значениями для монет, хранящимися в памяти
    for (byte i = 0; i < coin_amount; i++) {
    int delta = abs(last_sens_signal - coin_signal); // вот самое главное! ищем АБСОЛЮТНОЕ (то бишь по модулю)
    // значение разности полученного сигнала с нашими значениями из памяти
    if (delta < 30) { // и вот тут если эта разность попадает в диапазон, то считаем монетку распознанной
    summ_money += coin_value; // к сумме тупо прибавляем цену монетки (дада, сумма считается двумя разными способами. При старте системы суммой всех монет, а тут прибавление
    lcd.setCursor(0, 1);
    lcd.print(summ_money);
    coin_quantity++; // для распознанного номера монетки прибавляем количество
    recogn_flag = true;
    break;
    }
    }
    coin_flag = false;
    standby_timer = millis(); // сбросить таймер
    break;
    }

    // если ничего не делали, времят аймера вышло, спим
    if (millis() - standby_timer > stb_time) {
    good_night();
    break;
    }

    // если монетка вставлена (замыкает контакты) и удерживается 2 секунды
    while (!digitalRead(button)) {
    if (millis() - standby_timer > 2000) {
    lcd.clear();

    // отобразить на дисплее: сверху цены монет (округлено до целых!!!!), снизу их количество
    for (byte i = 0; i < coin_amount; i++) {
    lcd.setCursor(i * 3, 0);
    lcd.print((int)coin_value);
    lcd.setCursor(i * 3, 1);
    lcd.print(coin_quantity);
    }
    }
    }
    }
    }

    // функция сна
    void good_night() {
    // перед тем как пойти спать, записываем в EEPROM новые полученные количества монет по адресам начиная с 20го (пук кек)
    for (byte i = 0; i < coin_amount; i++) {
    EEPROM.updateInt(20 + i * 2, coin_quantity);
    }
    sleep_flag = true;
    // вырубить питание со всех дисплеев и датчиков
    digitalWrite(disp_power, 0);
    digitalWrite(LEDpin, 0);
    digitalWrite(IRpin, 0);
    delay(100);
    // и вот теперь спать
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
    }

    // просыпаемся по ПРЕРЫВАНИЮ (эта функция - обработчик прерывания)
    void wake_up() {
    // возвращаем питание на дисплей и датчик
    digitalWrite(disp_power, 1);
    digitalWrite(LEDpin, 1);
    digitalWrite(IRpin, 1);
    standby_timer = millis(); // и обнуляем таймер
    }
     
    Последнее редактирование: 31 авг 2017
  2. Igor68

    Igor68 Гуру

    Простите за повторение, но ваше читать нет сил... вставляйте код:
    Код (C++):

    //-------НАСТРОЙКИ---------
    #define coin_amount 5 // число монет, которые нужно распознать
    float coin_value[coin_amount] = {
    0.5, 1.0, 2.0, 5.0, 10.0}; // стоимость монет
    String currency = "RUB"; // валюта (английские буквы!!!)
    int stb_time = 10000; // время бездействия, через которое система уйдёт в сон (миллисекунды)
    //-------НАСТРОЙКИ---------

    int coin_signal[coin_amount]; // тут хранится значение сигнала для каждого размера монет
    int coin_quantity[coin_amount]; // количество монет
    byte empty_signal; // храним уровень пустого сигнала
    unsigned long standby_timer, reset_timer; // таймеры
    float summ_money = 0; // сумма монет в копилке

    //-------БИБЛИОТЕКИ---------
    #include "LowPower.h"
    #include "EEPROMex.h"
    #include "LCD_1602_RUS.h"
    //-------БИБЛИОТЕКИ---------

    LCD_1602_RUS lcd(0x27, 16, 2); // создать дисплей
    boolean recogn_flag, sleep_flag = true; // флажки
    //-------КНОПКИ---------
    byte button = 2; // кнопка "проснуться"
    byte calibr_button = 3; // скрытая кнопка калибровкии сброса
    byte disp_power = 12; // питание дисплея
    byte LEDpin = 11; // питание светодиода
    byte IRpin = 17; // питание фототранзистора
    byte IRsens = 14; // сигнал фототранзистора
    //-------КНОПКИ---------
    int sens_signal, last_sens_signal;
    boolean coin_flag = false;

    void setup() {
    Serial.begin(9600); // открыть порт для связи с ПК для отладки
    delay(500);

    // подтягиваем кнопки
    pinMode(button, INPUT_PULLUP);
    pinMode(calibr_button, INPUT_PULLUP);

    // пины питания как выходы
    pinMode(disp_power, OUTPUT);
    pinMode(LEDpin, OUTPUT);
    pinMode(IRpin, OUTPUT);

    // подать питание на дисплей и датчик
    digitalWrite(disp_power, 1);
    digitalWrite(LEDpin, 1);
    digitalWrite(IRpin, 1);

    // подключить прерывание
    attachInterrupt(0, wake_up, CHANGE);

    empty_signal = analogRead(IRsens); // считать пустой (опорный) сигнал

    // инициализация дисплея
    lcd.init();
    lcd.backlight();

    if (!digitalRead(calibr_button)) { // если при запуске нажата кнопка калибровки
    lcd.clear();
    lcd.setCursor(3, 0);
    lcd.print(L"Сервис");
    delay(500);
    reset_timer = millis();
    while (1) { // бесконечный цикл
    if (millis() - reset_timer > 3000) { // если кнопка всё ещё удерживается и прошло 3 секунды
    // очистить количество монет
    for (byte i = 0; i < coin_amount; i++) {
    coin_quantity[I] = 0;
    EEPROM.writeInt(20 + i * 2, 0);
    }
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(L"Память очищена");
    delay(100);
    }
    if (digitalRead(calibr_button)) { // если отпустили кнопку, перейти к калибровке
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(L"Калибровка");
    break;
    }
    }
    while (1) {
    for (byte i = 0; i < coin_amount; i++) {
    lcd.setCursor(0, 1);
    lcd.print(coin_value[I]); // отобразить цену монеты, размер которой калибруется
    lcd.setCursor(13, 1);
    lcd.print(currency); // отобразить валюту
    last_sens_signal = empty_signal;
    while (1) {
    sens_signal = analogRead(IRsens); // считать датчик
    if (sens_signal > last_sens_signal) last_sens_signal = sens_signal; // если текущее значение больше предыдущего
    if (sens_signal - empty_signal > 3) coin_flag = true; // если значение упало почти до "пустого", считать что монета улетела
    if (coin_flag && (abs(sens_signal - empty_signal)) < 2) { // если монета точно улетела
    coin_signal[I] = last_sens_signal; // записать максимальное значение в память
    EEPROM.writeInt(i * 2, coin_signal[I]);
    coin_flag = false;
    break;
    }
    }
    }
    break;
    }
    }

    // при старте системы считать из памяти сигналы монет для дальнейшей работы, а также их количество в банке
    for (byte i = 0; i < coin_amount; i++) {
    coin_signal[I] = EEPROM.readInt(i * 2);
    coin_quantity[I] = EEPROM.readInt(20 + i * 2);
    summ_money += coin_quantity[I] * coin_value[I]; // ну и сумму сразу посчитать, как произведение цены монеты на количество
    }

    /*
    // для отладки, вывести сигналы монет в порт
    for (byte i = 0; i < coin_amount; i++) {
    Serial.println(coin_signal[I]);
    }
    */

    standby_timer = millis(); // обнулить таймер ухода в сон
    }

    void loop() {
    if (sleep_flag) { // если проснулись после сна, инициализировать дисплей и вывести текст, сумму и валюту
    delay(500);
    lcd.init();
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(L"На яхту");
    lcd.setCursor(0, 1);
    lcd.print(summ_money);
    lcd.setCursor(13, 1);
    lcd.print(currency);
    empty_signal = analogRead(IRsens);
    sleep_flag = false;
    }

    // далее работаем в бесконечном цикле
    last_sens_signal = empty_signal;
    while (1) {
    sens_signal = analogRead(IRsens); // далее такой же алгоритм, как при калибровке
    if (sens_signal > last_sens_signal) last_sens_signal = sens_signal;
    if (sens_signal - empty_signal > 3) coin_flag = true;
    if (coin_flag && (abs(sens_signal - empty_signal)) < 2) {
    recogn_flag = false; // флажок ошибки, пока что не используется
    // в общем нашли максимум для пролетевшей монетки, записали в last_sens_signal
    // далее начинаем сравнивать со значениями для монет, хранящимися в памяти
    for (byte i = 0; i < coin_amount; i++) {
    int delta = abs(last_sens_signal - coin_signal[I]); // вот самое главное! ищем АБСОЛЮТНОЕ (то бишь по модулю)
    // значение разности полученного сигнала с нашими значениями из памяти
    if (delta < 30) { // и вот тут если эта разность попадает в диапазон, то считаем монетку распознанной
    summ_money += coin_value[I]; // к сумме тупо прибавляем цену монетки (дада, сумма считается двумя разными способами. При старте системы суммой всех монет, а тут прибавление
    lcd.setCursor(0, 1);
    lcd.print(summ_money);
    coin_quantity[I]++; // для распознанного номера монетки прибавляем количество
    recogn_flag = true;
    break;
    }
    }
    coin_flag = false;
    standby_timer = millis(); // сбросить таймер
    break;
    }

    // если ничего не делали, времят аймера вышло, спим
    if (millis() - standby_timer > stb_time) {
    good_night();
    break;
    }

    // если монетка вставлена (замыкает контакты) и удерживается 2 секунды
    while (!digitalRead(button)) {
    if (millis() - standby_timer > 2000) {
    lcd.clear();

    // отобразить на дисплее: сверху цены монет (округлено до целых!!!!), снизу их количество
    for (byte i = 0; i < coin_amount; i++) {
    lcd.setCursor(i * 3, 0);
    lcd.print((int)coin_value[I]);
    lcd.setCursor(i * 3, 1);
    lcd.print(coin_quantity[I]);
    }
    }
    }
    }
    }

    // функция сна
    void good_night() {
    // перед тем как пойти спать, записываем в EEPROM новые полученные количества монет по адресам начиная с 20го (пук кек)
    for (byte i = 0; i < coin_amount; i++) {
    EEPROM.updateInt(20 + i * 2, coin_quantity[I]);
    }
    sleep_flag = true;
    // вырубить питание со всех дисплеев и датчиков
    digitalWrite(disp_power, 0);
    digitalWrite(LEDpin, 0);
    digitalWrite(IRpin, 0);
    delay(100);
    // и вот теперь спать
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
    }

    // просыпаемся по ПРЕРЫВАНИЮ (эта функция - обработчик прерывания)
    void wake_up() {
    // возвращаем питание на дисплей и датчик
    digitalWrite(disp_power, 1);
    digitalWrite(LEDpin, 1);
    digitalWrite(IRpin, 1);
    standby_timer = millis(); // и обнуляем таймер
    }
     
    Сдделал для Вас, что бы самому прочитать
     
    Последнее редактирование: 5 сен 2017
  3. fogary

    fogary Гик

    Автор, где само сообщение об ошибке?
     
  4. b707

    b707 Гуру

    Автор, ,буквы i и I - прописная и строчная - это разные переменные! А вы их постоянно путаете.
    И что за грязь в последней строчке...
     
    Igor68 нравится это.
  5. всё равно не хочет пишет
    LCD_1602_RUS does not name a type

    2017-09-01_18-08-32.png
     
    Последнее редактирование модератором: 2 окт 2017
  6. b707

    b707 Гуру

    Это означает, что библиотека LCD_1602_RUS не установлена или установлена неправильно.
     
  7. Igor68

    Igor68 Гуру

    Постите за грязь в последней строчке... это я напачкал когда пытался скопировать "код", что дали в раздел код. Хотелось самому почитать то, что показали. А корректировать сообщения мне не всегда позволено.
     
    Последнее редактирование: 5 сен 2017
  8. Саня_76

    Саня_76 Нерд

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

    скечт опять не хочет
     
    Последнее редактирование модератором: 2 окт 2017
  10. fogary

    fogary Гик

  11. Саня_76

    Саня_76 Нерд

    Скачай в интернете
     
  12. Саня_76

    Саня_76 Нерд

    Набери " библиотека LiquidCrystal_I2C"
     
  13. ну скачать и как её установить

    скачал
     
    Последнее редактирование модератором: 2 окт 2017
  14. Саня_76

    Саня_76 Нерд

    Найди где у тебя папка ArduinoData, заходи в нее там будет папка staging заходишь в нее и потом заходишь в папку libraries и вот в эту папку кидай библиотеку (Не распаковывай)
     
  15. опять вроде библиотеки установил

    2017-10-01_11-23-11.png
     

    Вложения:

    Последнее редактирование модератором: 2 окт 2017
  16. fogary

    fogary Гик

    Цитата из ответа №4:
     
  17. дак как мне написать???????

    меня уже бесит эта прошивка
     
    Последнее редактирование модератором: 2 окт 2017
  18. DIYMan

    DIYMan Guest

    Бросайте это дело, не ваше оно ;) Вам пишут, что язык С++ - регистрозависим, вы это дело игнорируете. Не ваше оно, понять, что i и I - это имена двух РАЗНЫХ переменных, поэтому компилятор и ругается: вы сначала объявляете i, а потом - обращаетесь к несуществующей I. Тут вам не паскакаль, тащемта.
     
  19. причём здесь теплица

    лучше бы помог
     
    Последнее редактирование модератором: 2 окт 2017
  20. DIYMan

    DIYMan Guest

    Ты упоротый? Я тебе ещё раз попытаюсь помочь, повторив сообщение, может, дойдёт:

    Бросайте это дело, не ваше оно ;) Вам пишут, что язык С++ - регистрозависим, вы это дело игнорируете. Не ваше оно, понять, что i и I - это имена двух РАЗНЫХ переменных, поэтому компилятор и ругается: вы сначала объявляете i, а потом - обращаетесь к несуществующей I. Тут вам не паскакаль, тащемта.