Нужна помощь по массиву данных

Тема в разделе "Arduino & Shields", создана пользователем sanik, 13 июл 2021.

  1. sanik

    sanik Гик

    Помогите пожалуйста Как правильно создать массив дней недели Как записать в него дни по которым будет выполнятся действие. И как считать и выбрать нужные дни. Один раз в сутки после нуля часов я считываю текущий день недели. После этого чтобы не прописывать каждый день нужно условие которое бы выбирало из массива нужный день . И если текущий день отмечен то выполняем действие.
    Код (C++):

    #include <DS3231.h>
    DS3231  rtc(SDA, SCL); // Инициализация DS3231
    Time  t;
    uint8_t weekDay[] = {0, 0, 0, 0, 0, 0, 0};// массив дней недели
    uint8_t w;
    void setup() {
      // put your setup code here, to run once:

    }

    void loop() {
      // каждый день проверяем день недели
      if (t.sec  == 00)  {
        if (t.min == 10) { // если в текущем времени  10 минут
          if (t.hour == 00) { //  если в текущем времени  0 часов
            rtc.getDOWStr(FORMAT_SHORT); //  Сокращенное название дня недели на английском языке (3 символа)
            w = t.dow;
          }
        }
      }
    }
     
  2. parovoZZ

    parovoZZ Гуру

    я бы сделал двумерный массив. В первой группе элементов номера дней, во второй - указатель на массив чаров с названием дня недели. Но перед ним элемент с количеством чаров в массиве, чтобы знать сколько чаров извлекать. Весь доступ к элементам по указателю.
     
  3. sanik

    sanik Гик

    Подскажите пожалуйста как это выглядит в коде.
     
  4. b707

    b707 Гуру

    это ты ему рассказываешь, как по номеру дня недели получить его название...а ему, похоже, совсем не это нужно.
    sanik, можете изложить четко. что вы хотите?

    Вот. например, ваш массив
    Код (C++):
    uint8_t weekDay[] = {0, 0, 0, 0, 0, 0, 0};// массив дней недели
    он для чего? Что вы собрались в него писать и что извлекать? пример можете привести?
     
  5. Рокки1945

    Рокки1945 Гуру

    а зачем его проверять - разве его там нет
     
  6. Рокки1945

    Рокки1945 Гуру

    ну типо первый нуль это понедельник - второй - вторник и т.д
     
  7. SergeiL

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

    А зачем в этом случае getDOWStr ?
    Не проще ли так сделать:
    Код (C++):
    Time t;
    uint8_t w;
    t=getTime();
    w=t.dow-1;
    В w будет цифра от 0 до 6 - текущий день недели или элемент вашего массива weekDay[w].
     
  8. SergeiL

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

    Вот зачем тут двумерный массив и номера дней??? По индексу никак?
     
  9. b707

    b707 Гуру

    народ, не советую тратить время на додумывание условий. Пусть лучше sanik сначала расшифрует задачу.. Посмотрите предыдущие треды ТС - товарищ sanik характерен тем. что обьясняет свои задачи так путано. что обычно помогающие только к третьей странице темы расчухивают. что на самом деле ему надо :)
     
    Ariadna-on-Line нравится это.
  10. parovoZZ

    parovoZZ Гуру

    По индексу на что?
     
  11. SergeiL

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

    На элемент массива с указателем на строку. ;)
    Ну простые же вещи, чего тупим.
     
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Сколько ни думал, так и не понял суть вопроса. Вообще не понял. Задать тупые (не - тупообразные !) вопросы, понимая что потом тема распухает донельзя от неизбежных непоняток - а потом хвалиться девкам своей востребованностью на форумах - нехитрый пиар у пацанов. Слышал из разговоров подростков. Может этот "витиеватый вопрошанец" из их числа ? Может правильней посылать подальше... поработать над вопросом и лишь потом задавать...
    ПС. В неделе семь дней (и их названий), других не будет. ТС-у нужен план работ Works(D, R) на каждый день недели. И чтобы этот план выходил на экран в виде названия дня и списка работ. Только и всего. Сколько можно выполнить работ за сутки - ну предположим - 50 ? Нужна двумерная матрица (DxR) строковых констант, 7х51. В начале новых суток (D) проц выводит название дня и список работ (R) на день.
    String Works[6, 50] = {"Sunday", "Sleep", "Weakup", "Drink" , ..., "Fuck"} , ,,, , {"Saturday", "Sleep", "Weakup", "Drink" , ..., "Fuck" };
    ,,,
    int D=RTC();
    for( int R=0; R< 51; R++) {
    Serial.println(Works(D, R));
    }
     
    Последнее редактирование: 14 июл 2021
  13. sanik

    sanik Гик

    Массив я просто предположил что он может выглядеть так Задача такая в меню настроек я галочкой отмечаю в какой день недели допустим включить светодиод Выглядеть будет примерно как календарная сетка из дней недели курсором навел на нужный день и отметил нужные дни. Я понимаю что можно написать громоздкий код где будет прописано действие на каждый день с этим я смогу справиться. Проще создать массив и в нем отмечать нужные дни например если в массив записать weekDay[1] = 1 то это будет означать что во вторник нужно включить светодиод. Опять же знаний не хватает как не прописывая каждый день вытащить нужный. Вот и спрашиваю какое можно применить решение.
     
  14. sanik

    sanik Гик

    Я так понимаю это получается условие для проверки какой сейчас день недели? И как тогда сравнивать с записанным массивом чтобы выяснить нужно ли выполнять действие или нет?
     
  15. sanik

    sanik Гик

    Еще проще нужен недельный таймер на библиотеке DS3231
     
  16. SergeiL

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

    Вы определи какой сейчас день недели от 0 до 6.
    В массиве у вас 7 элементов как и дней недели. От 0 до 6.
    Если нужно делать что то в определенный день недели - ставите там «1».
    Ну и берёте и проверяете, если weekDay[w] == 1 то в этот день зажигаете свой светодиод.
     
  17. sanik

    sanik Гик

    Да, спасибо! Примерно я так и предполагал. Мне как раз и не понятно как сравнить два массива.
     
  18. sanik

    sanik Гик

    дпустим я записал uint8_t weekDay[] = {0, 0, 1, 0, 1, 0, 0};
    Time t;
    uint8_t w;
    t=getTime();
    w=t.dow-1; // сегодня среда кстати для меня не понятно почему отнимаем единицу.
    weekDay[w] == 1 и как здесь определяется ноль или единица? Простите за тупость.
     
  19. b707

    b707 Гуру

    sanik, у вас 672 сообщения на форуме и вы спрашиваете, как в строчке
    Код (C++):
    weekDay[w] == 1
    определяется ноль или единица???
    Вы нас троллите?

    если нет - не рассчитывайте. что мы вам по буквам будем обьяснять учебник Си
     
  20. sanik

    sanik Гик

    Спасибо всем немного потупил но все таки разобрался
    b707 Отдельно извиняюсь Но все таки не нужно злиться когда до человека не сразу все доходит
    Вы же тоже когда то учились.
    Выложу код может еще кому пригодиться
    Код (C++):

    #include <DS3231.h>
    DS3231  rtc(SDA, SCL);
    Time  t;
    uint8_t weekDay[] = {0, 0, 1, 0, 0, 1, 0}; // среда и суббота
    uint8_t w; // переменная для получения числового дня недели
    uint32_t Millis;
    void setup() {
      rtc.begin();  // Инициализировать rtc
      pinMode(LED_BUILTIN, OUTPUT); // пин со светодиодом настраиваем на выход
    }

    void loop() {
      if (millis() - Millis > 1000) { // каждую секунду
        Millis = millis();
        if (Millis > millis()) {
          Millis = 0;    // защита от переполнения
        }
        t = rtc.getTime();  // считываем время
        delay(1);
      }
      if (t.sec  == 0) {
        if (t.min == 10) { // если в текущем времени  10 минут
          if (t.hour == 0) { //  если в текущем времени  0 часов
            w = t.dow - 1; // получаем день недели и отнимаем единицу так как массив начинается с нуля
          }
        }
      }

      if (weekDay[w] == 1) {
        digitalWrite(LED_BUILTIN, HIGH);
      } else {
        digitalWrite(LED_BUILTIN, LOW);
      }

    }
     
     
    Последнее редактирование: 14 июл 2021