РЕШЕНО Как подключить Nrf24l01 и OLED дисплей к Ардуино

Тема в разделе "Arduino & Shields", создана пользователем Alibek, 30 окт 2019.

  1. Alibek

    Alibek Нуб

    Есть nrf24l01 oled дисплей и arduino
    Хочу сделать автополив растений и чтобы время полива я задовал через часы. Кое как сделал и сработало но очень тормозит система попробовал для интереса отключить nrf и все работало очень шустро подумал что дело в nrf но нет он тоже работает. Почитал в интернете и оказывается не только у меня такая проблема. Если кто нибудь знает в чем дело можете помочь.
     
  2. NikitOS

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

    Прочитать тему про nRF в соседнем разделе, там про это 99% было
     
  3. Alibek

    Alibek Нуб

    Скините ссылку
     
  4. NikitOS

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

    DetSimen нравится это.
  5. b707

    b707 Гуру

    Никогда не слышал, чтобы НРФ тормозил программу. Покажите код, иначе разговор ни о чем
     
  6. Alibek

    Alibek Нуб

    для полива

    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
    int secund;
    int minut;
    int chas;
    int minyt;
    int chasy;
    RF24 radio(7,8);
    int plant=2;
    byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера труб
    byte data[2];
    void setup(){
    radio.begin(); //активировать модуль
    radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
    radio.setRetries(0,15); //(время между попыткой достучаться, число попыток)
    radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
    radio.setPayloadSize(32); //размер пакета, в байтах
    radio.openReadingPipe(1,address[0]); //хотим слушать трубу 0
    radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)
    radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
    radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
    //должна быть одинакова на приёмнике и передатчике!
    //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

    radio.powerUp(); //начать работу
    radio.startListening(); //начинаем слушать эфир, мы приёмный модуль
    display.begin(SSD1306_SWITCHCAPVCC);
    display.clearDisplay();
    display.display();
    secund=40;
    minut=59;
    chas=24;
    pinMode(plant,OUTPUT);
    }
    void Clock() {
    display.clearDisplay();
    display.setTextSize(2.89);
    display.setTextColor(WHITE);
    {
    display.setCursor(35, 8);
    display.print(":");
    }
    {
    display.setCursor(85, 8);
    display.print(":");
    }
    display.setCursor(104, 8);
    display.print(secund);
    secund=secund+1;
    delay(1000);
    if(secund==60)
    {
    secund=1;
    minut=minut+1;
    }
    display.setCursor(55, 8);
    display.print(minut);
    if(minut==60)
    {
    minut=1;
    chas=chas+1;
    }
    display.setCursor(0, 8);
    display.print(chas);
    if(chas==25)
    {
    chas=1;
    }
    display.display();
    }
    void loop() {
    Clock();
    byte pipeNo;
    while( radio.available(&pipeNo)){ // слушаем эфир со всех труб
    radio.read(&data, sizeof(data));
    }


    chasy=data[0];
    minyt=data[1];

    if(chasy==chas&&minyt==minut)
    {
    digitalWrite(plant,HIGH);
    }

    }

    для часов
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
    int secund;
    int minut;
    int chas;
    int minyt;
    int chasy;
    int regim=1;
    boolean flag1=0;
    boolean flag2=0;
    byte data[2];
    RF24 radio(9, 10);
    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
    void setup() {
    Serial.begin(9600);
    radio.begin();
    radio.setAutoAck(1);
    radio.setRetries(0, 15);
    radio.enableAckPayload();
    radio.setPayloadSize(32);
    radio.openWritingPipe(address[0]);
    radio.setChannel(0x60);
    radio.setPALevel (RF24_PA_MAX);
    radio.setDataRate (RF24_250KBPS);
    radio.powerUp();
    radio.stopListening();
    display.begin(SSD1306_SWITCHCAPVCC);
    pinMode(2,INPUT_PULLUP);
    pinMode(3,INPUT_PULLUP);
    }
    void autoplant()
    {
    {
    display.clearDisplay();
    display.setTextSize(1.95);
    display.setTextColor(WHITE);
    display.setCursor(21, 8);
    display.print("watering plants");
    }
    display.setCursor(75, 21);
    display.print(minyt);

    if(digitalRead(2)==HIGH&&flag1==0)
    {
    minyt++;
    flag1=1;
    }
    if(digitalRead(2)==LOW&&flag1==1)
    {
    flag1=0;
    }
    else if(minyt==61)
    {
    minyt=1;
    }

    display.setCursor(55, 21);
    display.print(chasy);
    if(digitalRead(3)==HIGH&&flag2==0)
    {
    chasy++;
    flag2=1;
    }
    if(digitalRead(3)==LOW&&flag2==1)
    {
    flag2=0;
    }
    else if(chasy==61)
    {
    chasy=1;
    }
    {
    display.setCursor(65 , 21);
    display.print(":");
    }

    display.display();
    }
    void loop()
    {
    autoplant();
    radio.write(&data, sizeof(data));
    data[0]=chasy;
    data[1]=minyt;
    }
     
  7. NikitOS

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

    А теперь читаем объявления и исправляем ошибки
     
  8. b707

    b707 Гуру

    Alibek - вставьте код по правилам форума. Но вообще-то я и так вижу, что ваш код даже компилироваться не будет, так что вы явно лукавите, говоря что он у вас "тормозит". Он даже запускаться не должен. Похоже, вы заливаете в ардуину какой-то другой код, не тот что выложили.
    В таком ключе разговор не имеет смысла. Или выкладывайте именно тот код, который используете - или решайте проблемы сами.
     
  9. Alibek

    Alibek Нуб

    ну ладно вы правы в моем коде некоторые переменные я писал на своем языке поэтому они могут быть не понятными
     
  10. b707

    b707 Гуру

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

    Alibek Нуб

    Код (C++):
    #include <SPI.h>        
    #include "nRF24L01.h"    
    #include "RF24.h"        
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
    int secund;
    int minut;
    int chas;
    int minyt;
    int chasy;
    int regim=1;
    boolean flag=0;
    boolean flag1=0;
    boolean flag2=0;
    byte data[2];
    RF24 radio(9, 10);
    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
    void setup() {
      Serial.begin(9600);
      radio.begin();
      radio.setAutoAck(1);        
      radio.setRetries(0, 15);  
      radio.enableAckPayload();  
      radio.setPayloadSize(32);    
      radio.openWritingPipe(address[0]);  
      radio.setChannel(0x60);
      radio.setPALevel (RF24_PA_MAX);
      radio.setDataRate (RF24_250KBPS);
      radio.powerUp();
      radio.stopListening();
      display.begin(SSD1306_SWITCHCAPVCC);
      display.clearDisplay();
      display.display();
       secund=00;
      minut=16;
      chas=17;
      pinMode(2,INPUT_PULLUP);
      pinMode(3,INPUT_PULLUP);
      pinMode(6,INPUT_PULLUP);
    }
    void sagat() {
      display.clearDisplay();
      display.setTextSize(2.89);
      display.setTextColor(WHITE);
      {
      display.setCursor(35, 8);
      display.print(":");
      }
      {
      display.setCursor(85, 8);
      display.print(":");
      }
      display.setCursor(104, 8);
      display.print(secund);
      secund=secund+1;
      delay(1000);
      if(secund==61)
      {
        secund=1;
        minut=minut+1;
      }
      display.setCursor(55, 8);
      display.print(minut);
      if(minut==61)
      {
        minut=1;
        chas=chas+1;
      }
      display.setCursor(0, 8);
      display.print(chas);
      if(chas==25)
      {
        chas=1;
      }
      display.display();
      }
      void autoplant()
      {
      {
      display.clearDisplay();
      display.setTextSize(1.95);
      display.setTextColor(WHITE);
      display.setCursor(21, 8);
      display.print("watering plants");
      }
      display.setCursor(75, 21);
      display.print(minyt);
     
      if(digitalRead(2)==HIGH&&flag1==0)
      {
        minyt++;  
        flag1=1;
      }
       if(digitalRead(2)==LOW&&flag1==1)
           {
            flag1=0;
           }
      else if(minyt==61)
      {
        minyt=1;
      }
     
      display.setCursor(55, 21);
      display.print(chasy);
      if(digitalRead(3)==HIGH&&flag2==0)
      {
        chasy++;
        flag2=1;
      }
       if(digitalRead(3)==LOW&&flag2==1)
           {
            flag2=0;
           }
      else if(chasy==61)
      {
        chasy=1;
      }
      {
      display.setCursor(65  , 21);
      display.print(":");
      }    
     
      display.display();
      }
      void security()
      {
         display.clearDisplay();
      display.setTextSize(1.95);
      display.setTextColor(WHITE);
      display.setCursor(21, 8);
      display.print("security");
      display.display();
      }
      void LED()
      {
        display.clearDisplay();
      display.setTextSize(1.95);
      display.setTextColor(WHITE);
      display.setCursor(21, 8);
      display.print("LED");
      display.display();
      }
      void alarmclock()
      {
        display.clearDisplay();
      display.setTextSize(1.95);
      display.setTextColor(WHITE);
      display.setCursor(21, 8);
      display.print("alarmclock");
      display.display();
      }
    void loop() {
     
       radio.write(&data, sizeof(data));
      data[0]=chasy;
      data[1]=minyt;          
      if(digitalRead(6)==HIGH&&flag==0)
           {  
            delay(100);  
             regim++;
             flag=1;        
             if(regim>5)        
              {
                regim=1;
              }
           }
            if(digitalRead(6)==LOW&&flag==1)
           {
            flag=0;
           }
          if(regim==1)
          {
            sagat();
          }
          if(regim==2)
          {
            autoplant();
           
          }
          if(regim==3)
          {
            security();
          }
          if(regim==4)
          {
            LED();
          }
          if(regim==5)
          {
            alarmclock();
          }
       }
     
  12. Alibek

    Alibek Нуб

    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include <Wire.h>
    #include <Adafruit_GFX.h>
    #include <Adafruit_SSD1306.h>
    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);
    int secund;
    int minut;
    int chas;
    int minyt;
    int chasy;

    RF24 radio(7,8);

    int plant=2;
    byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};  //возможные номера труб
    byte data[2];
    void setup(){
      Serial.begin(9600); //открываем порт для связи с ПК
      radio.begin(); //активировать модуль
      radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
      radio.setRetries(0,15);     //(время между попыткой достучаться, число попыток)
      radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
      radio.setPayloadSize(32);     //размер пакета, в байтах

      radio.openReadingPipe(1,address[0]);      //хотим слушать трубу 0
      radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

      radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
      radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
      //должна быть одинакова на приёмнике и передатчике!
      //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
     
      radio.powerUp(); //начать работу
      radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
      display.begin(SSD1306_SWITCHCAPVCC);
      display.clearDisplay();
      display.display();
      secund=40;
      minut=59;
      chas=24;
      pinMode(plant,OUTPUT);
    }
    void sagat() {
      display.clearDisplay();
      display.setTextSize(2.89);
      display.setTextColor(WHITE);
      {
      display.setCursor(35, 8);
      display.print(":");
      }
      {
      display.setCursor(85, 8);
      display.print(":");
      }
      display.setCursor(104, 8);
      display.print(secund);
      secund=secund+1;
      delay(1000);
      if(secund==60)
      {
        secund=1;
        minut=minut+1;
      }
      display.setCursor(55, 8);
      display.print(minut);
      if(minut==60)
      {
        minut=1;
        chas=chas+1;
      }
      display.setCursor(0, 8);
      display.print(chas);
      if(chas==25)
      {
        chas=1;
      }
      display.display();
      }
    void loop() {
      sagat();
        byte pipeNo;                        
        while( radio.available(&pipeNo)){    // слушаем эфир со всех труб    
           radio.read(&data, sizeof(data));
    }
     
                               
         chasy=data[0];
         minyt=data[1];
         
      if(chasy==chas&&minyt==minut)
      {
        digitalWrite(plant,HIGH);  
      }
     
    }
     
  13. Alibek

    Alibek Нуб

    1 часы (я не сказал вам правду эти часы не только для управления поливом но и многим другим)
    2 автополив

    мне нужна помощь пока что только с поливом остальными устройствами займусь потом
     
  14. Alibek

    Alibek Нуб

    этот код настоящий
     
  15. b707

    b707 Гуру

    если вам нужна помощь только с поливом. зачем вы выкладываете второй код?
     
  16. Alibek

    Alibek Нуб

    но так ведь я упровляю им с помощью часов а интерфейс часов очень глючит в этом и вся проблема
     
  17. b707

    b707 Гуру

    давайте по порядку.
    1. Какой именно скетч глючит? - часы или полив?
    2. В чем заключается это "глючит" - подробнее
     
  18. Alibek

    Alibek Нуб

    кароче скетч полива работает
    Скетч часов тоже НО она очень медленно работает и иногда просто не делает ничего. когда я отключаю nrf она работает.
     
  19. b707

    b707 Гуру

    Во-первых, у вас в процедуре sagat() стоит задержка на секунду - а это значит что все очень сильно будет тупить

    Во-вторых, самая первая строчка в loop() - radio.write(&data, sizeof(data)); - исполняется много раз в секунду, отсылая сотни раз одни и те же значения часов и минут. Пересылайте массив data по радио только в том случае. если минуты или часы изменились
     
  20. Alibek

    Alibek Нуб

    все понял спасибо