Помогите плиз написать цикл для итерации по массиву и печати serial.println() в мониторе их по отдельности. Например есть шесть чисел 111111111, 222222222, 333333333, ... 666666666. Они должны быть в массиве и код должен напечатать эти цифры в мониторе с промежутком в секунду. Заранее спасибо.
Правильно написал? Код (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; } } }
Во первых: 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.
Да, спасибо. Исправил тип в массиве на String. Все заработало. Прикрутил к кнопке печать массива в монитор. Все также заработало.
я бы в массив добавил признак конца массива. Это универсальный способ вытягивать из массива информацию и при этом его можно редактировать безгранично не заморачиваясь с его длиной))))
В библиотеке 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; } } } } Теперь думаю как это все оформить, чтобы по нажатию на кнопку, сообщение "улетало" адресатам из массива.
Давно это было, но помню, что создавал группу из себя и бота и чат ID этой группы использовал для отправки уведомлений. Тогда уведомления получают все участники группы.
Да, так возможно и сейчас. Разрабы так в принципе и предложили но это как то не то. Хочется в дальнейшем через веб морду прикрученную к ESP добавлять и удалять ID пользователей Телеграмма. А стало быть, чтобы оптимистично смотреть в будущее, нужно уже сейчас делать правильно.
Ну что же, всем спасибо. Все сделал )) нужно было вместо Код (C++): bot.sendMessage(CHAT_ID, "Tuk Tuk", ""); Написать: Код (C++): bot.sendMessage(i[a], "Tuk Tuk", ""); И все заработало.
Например, так: Код (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 \ }
Это не массив, для компилятора это просто строка, которую надо подставить дальше по тексту. Фигурные скобки на это и намекают. Код (C++): unsigned char massiv[] = SSD1306_INITIALIZATION_DATA_ARRAY;
Поэтому дальше Код (C++): inline void SSD1306_Init(const uint8_t *pArray) { while (*pArray != 0x00) { /*please govnocode here*/ } } и никаких мутных sizeof()
Нихера не понял, а примерчик можно, как ты тот дефайн в эту функцию передал? Такого не может быть, все равно должен быть определен массив. И насчет мутных sizeof, так они для определения длинны массива, а в вашей функции произойдет выход по первому элементу, который равен нулю, а если за ним еще куча нужных данных?
примерно как здесь, только с квалификатором const Таки да. Поэтому нуль определён в самом конце. Такой подход позволяет наполнять данными массив хоть до потолка - все они будут лежать во флеше и оттуда читаться. НЯ!