Датчик движения и датчик освещенности на плате Arduino UNO

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

  1. Raider_A

    Raider_A Нерд

    Всем привет!

    Нужна помощь опытных в написании первой программы для реализации рабочей схемы с Arduino.

    Идея была сделать освещение в комнате, которое работает от датчика движения PIR SR501 установленном на плате Arduino UNO вместе с датчиком BH1750, который регулирует освещение в комнате.

    Подсоединил по такой схеме.

    Схема программы.jpg
    На схеме не рисовал светодиод на цифровом 13 порту для индикации калибровки датчика движения. Но он есть в скетче.

    Скетчи нашел в интернете, но не могу никак объединить отдельную программную часть на датчик освещенности и датчик движения в одну программу, чтобы она работала.

    Код (C++):
    #include <Wire.h>
    #include <BH1750.h>


    //Тестировалось на Arduino IDE 1.0.1
    //Время калибровки датчика (10-60 сек. по даташиту)
    int calibrationTime = 30;      

    //Время, в которое был принят сигнал отсутствия движения(LOW)
    long unsigned int lowIn;      

    //Пауза, после которой движение считается оконченным
    long unsigned int pause = 5000;

    //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
    boolean lockLow = true;
    //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
    boolean takeLowTime;

    int pirPin = 2;    //вывод подключения PIR датчика
    int ledPin = 13;   //вывод сигнального диода
    int relayPin = 3;  //реле пин

    void setup()
    {
      pinMode(pirPin, INPUT);
      pinMode(ledPin, OUTPUT);
      pinMode(relayPin, OUTPUT);

      //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять HIGH на LOW
      digitalWrite(relayPin, HIGH);
      delay(4000);
      digitalWrite(pirPin, LOW);

      //дадим датчику время на калибровку
      for(int i = 0; i < calibrationTime; i++)
      {
        //Во время калибровки будет мигать сигнальный диод
        i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW);
        delay(1000);
      }
      //По окончанию калибровки зажжем сигнальный диод
      digitalWrite(ledPin, HIGH);
      delay(50);
    }

    void loop()
    {
      //Если обнаружено движение
      if(digitalRead(pirPin) == HIGH)
      {
        //Если до этого момента еще не включили реле
        if(lockLow)
        {
          lockLow = false;    
          //Включаем реле.
          //!ВНИМАНИЕ! При использовании n-p-n реле необходимо в след. строчке поменять LOW на HIGH
          digitalWrite(relayPin, LOW);
          delay(50);
        }      
        takeLowTime = true;
      }

      //Ели движения нет
      if(digitalRead(pirPin) == LOW)
      {    
        //Если время окончания движения еще не записано
        if(takeLowTime)
        {
          lowIn = millis();          //Сохраним время окончания движения
          takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
        }
        //Если время без движение превышает паузу => движение окончено
        if(!lockLow && millis() - lowIn > pause)
        {
          //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
          lockLow = true;              
          digitalWrite(relayPin, HIGH);
          delay(50);
      }
    }
    }

    BH1750 lightMeter;

    class lightMeter
    {
      void setup()
      {
      Serial.begin(9600);
      lightMeter.begin();
      Serial.println("Running...");
      }
      void loop()
      {
      uint16_t lux = lightMeter.readLightLevel();
      Serial.print("Light: ");
      Serial.print(lux);
      Serial.println(" lx");
      delay(500);

    }
    };
    В конце выдает ошибку:
    exit status 1
    expected unqualified-id before '.' token

    Я понимаю, что функции void loop и void setup - не могут быть в одном проекте дважды, но вопрос как тогда переделать программный код, чтобы всё работало в одном проекте?
     
    fv1144 нравится это.
  2. NikitOS

    NikitOS Король шутов Администратор

    Господа, что курил ТС?
    У меня кровь из глаз от этого псевдокода..
     
    Daniil нравится это.
  3. NikitOS

    NikitOS Король шутов Администратор

    А почитать учебник по программированию? Погуглить?
    Да ну, зачем? Мы лучше на форуме сделаем тему, подобных которой уже +100500 :D
     
    Airbus нравится это.
  4. KindMan

    KindMan Гуру

    Да, прикольный код… особенно 30 секунд мигания светодиодом на плате, не понятно зачем… и класс lightmeter конечно эпичный…
    Чего там там только нет…
    Прости ТС, но начинать надо с вкладки Файл-»Примеры
     
    Daniil и NikitOS нравится это.
  5. Airbus

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

    Есть же скетчи от ИгоряК.Надо только поискать чуток
     
    NikitOS нравится это.
  6. Daniil

    Daniil Гуру

    Метод обучения "накопирую из интернета скейтчей и соедыню:)" очень непродуктивен.
    Согласен с ораторами выше.
     
  7. Airbus

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

  8. fv1144

    fv1144 Нерд

    Код (C++):
      //дадим датчику время на калибровку
      for(int i = 0; i < calibrationTime; i++)
      {
        //Во время калибровки будет мигать сигнальный диод
        i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW);
        delay(1000);
      }
      //По окончанию калибровки зажжем сигнальный диод
      digitalWrite(ledPin, HIGH);
      delay(50);
    }
     
    Я не могу представить человека, который в скетче для адруино написал " i % 2 ? digitalWrite(ledPin, HIGH) " и "delay(1000)", это должно быть два очень разных по характеру человека :)
     
  9. Asper Daffy

    Asper Daffy Иксперд

    Почему? Нормально всё. В меру безграмотно.
     
    Daniil нравится это.