Подружить датчик с кнопками

Тема в разделе "Arduino & Shields", создана пользователем bibo, 28 май 2018.

  1. bibo

    bibo Нерд

    Приветствую, товарищи.
    Не могу победить такую штуку. Написал скетч, который включает через реле вентиляторы вытяжек в ванной и туалете. В ванной включается по влажности, в туалете при включении света.
    Есть необходимость включать и выключать все это дело принудительно. Допустим, чтобы можно было включить/выключить вручную вентилятор в туалете после выключения света, а ванной в любой момент времени в обход датчика влажности.
    У меня ничего не выходит сделать. В скетче есть обработка кнопок, которая позволяет включить/ выключить каждую из реле, также есть включение выключение реле по показаниям датчиков. А вот воедино собрать не могу, чтобы одно не противоречило другому и все работало.

    Код (C++):

    #include <iarduino_OLED_txt.h>
    #include <iarduino_RTC.h>
    #include "DHT.h"

    #define DHTTYPE DHT11
    #define DHTPIN 5

    #define RELAY1_PIN 12
    #define RELAY1_ON HIGH
    #define RELAY1_OFF LOW

    #define RELAY2_PIN 11
    #define RELAY2_ON HIGH
    #define RELAY2_OFF LOW

    #define BUTTON1_PIN 2
    #define BUTTON2_PIN 3

    #define PIN_PHOTO_SENSOR A1


    iarduino_OLED_txt myOLED(0x78);  // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x78 (если учитывать бит RW=0).
    DHT dht(DHTPIN, DHTTYPE);
    iarduino_RTC time(RTC_DS1307);
                                                         
    extern uint8_t SmallFontRus[];                         // Подключаем шрифт SmallFontRus.
    extern uint8_t MediumFontRus[];

    //+++++++++++КНОПКИ++++++++++++++++++
    bool     button1_state      = false; // статус кнопки 1
    bool     button2_state      = false; // статус кнопки 2
    bool     button1_long_state  = false;// удержание кнопки 1
    bool     button2_long_state  = false;// удержание кнопки 2
    uint32_t ms_button         = 0;
    uint32_t ms_auto_click     = 0;
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++



    //++++++Переменные+++++++++++++++++++
    int hum;
    int temp;
    int buttonState1;
    int buttonState2;
    int photo;
    uint32_t ms;  
    boolean relay1_flag = 0;
    boolean relay2_flag = 0;

    //+++++++++++++++++++++++=++++++
    void setup(){
     
            pinMode(BUTTON1_PIN, INPUT);
            pinMode(BUTTON2_PIN, INPUT);
            pinMode(RELAY1_PIN,OUTPUT);
            pinMode(RELAY2_PIN,OUTPUT);


            time.begin();
            dht.begin();
            Serial.begin(9600);
          //time.settime(0,24,19,22,5,18,2); //устанавливаем время и дату(сек, мин, час, число, месяц. год, день недели по счету)


          myOLED.begin();                                    // Инициируем работу с дисплеем.
         /* myOLED.setFont(MediumFontRus);                      // Указываем шрифт который требуется использовать для вывода цифр и текста.
          myOLED.print( "Программа "    ,     OLED_C, 1);  
          myOLED.print( "автомат."    ,     OLED_C, 3);
          myOLED.print( "управления"    ,     OLED_C, 5) ;
          myOLED.print( "вытяжкой "    ,     OLED_C, 7) ;
          delay(3000);
          myOLED.clrScr(); */

         //  myOLED.setCoding(TXT_UTF8);                        // Указываем кодировку текста в скетче. Если на дисплее не отображается Русский алфавит, то ...
    }                                                      // раскомментируйте функцию setCoding и замените параметр TXT_UTF8, на TXT_CP866 или TXT_WIN1251.
                                                           //
    void loop(){                                          
            myOLED.setFont(SmallFontRus);
            hum = dht.readHumidity();
            temp = dht.readTemperature();
            photo = analogRead(PIN_PHOTO_SENSOR);
            ms    = millis();
            buttonState1 = digitalRead(BUTTON1_PIN); // 1 кнопка
            buttonState2 = digitalRead(BUTTON2_PIN); // 2 кнопка


         myOLED.print( "Т-ра в ванной: "    ,      0, 2);    // Выводим текст начиная с 0 столбца 2 строки.
         myOLED.print( temp    , 87, 2);    //
         myOLED.print( "'C "   , 101, 2);    //
         myOLED.print( "Влажность: "    ,     0, 3);    // Выводим текст начиная с 0 столбца 3 строки.
         myOLED.print( hum    , 87, 3);  
       
         myOLED.print( "%"   , 102, 3);  
         myOLED.print(time.gettime("d-m-Y H:i:s"), 0, 0);
       
    //++++ОБРАБОТКА+КНОПОК+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                        //==КНОПКА 1===
      // Фиксируем нажатие кнопки  1
      if(  buttonState1  == HIGH && !button1_state  && ( ms - ms_button ) > 50 ){
       digitalWrite(DHTPIN, LOW);
        button1_state      = true;
        button1_long_state = false;
    relay1_flag = !relay1_flag;
        ms_button         = ms;
       digitalWrite(RELAY1_PIN,relay1_flag);
        Serial.println("Pressed key 1"); //короткое нажатие
      }
    /*  
    // После 2000 мс нажатия кнопки 1 каждые 500 мс фиксируем событие нажатия
       if( buttonState1  == HIGH && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ){
          ms_auto_click     = ms;
          Serial.println("Auto press key");   //длительное нажатие
       } */


    // Фиксируем отпускание кнопки  1
       if(  buttonState1 == LOW && button1_state && ( ms - ms_button ) > 50  ){
          button1_state      = false;  
          ms_button         = ms;
           relay1_flag = relay1_flag;
          digitalWrite(RELAY1_PIN, relay1_flag);
          Serial.println("Key 1 unpressed"); //действие после отпуска  кнопки
       
       }    

    // Длительное нажатие кнопки 1
    if(  buttonState1  == HIGH && !button1_long_state && ( ms - ms_button ) > 2000 ){
          button1_long_state = true;
       
          //digitalWrite(RELAY1_PIN, RELAY1_OFF);
          Serial.println("Long press key 1");

    }


             //==КНОПКА 2==
    // Фиксируем нажатие кнопки  2
       if(  buttonState2  == HIGH && !button2_state && ( ms - ms_button ) > 50 ){
          button2_state      = true;
          button2_long_state = false;
           relay2_flag = !relay2_flag;
          ms_button         = ms;
          digitalWrite(RELAY2_PIN, relay2_flag);
          Serial.println("Pressed key 2"); //короткое нажатие
       }

        // Фиксируем отпускание кнопки 2
       if(  buttonState2 == LOW && button2_state && ( ms - ms_button ) > 50  ){
          button2_state      = false;  
          ms_button         = ms;
           relay2_flag = relay2_flag;
          digitalWrite(RELAY2_PIN, relay2_flag);
          Serial.println("Key 2 unpressed"); //действие после отпуска кнопки
       }


       // Длительное нажатие кнопки 2
       if( buttonState2  == HIGH && !button2_long_state && ( ms - ms_button ) > 2000 ){
          button2_long_state = true;
         // digitalWrite(RELAY2_PIN, RELAY2_OFF);
          Serial.println("Long press key 2");  
       }



       }*/
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++




                             
    if(  hum <80 ){
     
         digitalWrite(RELAY1_PIN, RELAY1_OFF);
       
         myOLED.print( "Вент. в ванной выкл.    "    ,      0, 5);
         myOLED.print( "автоматически         "    ,      0, 6);
         }
     

    if( hum > 80 ){
     
         digitalWrite(RELAY1_PIN, RELAY1_ON);
         myOLED.print( "Вент. в ванной вкл.    "    ,      0, 5);
         myOLED.print( "автоматически         "    ,      0, 6);
        }
     




    if (photo < 800) {
        digitalWrite(RELAY2_PIN, RELAY2_ON);
        myOLED.print( "Вент. в туалете вкл.    "   , 0, 7);  
      } else {
        digitalWrite(RELAY2_PIN, RELAY2_OFF);
         myOLED.print( "Вент. в туалете выкл.   "   , 0, 7);
      }



     
    }
     
    Подскажите, как такие ситуации разрешаются?
     
  2. DIYMan

    DIYMan Guest

    Такие ситуации разрешаются по разному. Один из вариантов - набор состояний, например - если кнопка не нажималась - то система в состоянии "работаем по показаниям с датчиков". Как только кнопка нажалась - система переводится в состояние "работаем принудительно", после N времени (или ещё от каких-то конкретных условий) система переводится в состояние "работаем по показаниям с датчиков".

    Почитайте теорию конечных автоматов - это как раз оно.
     
    bibo нравится это.
  3. Daniil

    Daniil Гуру

    Если кнопка нажата значит ручной режим=on и реле=on и если кнопка отжата, то реле=off и ручной режим=off - для такой логики у вас все готово.
    Просто, вместе с определением влажности проверяйте состояние кнопки, чтобы она была отжата.
    Код (C++):
    if кнопка=off
    {
    if hum<80 rele=off
    else rele=on
    }
    Обратите внимание, что кнопка проверяется во внешнем if.
     
    bibo нравится это.
  4. parovoZZ

    parovoZZ Гуру

    Всё это бесполезно, если нет в квартиру притока с улицы. Маленькому вентилятору не прокачать вытяжку, если она физически не работает. А если она работает, то вентилятор ни к чему. Если вытяжных каналов несколько и каким-то чудом вентилятор будет создавать поток, то без хорошего притока воздуха с улицы произойдет переворот тяги. Как правило, для проветривания достаточно открыть форточку (окно). Я тоже по глупости купил в ванную вентилятор, но не ставил. Как только открываешь окно и приоткрываешь дверь в ванную - через 10 минут от влажности в ванной не следа. А зимой? Закупорено всё! И хотят, что бы ванная проветрилась от вентилятора? Нет. Чудес не бывает. Физику не обманешь.
     
  5. bibo

    bibo Нерд

    Вытяжки у меня не закупорены и обеспечивают вентиляцию. Причины такого решения заключаются в некоторых семейных обстоятельствах. Необходимо ускорить процесс вентиляции.
    Это во-первых. Во-вторых, если открывать двери в ванной для более быстрого проветривания, то в квартире резко повышается влажность до некомфортной и не всегда есть возможность открывать окна по тем же семейным обстоятельствам. В целом, ваша критика не относится в разряду конструктивной, так как она не по теме)
     
  6. bibo

    bibo Нерд

    Спасибо за идею. Сам, увы, не смог допетрить.
     
  7. parovoZZ

    parovoZZ Гуру

    Не ускоришь без открывания окон. Если воздух не приходит, то и уходить он не будет. У меня на кухне вытяжка в сто ватт не может продуть вентканал, а ты хочешь 15 ваттным вентилятором ускорить вентиляцию. Смех. Все твои потуги бесполезны, а уж подвязываться на датчик влажности - утопия. Проще вентилятор вообще не выключать. Дверь надо не открывать, а приоткрывать. А лучше в двери или ещё где сделать небольшие протоки для воздуха. У меня прямо над коробкой отверстия и закрыты наличником. Продувается замечательно.
     
  8. a1000

    a1000 Гуру

    Все пытаются решить вопрос программно. А можно всё без особых заморочек решить аппаратно. Ставим простой перекидной выключатель и определяем ему два положения:
    1. "ручное управление" - вентилятор отключается от ардуино и на прямую подключается к питанию.
    2. "автоматическое управление" - вентилятор возвращается на управляющий пин ардуино.
     
  9. bibo

    bibo Нерд

    Тогда уж лучше перекидывать с пина датчика на пин кнопки)
     
  10. parovoZZ

    parovoZZ Гуру

    У вас идеи утопические, а реализация так вообще чумовая.
    Что будет происходить. Электронные бытовые гигрометры особой точностью не отличаются. К тому же молекулы воды, как и все остальные, совершенно свободно перемещаются по объёму. Влажность в разных местах тоже будет разной. В ванной комнате влага неизбежно оседает на холодных стенах. После того, как ванная начнёт проветриваться, влага со стен будет испаряться. Таким образом, высокая влажность в ванной будет держаться очень долго.
     
  11. bibo

    bibo Нерд

    Мне ясно и понятно ваше мнение по поводу вытяжки в моей ванной.
    Она прекрасно работает сейчас и будет еще прекраснее работать в будущем и без него.
     
  12. a1000

    a1000 Гуру

    Не совсем понял что куда перекидывать?
     
  13. parovoZZ

    parovoZZ Гуру

    Вообще, если хочется сделать реле влажности на основе датчика влажности, то это, конечно же, очень полезно как для саморазвития, так и для опыта. Я только за. Но 15 ваттный вентилятор в вентканал... если электричества много накопилось и его некуда девать (или надо обязательно выбрать месячные лимиты) - ну, как вариант)))
     
  14. DetSimen

    DetSimen Guest

    А чо, у мня восемнацативаттный Домовент почти мгновенно всю влажность из ванны выдувает. По крайней мере, запотевшее зеркало прям на глазах очищаеца, являя мне мою же вечно небритую рожу. Забор воздуха идет из-под двери, она на сантиметр примерно над полом висит, поэтому воздух проходит по дигонали, снизу, от пола, до вытяжки вверху, в другом углу.
    Даччик влажности, AM2320, врезан в саму панель вентилятора.
     
  15. parovoZZ

    parovoZZ Гуру

    У меня и без вентиляторов через 10 минут сухо. Дует так, что свечку задувает. Не люблю шум, да и леппездрычество не дармовое.
     
  16. bibo

    bibo Нерд

    Похоже, что действительно лучше поставить "железный" переключатель режимов(ручной/автоматический).
    Как ни пытался заставить нормально всю конструкцию работать, не выходит все же аленький цветочек.
    Допустим, при включении света датчик освещенности сработал и включил вентилятор. Если после этого срабатывания принудительно его выключить, то после выключения света датчик вновь срабатывает и включает вентилятор. Аналогично дела обстоят с датчиком влажности. Уже башка закипела(
    Код (C++):

    #include <iarduino_OLED_txt.h>
    #include <iarduino_RTC.h>
    #include "DHT.h"


    #define DHTTYPE DHT11
    #define DHTPIN 5

    #define RELAY1_PIN 12
    #define RELAY1_ON HIGH
    #define RELAY1_OFF LOW

    #define RELAY2_PIN 11
    #define RELAY2_ON HIGH
    #define RELAY2_OFF LOW

    #define BUTTON1_PIN 2
    #define BUTTON2_PIN 3

    #define PIN_PHOTO_SENSOR A1


    iarduino_OLED_txt myOLED(0x78);  // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x78 (если учитывать бит RW=0).
    DHT dht(DHTPIN, DHTTYPE);
    iarduino_RTC time(RTC_DS1307);

    extern uint8_t SmallFontRus[];                         // Подключаем шрифт SmallFontRus.
    extern uint8_t MediumFontRus[];

    //+++++++++++КНОПКИ++++++++++++++++++
    bool     button1_state      = false; // статус кнопки 1
    bool     button2_state      = false; // статус кнопки 2
    bool     button1_long_state  = false;// удержание кнопки 1
    bool     button2_long_state  = false;// удержание кнопки 2
    uint32_t ms_button         = 0;
    uint32_t ms_auto_click     = 0;
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++



    //++++++Переменные+++++++++++++++++++
    int hum;
    int temp;
    int buttonState1;
    int buttonState2;
    int photo;
    uint32_t ms;
    bool relay1_flag = 0;
    bool relay2_flag = 0;

    //+++++++++++++++++++++++=++++++

    void setup() {

      pinMode(BUTTON1_PIN, INPUT);
      pinMode(BUTTON2_PIN, INPUT);
      pinMode(RELAY1_PIN, OUTPUT);
      pinMode(RELAY2_PIN, OUTPUT);


      time.begin();
      dht.begin();
      Serial.begin(9600);
      //time.settime(0,24,19,22,5,18,2); //устанавливаем время и дату(сек, мин, час, число, месяц. год, день недели по счету)


      myOLED.begin();                                    // Инициируем работу с дисплеем.
      /* myOLED.setFont(MediumFontRus);                      // Указываем шрифт который требуется использовать для вывода цифр и текста.
        myOLED.print( "Программа "    ,     OLED_C, 1);
        myOLED.print( "автомат."    ,     OLED_C, 3);
        myOLED.print( "управления"    ,     OLED_C, 5) ;
        myOLED.print( "вытяжкой "    ,     OLED_C, 7) ;
        delay(3000);
        myOLED.clrScr(); */

      //  myOLED.setCoding(TXT_UTF8);                        // Указываем кодировку текста в скетче. Если на дисплее не отображается Русский алфавит, то ...
    }                                                      // раскомментируйте функцию setCoding и замените параметр TXT_UTF8, на TXT_CP866 или TXT_WIN1251.
    //
    void loop() {
      myOLED.setFont(SmallFontRus);
      hum = dht.readHumidity();
      temp = dht.readTemperature();
      photo = analogRead(PIN_PHOTO_SENSOR);
      ms    = millis();
      buttonState1 = digitalRead(BUTTON1_PIN); // 1 кнопка
      buttonState2 = digitalRead(BUTTON2_PIN); // 2 кнопка


      myOLED.print( "Т-ра в ванной: "    ,      0, 2);    // Выводим текст начиная с 0 столбца 2 строки.
      myOLED.print( temp    , 87, 2);    //
      myOLED.print( "'C "   , 101, 2);    //
      myOLED.print( "Влажность: "    ,     0, 3);    // Выводим текст начиная с 0 столбца 3 строки.
      myOLED.print( hum    , 87, 3);

      myOLED.print( "%"   , 102, 3);
      myOLED.print(time.gettime("d-m-Y H:i:s"), 0, 0);


























      //++++ОБРАБОТКА+КНОПОК+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     
      //==КНОПКА 1===
     
      /*
        // После 2000 мс нажатия кнопки 1 каждые 500 мс фиксируем событие нажатия
        if( buttonState1  == HIGH && ( ms - ms_button ) > 2000 && ( ms - ms_auto_click )>500 ){
           ms_auto_click     = ms;
           Serial.println("Auto press key");   //длительное нажатие
        } */



        // Фиксируем нажатие кнопки
      if (  buttonState1  == HIGH && !button1_state  && ( ms - ms_button ) > 50 ) {
        digitalWrite(DHTPIN, LOW);
        button1_state      = true;
        button1_long_state = false;
        relay1_flag = !relay1_flag;
        ms_button         = ms;
        digitalWrite(RELAY1_PIN, relay1_flag);
    myOLED.print( "Вент. в ванной вкл.    "    ,      0, 5);
      myOLED.print( "                        "    ,      0, 6);
    //  myOLED.print( "принудительно         "    ,      0, 6);
        Serial.println("Pressed key 1"); //короткое нажатие
      }


      // Фиксируем отпускание кнопки  1
      if (  buttonState1 == LOW && button1_state && ( ms - ms_button ) > 50  ) {
        button1_state      = false;
        ms_button         = ms;
        relay1_flag = relay1_flag;
        digitalWrite(RELAY1_PIN, relay1_flag);
      // myOLED.print( "Вент. в ванной выкл.    "    ,      0, 5);
      // myOLED.print( "                        "    ,      0, 6);
      // myOLED.print( "принудительно         "    ,      0, 6);
        Serial.println("Key 1 unpressed"); //действие после отпуска  кнопки

      }

      // Длительное нажатие кнопки 1
      if (  buttonState1  == HIGH && !button1_long_state && ( ms - ms_button ) > 2000 ) {
        button1_long_state = true;

        //digitalWrite(RELAY1_PIN, RELAY1_OFF);
        Serial.println("Long press key 1");

      }



      //==КНОПКА 2==
      // Фиксируем нажатие кнопки  2
      if (  buttonState2  == HIGH && !button2_state && ( ms - ms_button ) > 50 ) {
        button2_state      = true;
        button2_long_state = false;
        relay2_flag = !relay2_flag;
        ms_button         = ms;
        digitalWrite(RELAY2_PIN, relay2_flag);
         myOLED.print( "Вент. в туалете вкл.    "   , 0, 7);
       // myOLED.print( "автоматически         "    ,      0, 7);
        Serial.println("Pressed key 2"); //короткое нажатие
      }

      // Фиксируем отпускание кнопки 2
      if (  buttonState2 == LOW && button2_state && ( ms - ms_button ) > 50  ) {
        button2_state      = false;
        ms_button         = ms;
        relay2_flag = relay2_flag;
        digitalWrite(RELAY2_PIN, relay2_flag);
         myOLED.print( "Вент. в туалете выкл.    "   , 0, 7);
       // myOLED.print( "автоматически         "    ,      0, 7);
        Serial.println("Key 2 unpressed"); //действие после отпуска кнопки
      }


      // Длительное нажатие кнопки 2
      if ( buttonState2  == HIGH && !button2_long_state && ( ms - ms_button ) > 2000 ) {
        button2_long_state = true;
        // digitalWrite(RELAY2_PIN, RELAY2_OFF);
        Serial.println("Long press key 2");
      }




    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



    if( buttonState1  == LOW  ){

      if (  hum < 80 && !relay1_flag) {

        digitalWrite(RELAY1_PIN, RELAY1_OFF);
        myOLED.print( "Вент. в ванной выкл.    "    ,      0, 5);
       //  myOLED.print( "                        "    ,      0, 6);
       // myOLED.print( "автоматически         "    ,      0, 6);
      }

      if (  hum < 80 && relay1_flag) {

        digitalWrite(RELAY1_PIN, RELAY1_ON);
        myOLED.print( "Вент. в ванной вкл.    "    ,      0, 5);
        // myOLED.print( "                        "    ,      0, 6);
       // myOLED.print( "автоматически         "    ,      0, 6);
      }


      if ( hum > 80 && !relay1_flag ) {

        digitalWrite(RELAY1_PIN, RELAY1_ON);
        myOLED.print( "Вент. в ванной вкл.    "    ,      0, 5);
        // myOLED.print( "                        "    ,      0, 6);
       // myOLED.print( "автоматически         "    ,      0, 6);
      }
     
      if ( hum > 80 && relay1_flag ) {

        digitalWrite(RELAY1_PIN, RELAY1_OFF);
        myOLED.print( "Вент. в ванной выкл.    "    ,      0, 5);
      //   myOLED.print( "                        "    ,      0, 6);
       // myOLED.print( "принудительно         "    ,      0, 6);
      }
      }




    if( buttonState2  == LOW  ){

     
    if  (photo > 800 && relay2_flag ){
        digitalWrite(RELAY2_PIN, !relay2_flag);
        myOLED.print( "Вент. в туалете выкл.   "   , 0, 7);
       // myOLED.print( "автоматически         "    ,      0, 7);
      }



     
    if (photo > 800 && !relay2_flag ) {
     
        digitalWrite(RELAY2_PIN, !relay2_flag);
        myOLED.print( "Вент. в туалете вкл.    "   , 0, 7);
      //  myOLED.print( "автоматически         "    ,      0, 7);
      }

     
     
    if  (photo < 800 && !relay2_flag){
     
        digitalWrite(RELAY2_PIN, relay2_flag);
        myOLED.print( "Вент. в туалете выкл.   "   , 0, 7);
       // myOLED.print( "автоматически         "    ,      0, 7);
      }






    if (photo < 800 && relay2_flag ) {
       
        digitalWrite(RELAY2_PIN, relay2_flag);
        myOLED.print( "Вент. в туалете вкл.    "   , 0, 7);
      //  myOLED.print( "автоматически         "    ,      0, 7);
      }


     
      }



    }
     
     
  17. parovoZZ

    parovoZZ Гуру

    Ребята, это жесть. Я такие алгоритмы реализовывал на 155 логике в 9-ом классе. Рисуй алгоритм на бумаге - в код проще будет перенести. Ну с форматированием кода беда полная. Тут у любого голова заболит. Почему нельзя хотя бы вот так кодить

    Код (C++):
    //... Сон передатчика
    void nRF_PowerDown(void)
    {
        uint8_t Buf[1];

        Buf[0] = (0<<nRF_PWR_UP) | (1<<nRF_PRIM_RX) | (1<<nRF_EN_CRC) | (0<<nRF_CRCO);    //Выключить плату
        SPI_WriteArray(nRF_WR_REG(nRF_CONFIG), 1, Buf);
    }


        //... Очистить буфер FIFO
    void nRF_ClearBuf(void)
    {  
        nRF_SELECT();

        SPI_WriteByte(nRF_FLUSH_RX);              
        SPI_WriteByte(nRF_FLUSH_TX);

        nRF_DESELECT();
    }

        //... Инициализация передатчика
    void nRF_Init(void)
    {
        uint8_t Buf[5];

        nRF_Init_IRQ;                                // Подписываемся на прерывания от приемо-передатчика

        nRF_DDR |= (1<<nRF_CE) | (1<<nRF_CSN);
        nRF_PORT |= (0<<nRF_CE) | (0<<nRF_CSN);

        nRF_SELECT();

        Buf[0] = (1<<nRF_PWR_UP) | (1<<nRF_PRIM_RX) | (1<<nRF_EN_CRC) | (0<<nRF_CRCO);        // Проверка CRC разрешена, 1 байт CRC, переводим плату в режим приема, подаём питание
        SPI_WriteArray(nRF_WR_REG(nRF_CONFIG), 1, Buf);                    // Питание подано всегда. Режим сна не предусматривается
                                            // Прерывания включены всегда
        //... Установка частоты канала передачи / приема
        Buf[0] = nRF_channel;
        SPI_WriteArray(nRF_WR_REG(nRF_RF_CH), 1, Buf);          
     
        //... Длина передаваемых/получаемых данных в трубах 0 и 1
        Buf[0] = nRF_SEND_LEN;
        SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P0), 1, Buf);          
        SPI_WriteArray(nRF_WR_REG(nRF_RX_PW_P1), 1, Buf);
     
    DetSimen нравится это.
  18. a1000

    a1000 Гуру

    Скажу честно, в ваш скетч не вчитывался, по этому вопрос - каков общий алгоритм действия? То, что по нажатию кнопки должен принудительно включаться вентилятор это понятно. Как вы хотите потом выходить из этого режима? Если опять по нажатию кнопки, то зачем это программировать? Делайте это на "железном" уровне. Если по истечению определённого времени, то тут есть смысл заморачиваться.
     
  19. parovoZZ

    parovoZZ Гуру

    Его нет. Всё на от....сь
     
  20. bibo

    bibo Нерд

    Я ардуину в руки взял пару месяцев назад. Языки программирования никогда не изучал. Весь мой "код" - это результат двухмесячного "изучения". Я более чем уверен, что если бы у вас было в сутки по часу на изучение основ столярного мастерства, то через два месяца вы вряд ли бы смогли склеить и собрать дверь, которая бы не вызывала смех у самого среднего столяра.