Помогите разобраться с кодом

Тема в разделе "Arduino & Shields", создана пользователем valdis_pel, 10 мар 2022.

  1. valdis_pel

    valdis_pel Нуб

    Код (C++):

    #include <arduino-timer.h>

    #include <SoftwareSerial.h>

    #include <arduino-timer.h>




    #include <SoftwareSerial.h>
    SoftwareSerial mySerial(11, 10);//Возможно надо будет поменять местами
    char msg;
    char call;
    int pinSensor = 4;//Сенсор
    int pinButton = 3;//Кнопка
    int LED_R = 8;
    int LED_Y = 7;
    int LED_G  = 6;
    auto timer = timer_create_default();

    void setup()
    {
      mySerial.begin(9600);   // Setting the baud rate of GSM Module
      Serial.begin(9600);    // Setting the baud rate of Serial Monitor (Arduino)
      Serial.println("GSM SIM900A BEGIN");
      Serial.println();
      delay(100);

      pinMode(pinSensor, INPUT);
      pinMode(pinButton, INPUT);
      pinMode(LED_R, OUTPUT);
      pinMode(LED_Y, OUTPUT);
      pinMode(LED_G, OUTPUT);
      digitalWrite(LED_R, LOW);//Выключаем лампочки
      digitalWrite(LED_Y, LOW);

      digitalWrite(LED_G, HIGH);//Поморгаем, чтобы весело было
      delay(400);
      digitalWrite(LED_G, LOW);
      delay(400);
      digitalWrite(LED_G, HIGH);
      delay(400);
      digitalWrite(LED_G, LOW);

      timer.every(1000 * 60 * 60 * 60 * 24, [](void*) -> void {//Ставим таймер на каждые 24 часа с отправкой смс
        SendMessage("Its working!");
      });
    }

    void loop()//Эта функция выполняется по кругу, пока есть питание, т.е. всегда
    {
      timer.tick();//Это нужно, чтобы таймер работал
      Serial.write(mySerial.read());//Тут выводим ответы модема в нашу консоль
      checkSensor();//Работаем с сенсором
      checkButton();//Работаем с кнопкой
    }

    void checkSensor() {
      static unsigned int taskFinished;//Статик значит, что переменная сохранит значение между вызовами функции
      static bool timerSet = false;
      if (digitalRead(pinSensor) == HIGH) {//Если сенсор 1
        digitalWrite(LED_G, HIGH);
        digitalWrite(LED_R, LOW);
        Serial.println("Если сенсор 1");
        if (timerSet) {//Убиваем таймер, если он был установлен
          timer.cancel(taskFinished);
        }
        return;
      } else {//Если сенсор 0
        timerSet = true;
        Serial.println("Сбрасывам таймер");
        timer.in(1000 * 60 * 2, [](void*) -> void {//ставим таймер на 2 минуты
          if (digitalRead(pinSensor) == HIGH) {//сенсор все еще 1
            digitalWrite(LED_G, HIGH);
            digitalWrite(LED_R, LOW);
            SendMessage("finished!");//отпраляем смс
          }
          Serial.println("Отправляем смс ФИНИШ");
          timerSet = false;
        });
      }
    }

    void checkButton() {
      static int clickCount = 0;
      static bool buttonReleased = true;
      static int ledStatus;
      static bool sequenceStarted = false;
      static unsigned int taskLed;
      if (digitalRead(pinButton) == HIGH) {
        if (!sequenceStarted) {
          sequenceStarted = true;
          ledStatus = LOW;
          taskLed = timer.every(300, [](void*) -> void {
            if (ledStatus == LOW) ledStatus = HIGH;
            else ledStatus = LOW;
            digitalWrite(LED_Y, ledStatus);
          });
          timer.in(1000 * 60 * 60 * 2, [](void*) -> void {
            timer.cancel(taskLed);
            sequenceStarted = false;
            clickCount = 0;
            ledStatus = LOW;
            digitalWrite(LED_Y, ledStatus);
          });
          Serial.println("Горитть желтый светодиод и таймер 2 часа");
        } else {
          if (buttonReleased) {
            clickCount++;
          }
        }
        buttonReleased = false;
      } else {
        buttonReleased = true;
      }
      if (sequenceStarted && clickCount == 2) {
        timer.cancel(taskLed);
        Serial.println("Остановить таймер на желтый светодиод");
        sequenceStarted = false;
        clickCount = 0;
        ledStatus = LOW;
        Serial.println("Сбросить кол-во нажатий");
        digitalWrite(LED_Y, ledStatus);
        SendMessage("needed!");
        Serial.println("Отпавить смс НУЖНА");

      }
    }


    void SendMessage(char * text)
    {
      mySerial.println("AT+CMGF=1");    //Sets the GSM Module in Text Mode
      delay(1000);  // Delay of 1000 milli seconds or 1 second
      mySerial.println("AT+CMGS=\"+70000000000\"\r"); // Replace x with mobile number
      delay(1000);
      mySerial.println(text);// The SMS text you want to send
      delay(100);
      mySerial.println((char)26);// ASCII code of CTRL+Z
      delay(1000);
    }
    Не сильно прокачен в написании кода... но в нужна прога... Лёгонькая.,. кто шарит ... тому думаю не составит труда найти ошибки...

    Суть состоит ПОХОЖА на охранную сигнализацию:
    Имеем
    • 3 светодиода: Желтый, зеленый и красный
    • Сенсор (датчик холла)
    • Кнопка
    • Модуль связи SIM900A (сеть подцепляется... модуль работает штатно)

    В программе всего 3 действия...

    Действие раз в сутки
    Раз в 24 часа отправляется смс "Я работаю"... Чтоб отследить работоспособность и состояние системы.

    Действие по сенсору
    Пока сенсор (Датчик холла) замкнут горит зеленый светодиод...
    Если датчик размыкается включается таймер и через 2 минуты он по прежнему разомкнут то отправляется СМС на номер ("Закончилась")

    Действие по кнопки
    При нажатии на кнопку начинает мигать желтый светодиод и если нажать еще 2 раза то отправляется СМС "Нужна"

    Программу и алгоритм приложил... ПОМОГИТЕ ПЛИЗ....
     

    Вложения:

    Последнее редактирование: 10 мар 2022
  2. valdis_pel

    valdis_pel Нуб

    По кнопки действие вроде проходит... судя по данным КОМпорта... но не реагирует на сенсор
     
  3. b707

    b707 Гуру

    код написан человеком, похоже впервые взявшим ардуину в руки... Этот код не должен даже компилироваться. Число открывающих скобок не равно закрывающим, оператор return между if и else, таймер на совершенно дикое значение... это не считая таких мелочей, как дублированные инклюды в начале теста...
    Короче. выкиньте этот код в помойку и поищите другой. в инете много проектов самодельных сигнализаций.
     
    Airbus нравится это.
  4. Airbus

    Airbus Радиохулиган Модератор

    Не а что пусть тренируется. По два раза ненужные библиотеки-это опечатка? У Пушного Звера есть и примеры и готовый код готового устройства. Но ничего плохого в том чтоб сделать самому
     
  5. b707

    b707 Гуру

    конечно пусть. если это его код... только мне показалось. что он его в инете нашел. Если так - лучше пусть поищет другой. более грамотный.