Нужна помощь!

GennOk
Offline
Зарегистрирован: 30.03.2015

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

#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <FastLED.h>

#define NUM_LEDS 108 // по 26 на цифру и 4 на разделительные точки
#define LED_TYPE WS2812
#define COLOR_ORDER GRB // Определение цвета ленты
#define BRIGHTNESS 150
#define LED_PIN 6 // Цифровой pin для led соединения

CRGB leds[NUM_LEDS]; // Определение LED ленты

byte digits[10][26] = {
  {
    0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  }
  , // Цифра 0
  {
    0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1
  }
  , // Цифра 1
  {
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0
  }
  , // Цифра 2
  {
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1
  }
  , // Цифра 3
  {
    1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1
  }
  , // Цифра 4
  {
    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1
  }
  , // Цифра 5
  {
    1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  }
  , // Цифра 6
  {
    0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1
  }
  , // Цифра 7
  {
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  }
  , // Цифра 8
  {
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1
  }
}; // Цифра 9 | 2D Массив для цифр из 7 сегментов

byte firstdigit[2][10] = {
  {
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  }
  , // Цифра 0 первое число

  {
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  }
}; // Цифра 1 первое число | 2D Массив для цифр из 7 сегментов

bool Dot = true; //Dot состояние

bool DST = false; //DST состояние
int last_digit = 0;
//long ledColor = CRGB::DarkOrchid; // Color used (in hex)
long ledColor = CRGB::MediumVioletRed;
long ColorTable[16] = {
  CRGB::Amethyst,
  CRGB::Aqua,
  CRGB::Blue,
  CRGB::Chartreuse,
  CRGB::DarkGreen,
  CRGB::DarkMagenta,
  CRGB::DarkOrange,
  CRGB::DeepPink,
  CRGB::Fuchsia,
  CRGB::Gold,
  CRGB::GreenYellow,
  CRGB::LightCoral,
  CRGB::Tomato,
  CRGB::Salmon,
  CRGB::Red,
  CRGB::Orchid
};

enum {CLOCK, SECONDS, YEAR, DATE, END}; // режимы отображения. Метка END всегда последняя
byte currentMode = CLOCK; // текущий режим (после включения питания)
unsigned int interval = 20; // интервал между сменой показаний, сек

void setup() {

  Serial.begin(9600);

  Wire.begin();
  FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
  // FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness( BRIGHTNESS );
  pinMode(2, INPUT_PULLUP); // Настройка DST привязка кнопки к pin
  pinMode(4, INPUT_PULLUP); // Настройка Минуты привязка кнопки к pin
  pinMode(5, INPUT_PULLUP); // Настройка Часы привязка кнопки к pin

}

// Проверка сенсора света и установка соответсвующего уровня
void BrightnessCheck() {
  const byte sensorPin = 3; // Сенсор света PIN
  const byte brightnessLow = 75; // Уровень слабого освещения
  const byte brightnessHigh = 100; // Уровень сильного освещения
  int sensorValue = digitalRead(sensorPin); // Чтение данных с сенсора
  if (sensorValue == 0) {
    Serial.println("Brightness High");
    LEDS.setBrightness(brightnessHigh);
  }

  else {
    Serial.println("Brightness Low");
    LEDS.setBrightness(brightnessLow);
  }

};

// Получить время в один номер
int GetTime() {
  tmElements_t Now;
  RTC.read(Now);
  //time_t Now = RTC.Now();// Получение текущего времени и сохранение его в объект DateTime
  int hour = Now.Hour;
  int minutes = Now.Minute;
  int second = Now.Second;
  if (second % 2 == 0) {
    Dot = false;
  }
  else {
    Dot = true;
  };
  return (hour * 100 + minutes);
};

void DSTcheck() {

  int buttonDST = digitalRead(2);

  Serial.print("DST is: ");
  Serial.println(DST);

  if (buttonDST == LOW) {

    if (DST) {

      DST = false;

      Serial.print("Switching DST to: ");
      Serial.println(DST);

    }

    else if (!DST) {

      DST = true;

      Serial.print("Switching DST to: ");
      Serial.println(DST);

    };

    delay(500);

  };

}

// Конвертирование времени в массив необходимый для дисплея

void TimeToArray() {

  int Now = GetTime(); // Get time

  int cursor = 108; //116

  Serial.print("Time is: ");
  Serial.println(Now);

  if (Dot) {
    leds[52] = ledColor;
    leds[53] = ledColor;
    leds[54] = ledColor;
    leds[55] = ledColor;
    leds[56] = ledColor;
    //leds[48]=ledColor;
  }

  else {

    leds[52] = 0x000000;
    leds[53] = 0x000000;
    leds[54] = 0x000000;
    leds[55] = 0x000000;
    leds[56] = 0x000000;
    //leds[48]=0x000000;

  };

  for (int i = 1; i <= 4; i++) {

    int digit = Now % 10; // get last digit in time

    if (i == 1) {

      cursor = 82; //82

      Serial.print("Digit 4 is : ");
      Serial.print(digit);
      Serial.print(", the array is : ");

      for (int k = 0; k <= 25; k++) {

        Serial.print(digits[digit][k]);

        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }

        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };

        cursor ++;

      }; // fin for

      Serial.println();
      if (digit != last_digit)
      { fadefonction();
        ledColor = ColorTable[random(16)];
      }
      last_digit = digit;

    }// fin if

    else if (i == 2) {

      cursor = 56;

      Serial.print("Digit 3 is : ");
      Serial.print(digit);
      Serial.print(", the array is : ");

      for (int k = 0; k <= 25; k++) {

        Serial.print(digits[digit][k]);

        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }

        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };

        cursor ++;

      };

      Serial.println();

    }

    else if (i == 3) {

      cursor = 26;

      Serial.print("Digit 2 is : ");
      Serial.print(digit);
      Serial.print(", the array is : ");

      for (int k = 0; k <= 25; k++) {

        Serial.print(digits[digit][k]);

        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }

        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };

        cursor ++;

      };

      Serial.println();

    }

    else if (i == 4) {

      cursor = 0;

      Serial.print("Digit 1 is : ");
      Serial.print(digit);
      Serial.print(", the array is : ");

      for (int k = 0; k <= 25; k++) {
        Serial.print(digits[digit][k]);
        if (digits[digit][k] == 1) {
          leds[cursor] = ledColor;
        }
        else if (digits[digit][k] == 0) {
          leds[cursor] = 0x000000;
        };
        cursor ++;
      };
      // Serial.println();

    };
    Now /= 10;
  };
};
void TimeAdjust() {
  int buttonH = digitalRead(5);
  int buttonM = digitalRead(4);
  if (buttonH == LOW || buttonM == LOW) {
    delay(500);
    tmElements_t Now;
    RTC.read(Now);
    int hour = Now.Hour;
    int minutes = Now.Minute;
    if (buttonH == LOW) {
      if (Now.Hour == 24) {
        Now.Hour = 1;
      }
      else {
        Now.Hour += 1;
      };
    }
    else {
      if (Now.Minute == 59) {
        Now.Minute = 0;
      }
      else {
        Now.Minute += 1;
      };
    };

    RTC.write(Now);
  }
}
void fadeall() {
  for (int m = 0; m < NUM_LEDS; m++) {
    leds[m].nscale8(250);
  }
}

void fadefonction () {
  static uint8_t hue = 0;
  // First slide the led in one direction
  for (int i = 0; i < NUM_LEDS; i++) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
  }

  // Now go in the other direction.
  for (int i = (NUM_LEDS) - 1; i >= 0; i--) {
    // Set the i'th led to red
    leds[i] = CHSV(hue++, 255, 255);
    // Show the leds
    FastLED.show();
    // now that we've shown the leds, reset the i'th led to black
    // leds[i] = CRGB::Black;
    fadeall();
    // Wait a little bit before we loop around and do it again
    delay(10);
  }
}
static unsigned long timeStamp; // переменная для хранения отметки времени
void loop() // Main loop
if (millis() - timeStamp > interval * 1000)
{
  switch (currentMode)
  {
    case CLOCK:
      displayClock();  // функция вывода времени
      break;


    case SECONDS:
      displaySeconds();
      break;


    case YEAR:
      displayYear();
      break;


    case DATE:
      displayDate();
      break;
  }
  currentMode++; // переходим в следующий режим
  if (currentMode) == END currentMode = 0; // зацикливаем режимы
  timeStamp = millis();
}

void displayClock() // функция вывода времени
{
  DSTcheck(); // Check DST
  TimeAdjust(); // Check to se if time is geting modified
  TimeToArray();// Get leds array with required configuration
  FastLED.show();// Display leds array

  //BrightnessCheck(); // Check brightness
 
  /*float t = RTC.temperature();
  float celsius = t / 4.0;
  Serial.println();
  Serial.print("Temp is : ");
  Serial.print(celsius);
  Serial.println();*/

}

 

GennOk
Offline
Зарегистрирован: 30.03.2015

выдает вот такую ошибку : mybigclock.ino:393:1: error: expected initializer before 'if'
Ошибка компиляции.

Araris
Offline
Зарегистрирован: 09.11.2012

У Вас содержимое void loop() не заключено в { }

 

UPD: ставить точку с запятой после фигурной скобки ( }; ) необязательно, оно и без того нормально скомпилируется. Это не есть ошибка, просто лишнее.

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

А учебник по языку Си прочитать?

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

Araris пишет:

У Вас содержимое void loop() не заключено в { }

я закрыл склад скобок на переучёт.

GennOk
Offline
Зарегистрирован: 30.03.2015

Прошу прощения. Но после скобок

void loop()
{ 
  if (millis() - timeStamp > interval * 1000)
{
  switch (currentMode)
  {
    case CLOCK:
      displayClock();  // функция вывода времени
      break;


    case SECONDS:
      displaySeconds();
      break;


    case YEAR:
      displayYear();
      break;


    case DATE:
      displayDate();
      break;
  }
  currentMode++; // переходим в следующий режим
  if (currentMode) == END currentMode = 0; // зацикливаем режимы
  timeStamp = millis();
}
}

началось еще хуже.

mybigclock.ino: In function 'void loop()':
mybigclock.ino:406:22: error: 'displaySeconds' was not declared in this scope
mybigclock.ino:411:19: error: 'displayYear' was not declared in this scope
mybigclock.ino:416:19: error: 'displayDate' was not declared in this scope
mybigclock.ino:420:20: error: expected primary-expression before '==' token
mybigclock.ino:420:27: error: expected ';' before 'currentMode'
Ошибка компиляции.

Куда смотреть? Про книгу - не катит...

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

GennOk пишет:

Про книгу - не катит...

Даже так? 

GennOk пишет:

Куда смотреть? 

Ну, тогда смотрите футбол.

GennOk
Offline
Зарегистрирован: 30.03.2015

Ладно. Пойду другим путем.

На просторах инета нашел интересный проект "Большие 7 сегментные настенные часы" (кому интересно http://instructables.info/bolshie-nastennyie-chasyi-na-arduino/). После поиска как и из чего - был запущен в работу и мой. С Ардуино общаюсь не более года. В программировании не силен. Там же на просторах были найдены несколько скетчей, методом тыка один переделан под свой проект. Он сейчас и залит. У меня и лента и количество диодов немного иное. Получилось так: https://youtu.be/yhxRfyJSQ50 и https://youtu.be/qKeMa88LMCc Часы показывают. Но хотел чтобы показывалась еще и дата, а в дальнейшем и температура. Вот пытаюсь разобраться в другом скетче, он у меня почему-то не работает, вроде там эти процедуры прописаны. Вот как-то так.

rapidshe
Offline
Зарегистрирован: 31.12.2015

mybigclock.ino:406:22: error: 'displaySeconds' was not declared in this scope
mybigclock.ino:411:19: error: 'displayYear' was not declared in this scope
mybigclock.ino:416:19: error: 'displayDate' was not declared in this scope

значит что эти функции не объявлены. что то не перенесли из первоисточника или какуюнибудь библиотеку потеряли

mybigclock.ino:420:20: error: expected primary-expression before '==' token
mybigclock.ino:420:27: error: expected ';' before 'currentMode'

хоть и в выложенном коде номера строчек другие(видимо не все скопировали сюда), подозреваю что проблема в строчке 415

я бы попробовал для начала так. но я любитель, в отличие от вышеотметившихся дядек)

if (currentMode == END) {currentMode = 0;}

James
Offline
Зарегистрирован: 26.02.2016
а забить сообщение компилятора в переводчик не?
функции не объявлены, в case должна быть переменная.
currentMode++ , и при этом они у тебя текстовые. серьезно? 
в последней проверке условия вообще чушь

 

James
Offline
Зарегистрирован: 26.02.2016
void loop()
{ 
  if (millis() - timeStamp > interval * 1000)
{
  switch (currentMode)
  {
    case 1: //       clock
      displayClock();  // функция вывода времени
      break;


    case 2://          SECONDS
      displaySeconds();
      break;


    case 3:// YEAR
      displayYear();
      break;


    case 4:// DATE
      displayDate();
      break;
  }
  currentMode++; // переходим в следующий режим
  if (currentMode ==4) {currentMode = 1; // зацикливаем режимы
  timeStamp = millis();
}
}

 

James
Offline
Зарегистрирован: 26.02.2016

а с функциями сами разбирайтесь

GennOk
Offline
Зарегистрирован: 30.03.2015

ага. вот теперь понятно!  написать такое сам наврядли смогу, попробую поискать еще где нибудь. Ну или кто поможет с написанием...

Спасибо!

GennOk
Offline
Зарегистрирован: 30.03.2015

упс! пока отмечал на 8-е пришли еще сообщения!

 

GennOk
Offline
Зарегистрирован: 30.03.2015
void loop()
{ 
  if (millis() - timeStamp > interval * 1000)
{
  switch (currentMode)
  {
    case 1: //       clock
      displayClock();  // функция вывода времени
      break;


    case 2://          SECONDS
      displaySeconds();
      break;


    case 3:// YEAR
      displayYear();
      break;


    case 4:// DATE
      displayDate();
      break;
  }
  currentMode++; // переходим в следующий режим
  if (currentMode ==4) {currentMode = 1; // зацикливаем режимы
  timeStamp = millis();
}
}

Вечер добрый! Вставляю ваш отрезок кода, показывает ошибку

: In function 'void loop()': : error: expected '}' at end of input

Может где-то я не правильно скопировал?
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Закрывающей скобки не хватает.

GennOk
Offline
Зарегистрирован: 30.03.2015

Спасибо! почему-то показалось что все на месте...