Создание массива

Тема в разделе "Arduino & Shields", создана пользователем sqafaroff, 6 янв 2021.

  1. sqafaroff

    sqafaroff Нерд

    Помогите плиз написать цикл для итерации по массиву и печати serial.println() в мониторе их по отдельности.

    Например есть шесть чисел 111111111, 222222222, 333333333, ... 666666666. Они должны быть в массиве и код должен напечатать эти цифры в мониторе с промежутком в секунду.

    Заранее спасибо.
     
  2. parovoZZ

    parovoZZ Гуру

    а в цикле for () не получается перебрать?
     
    sqafaroff нравится это.
  3. sqafaroff

    sqafaroff Нерд

    В том то и дело что не могу написать ((
     
  4. sqafaroff

    sqafaroff Нерд

    Правильно написал?
    Код (C++):
    int timer = 1000;

    int i[] = {
    111111111, 222222222, 333333333, 444444444, 555555555, 666666666}; // массив с номерами

    int x = 6; // количество элементов в массиве

    void setup() {
     
    Serial.begin(9600);

    }

    void loop() {
     
    for (int a = 0; a < x; a++) {

    Serial.println(i[a]);

    delay(timer);

    if (a == x){
      break;
    }
    }
    }
     
  5. SergeiL

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

    Во первых:
    111111111, 222222222, 333333333, 444444444, 555555555, 666666666
    не лезут в int.
    int - это от -32767 до 32767. Прочитайте про типы данных.

    Во вторых на условие
    Код (C++):
    if (a == x){
      break;
    вы не попадете, так как выше у вас стоит:
    Код (C++):
    for(int a =0; a < x; a++)
    То есть при a == x вы не попадаете в for.
     
  6. sqafaroff

    sqafaroff Нерд

    Да, спасибо. Исправил тип в массиве на String. Все заработало. Прикрутил к кнопке печать массива в монитор. Все также заработало.
     
  7. parovoZZ

    parovoZZ Гуру

    я бы в массив добавил признак конца массива. Это универсальный способ вытягивать из массива информацию и при этом его можно редактировать безгранично не заморачиваясь с его длиной))))
     
  8. SergeiL

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

    Есть такая штука как оператор sizeof(), позволяющий определить размер любого статического массива. ;)
     
    Tatinek, sqafaroff и Andrey12 нравится это.
  9. sqafaroff

    sqafaroff Нерд

    В библиотеке Universal Telegram Bot есть директива
    Код (C++):
    #define CHAT_ID "123456789"
    ... как я понял, это константа. И вот в чем казус, пообщавшись с создателями этой библиотеки узнал что для того чтобы отправить сообщение больше чем одному получателю в Телеграм по его ID, нужно создать вот этот вот цикл итерации. Сказано, сделано. Нашел, подогнал под свой код. Все вроде ничего, НО! Не могу совместить
    Код (C++):
    Serial.println(i[a]); // Serial.println удалить
    с
    Код (C++):
    #define CHAT_ID "123456789" // Стоит в самом начале кода и указывает на ID получателя сообщения в Телеграмм
    ... Они говорят вставьте
    Код (C++):
    &ChatId[i]
    для того чтобы все заработало.

    Общий код:
    Код (C++):
    #include <WiFi.h>
    #include <UniversalTelegramBot.h>
    #include <ArduinoJson.h>
    #include <WiFiClientSecure.h>

    #define WIFI_SSID "xxxxx"
    #define WIFI_PASSWORD "xxxxxxx"
    #define BOT_TOKEN "xxxxxx:xxxxxxxxxxxxxxx"
    #define CHAT_ID // What type of this?

    const int PushButton = 0;
    int timer = 100;

    String i[] = {
    "111111111", "222222222", "333333333", "444444444", "555555555", "666666666"}; // CHAT_ID array

    int x = 6; // Amount of array elements

    WiFiClientSecure secured_client;
    UniversalTelegramBot bot(BOT_TOKEN, secured_client);

    void setup() {
        pinMode(PushButton, INPUT);

        Serial.begin(115200);
        Serial.println();

        Serial.print("Connecting to Wifi SSID ");
        Serial.print(WIFI_SSID);
        WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
        secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org
        while (WiFi.status() != WL_CONNECTED)
        {
        Serial.print(".");
        delay(500);
        }
        Serial.print("\nWiFi connected. IP address: ");
        Serial.println(WiFi.localIP());

        Serial.print("Retrieving time: ");
        configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP
        time_t now = time(nullptr);
        while (now < 24 * 3600)
        {
        Serial.print(".");
        delay(100);
        now = time(nullptr);
        }
        Serial.println(now);

        bot.sendMessage(CHAT_ID, "Bot successfully started!", ""); // How I can fix error here?
        }


    void loop() {
       
        int Push_button_state = digitalRead(PushButton);

        if (Push_button_state == HIGH)
        {
       
         } else {
          for (int a = 0; a < x; a++) {
          bot.sendMessage(CHAT_ID "Tuk Tuk", ""); // How I can fix error here?
          Serial.println(i[a]);
          delay(timer);

          if (a == x){
          break;
          }
          }
          }

    }
     
    Теперь думаю как это все оформить, чтобы по нажатию на кнопку, сообщение "улетало" адресатам из массива.
     
  10. SergeiL

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

    Давно это было, но помню, что создавал группу из себя и бота и чат ID этой группы использовал для отправки уведомлений.
    Тогда уведомления получают все участники группы.
     
    sqafaroff нравится это.
  11. sqafaroff

    sqafaroff Нерд

    Да, так возможно и сейчас. Разрабы так в принципе и предложили но это как то не то. Хочется в дальнейшем через веб морду прикрученную к ESP добавлять и удалять ID пользователей Телеграмма. А стало быть, чтобы оптимистично смотреть в будущее, нужно уже сейчас делать правильно.
     
  12. parovoZZ

    parovoZZ Гуру

    и как определить размер массива констант, которые определены через define?
     
  13. SergeiL

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

    Так дефайн или массив - выражайтесь яснее, лучше с примером :)
     
  14. Asper Daffy

    Asper Daffy Иксперд

    Покажи, как определён массив.
     
  15. sqafaroff

    sqafaroff Нерд

    Ну что же, всем спасибо. Все сделал )) нужно было вместо

    Код (C++):
    bot.sendMessage(CHAT_ID, "Tuk Tuk", "");
    Написать:

    Код (C++):
    bot.sendMessage(i[a], "Tuk Tuk", "");
    И все заработало.
     
  16. parovoZZ

    parovoZZ Гуру

    Например, так:
    Код (C++):
    #define SSD1306_INITIALIZATION_DATA_ARRAY { \
            0x02, SSD1306_SET_MULTIPLEX_RATIO, \
            0x02, SSD1306_SET_DISPLAY_OFFSET, \
            0x01, SSD1306_SET_SEGMENT_REMAP_SEG0, \
            0x01, SSD1306_SET_DISPLAY_START_LINE, \
            0x01, SSD1306_SET_OUTPUT_SCAN_DIRECTION, \
            0x02, SSD1306_SET_PINS_HARDWARE_CONF, \
            0x02, SSD1306_SET_CONTRAST_CONTROL, \
            0x01, SSD1306_ENTIRE_DISPLAY_ON, \
            0x01, SSD1306_SET_NORMAL_INVERSE_DISPLAY, \
            0x02, SSD1306_SET_DISPLAY_CLOCK, \
            0x01, SSD1306_SET_DISPLAY_ON, \
            0x00 \
            }
     
  17. kino

    kino Нерд

    Это не массив, для компилятора это просто строка, которую надо подставить дальше по тексту.
    Фигурные скобки на это и намекают.
    Код (C++):
    unsigned char massiv[] = SSD1306_INITIALIZATION_DATA_ARRAY;
     
    Последнее редактирование: 8 янв 2021
  18. parovoZZ

    parovoZZ Гуру

    Поэтому дальше
    Код (C++):
    inline void SSD1306_Init(const uint8_t *pArray)
    {

        while (*pArray != 0x00)
         { /*please govnocode here*/ }
    }
    и никаких мутных sizeof()
     
  19. kino

    kino Нерд

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

    И насчет мутных sizeof, так они для определения длинны массива, а в вашей функции произойдет выход по первому элементу, который равен нулю, а если за ним еще куча нужных данных?
     
  20. parovoZZ

    parovoZZ Гуру

    примерно как здесь, только с квалификатором const
    Таки да. Поэтому нуль определён в самом конце. Такой подход позволяет наполнять данными массив хоть до потолка - все они будут лежать во флеше и оттуда читаться. НЯ!