Массовое объявление переменных

Тема в разделе "Arduino & Shields", создана пользователем user999, 2 мар 2017.

  1. user999

    user999 Гик

    Добрый день!

    Можно ли массово объявить глобальные переменные и константы, в начале скетча, например, циклом for

    Код (C++):
      for (int i=0; i < 20; i++) {
        #define Variablel_i    i
      }
    Может какие то другие варианты есть?
     
  2. AlexU

    AlexU Гуру

    Код (C++):
    #define
    -- это объявление макроса, а не переменной. Все макросы будут обработаны препроцессором до компиляции исходных текстов. Смотри: макросы gcc.
    В принципе можно написать макрос, который создаст нужное количество деклараций переменных, вот только вопрос -- зачем?
     
  3. user999

    user999 Гик

    У меня 20 пинов, реле, id, переменных которые нужно отправить на сервер и т.д.
    Универсальнее было бы, если бы я эти 20 не прописывал в скетче, а разом объявил. К тому же может поменяться не только их значение, но и количество.
    Удобнее было бы в начале прописать что то вроде
    Код (C++):
    int varPin[] = {2,1,15,34,7,9,4};
    int qVar = sizeof(varPin) / sizeof(int);
    А потом использовать в скетче
     
  4. AlexU

    AlexU Гуру

    А почему "что-то вроде"?
    Так и пишите, а потом используйте далее в коде.
     
  5. user999

    user999 Гик

    Так сам цикл не проходит, если его написать вне функции
     
  6. Unixon

    Unixon Оракул Модератор

    Код (C++):

    #define VAR_PIN_SENSOR 0
    #define VAR_PIN_MOTOR 1
    #define VAR_PIN_RELAY 2
    #define VAR_PIN_LIGHT 3
    #define VAR_COUNT 4

    const uint8_t PINS[VAR_COUNT] = {2, 3, 9, 11};
    const uint8_t PINMODE[VAR_COUNT] = {INPUT, OUTPUT, OUTPUT, OUTPUT};

    void foo()
    {
      for (uint8_t i=0; i<VAR_COUNT; i++)
      {
        pinMode(PINS[i], PINMODE[i]);
        if (PINMODE[i]) digitalWrite(PINS[i], LOW);
      }
    }

    void bar()
    {
      Serial.println(analogRead(PINS[VAR_PIN_SENSOR]));
    }

    void zoo()
    {
      for (uint8_t i=0; i<VAR_COUNT; i++)
      {
        while (!Serial.available()) {};
        PINS[i] = Serial.read();
      }
    }
     
     
  7. user999

    user999 Гик

    Эти циклы у вас внутри функций. Так у меня получается.
    У меня не получается циклом:
    1. Объявить
    Код (C++):
    #define VAR_PIN_1
    #define VAR_PIN_2
    #define VAR_PIN_3
    и т.д.
    2. Глобальные переменные
    Код (C++):
    int light_1 = 0;
    int light_2 = 1;
    int light_2 = 2;
    и т.д.
     
  8. rkit

    rkit Гуру

    Никак. Метапрограммированим грузиться вам рано.
     
  9. AlexU

    AlexU Гуру

    Чепухой занимаетесь.
    Допустим расскажу Вам как через макросы создавать декларации переменных (да, любые декларации) в нужном количестве, типа:
    Код (C++):
    int light_0 = 0;
    int light_1 = 1;
    int light_2 = 2;
    А дальше что? Вам же эти переменные в коде придётся использовать -- значит каждый раз как зададите новое количество переменных, будете переписывать исходный код.
    Есть же хорошее решение, которое Вы сами изложили в посте #3:
    Код (C++):
    int varPin[] = {2,1,15,34,7,9,4};
    int qVar = sizeof(varPin) / sizeof(int);
    Чем это решение Вас не устраивает?
     
  10. Unixon

    Unixon Оракул Модератор

    А зачем оно вам в таком виде? Ведь какую то другую задачу решаете... при том негодными методами.
     
  11. user999

    user999 Гик

    Ладно. Задам вопрос по-другому. Вот код, который до void setup(), Как его сократить или преобразовать. При том, что сейчас он рассчитан на 7 стеллажей, а будет 10 или более, т.е. код еще увеличится.
    Код (C++):
    #include <Ethernet.h>
    #include <EthernetClient.h>
    #include <DS3231.h>
    DS3231  rtc(SDA, SCL);  // часы на I2C: 20 (SDA) и 21 (SCL)
    Time t;

    #define ID_GREENHOUSE 1 // id теплицы

    /* ВКЛЮЧЕНИЕ пина/реле/светодиода
    *  включение светодиода  ON = HIGH
    *  включение реле        ON = LOW
    */

    #define ON            LOW
    #define OFF           HIGH

    /* ПИНЫ для РЕЛЕ для ОСВЕЩЕНИЯ */
    #define SHELF_LIGHT_1       22
    #define SHELF_LIGHT_2       24
    #define SHELF_LIGHT_3       26
    #define SHELF_LIGHT_4       28
    #define SHELF_LIGHT_5       30
    #define SHELF_LIGHT_6       32
    #define SHELF_LIGHT_13      34

    /* ID светильников, установленных на стеллажах */
    #define ID_SENSOR_LIGHT_1   91
    #define ID_SENSOR_LIGHT_2   92
    #define ID_SENSOR_LIGHT_3   93
    #define ID_SENSOR_LIGHT_4   94
    #define ID_SENSOR_LIGHT_5   95
    #define ID_SENSOR_LIGHT_6   96
    #define ID_SENSOR_LIGHT_13  66

    /* ПИНЫ для датчиков тока для ОСВЕЩЕНИЯ */
    #define SHELF_TOK_1         23
    #define SHELF_TOK_2         25
    #define SHELF_TOK_3         27
    #define SHELF_TOK_4         29
    #define SHELF_TOK_5         31
    #define SHELF_TOK_6         33
    #define SHELF_TOK_13        35

    /*
        Заняты ETHERNET Shild
        SPI: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS).
    */

    long          startSetTime;
    unsigned long secondTime, hourNow, minuteNow, secondNow,

                  secondTimeStart1, secondTimeStop1,
                  hourStart1, minuteStart1, secondStart1,
                  hourStop1, minuteStop1, secondStop1,
                 
                  secondTimeStart2, secondTimeStop2,
                  hourStart2, minuteStart2, secondStart2,
                  hourStop2, minuteStop2, secondStop2,
                               
                  secondTimeStart3, secondTimeStop3,
                  hourStart3, minuteStart3, secondStart3,
                  hourStop3, minuteStop3, secondStop3,
                               
                  secondTimeStart4, secondTimeStop4,
                  hourStart4, minuteStart4, secondStart4,
                  hourStop4, minuteStop4, secondStop4,
                               
                  secondTimeStart5, secondTimeStop5,
                  hourStart5, minuteStart5, secondStart5,
                  hourStop5, minuteStop5, secondStop5,
                               
                  secondTimeStart6, secondTimeStop6,
                  hourStart6, minuteStart6, secondStart6,
                  hourStop6, minuteStop6, secondStop6,
                               
                  secondTimeStart13, secondTimeStop13,
                  hourStart13, minuteStart13, secondStart13,
                  hourStop13, minuteStop13, secondStop13
                  ;  
    /*
    * Необходимо перечислить переменные,
    * которые будут получаться с сервера и
    * создать меременную с массивом из их названий
    */

    long    startReadVar;
    int     timeReadVarToServer = 60; // Время в секундах, через которые обновляются данные в переменных
    String  lightOn1            = "";
    String  lightOff1           = "";
    String  lightOn2            = "";
    String  lightOff2           = "";
    String  lightOn3            = "";
    String  lightOff3           = "";
    String  lightOn4            = "";
    String  lightOff4           = "";
    String  lightOn5            = "";
    String  lightOff5           = "";
    String  lightOn6            = "";
    String  lightOff6           = "";
    String  lightOn13           = "";
    String  lightOff13          = "";
    char*   varArray[]          = {"lightOn1", "lightOff1",
                                   "lightOn2", "lightOff2",
                                   "lightOn3", "lightOff3",
                                   "lightOn4", "lightOff4",
                                   "lightOn5", "lightOff5",
                                   "lightOn6", "lightOff6",
                                   "lightOn13", "lightOff13"};
     
  12. rkit

    rkit Гуру

    Вот это всё безобразие сложить в структуру или класс.
     
  13. Unixon

    Unixon Оракул Модератор

    А структуру в массив.
     
  14. Unixon

    Unixon Оракул Модератор

    @user999, а зачем вам столько переменных на 1-2 метки времени?
     
  15. Unixon

    Unixon Оракул Модератор

    Строки типа "LightOn<номер>" вообще хранить не нужно. Префикс в const char [], номер парсить.
     
  16. user999

    user999 Гик

    На каждом стеллаже свой режим.
    часы, минуты, секунды в следующем куске кода использую
    Код (C++):
      if (lightOn6.length() > 0 && lightOff6.length() > 0) {
        char tempOn6[lightOn6.length()+1];
        lightOn6.toCharArray(tempOn6, lightOn6.length()+1);
        char tempOff6[lightOff6.length()+1];
        lightOff6.toCharArray(tempOff6, lightOff6.length()+1);
        sscanf (tempOn6, "%d:%d:%d", &hourStart6, &minuteStart6, &secondStart6);
        secondTimeStart6 = hourStart6 *60 * 60 + minuteStart6 * 60 + secondStart6;
        sscanf (tempOff6, "%d:%d:%d", &hourStop6, &minuteStop6, &secondStop6);
        secondTimeStop6 = hourStop6 * 60 * 60  + minuteStop6 * 60 + secondStop6;
        if(secondTime >= secondTimeStart6 && secondTime <= secondTimeStop6){
          if(digitalRead(SHELF_LIGHT_6)==OFF) {
            digitalWrite(SHELF_LIGHT_6, ON);
            sendStatus(ID_SENSOR_LIGHT_6,1,0); //Отправляем данные на сервер
          }
        } else {
          if(digitalRead(SHELF_LIGHT_6)==ON) {
            digitalWrite(SHELF_LIGHT_6, OFF);
            sendStatus(ID_SENSOR_LIGHT_6,0,0); //Отправляем данные на сервер
          }
        }
      }
     
  17. user999

    user999 Гик

    Если не сложно приведите пример. Я пробовал, но у меня ошибка выскакивает, что не объявлена переменная. Поэтому и задал вопрос
     
  18. Unixon

    Unixon Оракул Модератор

    Храните только саму метку времени (класс Time, тип time_t и т.п.), а в часы-минуты-секунды раскладывайте непосредственно перед выводом.
     
  19. user999

    user999 Гик

    т.е. просто их убрать из глобальных внутрь функции?
     
  20. Unixon

    Unixon Оракул Модератор

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