nRF24L01 проблемы.

Тема в разделе "Arduino & Shields", создана пользователем Garry_Poter, 26 фев 2019.

  1. parovoZZ

    parovoZZ Гуру

    Я тебя поздравляю - купил отбраковку. Не надо по больному судить о здоровых.
     
  2. ImrDuke

    ImrDuke Гик

    Я и не говорю что оригинал. Купил у кЕтайцев по 50р за штуку.
    Три работают хорошо.
    Один сразу сдох.
    И один в пограничном состоянии.
     
  3. в delay переполнения не бывает
    в millis - да
     
  4. Garry_Poter

    Garry_Poter Нерд

    Вот и я о том же. Сейчас приложу код может все таки там где то ошибки. Я пытался найти вроде все чисто.
    Это код приемника. Вырезал из кода адрес сервера и название датчиков на народном мониторинге.
    Код (C++):

    #include <Ethernet2.h>
    #include <MS5611.h>
    #include <SPI.h>                                      
    #include <nRF24L01.h>                                
    #include <RF24.h>                                                                      
    RF24           radio(7, 8);                          
    int            data[4];                              
    boolean newInfo = 0;
    MS5611 ms5611;
    long realPressure;
    double referencePressure;
    int h,t;
    float d;
    int lux;
    int osad;
    const unsigned long time2 = 60000;
    unsigned long lastmon;
    const unsigned long temptime = 400000;
    unsigned long lasttime;
    byte mac[] = {  };
    IPAddress ip(192, 168, 0, 100);
    EthernetClient client;
    boolean currentLineIsBlank;
    void setup(){
        Serial.begin(57600);
        ms5611.begin();
        delay(1000);
        referencePressure = ms5611.readPressure();
        ms5611.getOversampling();
        radio.begin();
        Ethernet.begin (mac, ip);
        d = 0;
        radio.setChannel(20);                              
        radio.setDataRate     (RF24_1MBPS);              
        radio.setPALevel      (RF24_PA_MAX);            
        radio.openReadingPipe (1, 0x1234567890LL);        
        radio.startListening  ();                      
    }

    void loop(){
        if(radio.available()){                            
            radio.read(&data, sizeof(data));              
            h = data[0];
            t = data[1];
            osad = data[2];
            lux = data[3];
            Serial.print(t);
            d = ms5611.readPressure();
            d = d / 133.322;
          }
        if (millis() - lastmon > time2) {
        char server[] = "";
        client.connect(server, 80);
        client.print( "GET /scripts.php?");
        client.print("t=");
        client.print(t);
        client.print("*C");
        client.print("_");
        client.print("&");
        client.print("h=");
        client.print(h);
        client.print("%");
        client.print("_");
        client.print("&");
        client.print("d=");
        client.print(d, 1);
        client.print("");
        client.println(" HTTP/1.1");
        client.print( "Host: " );
        client.println(server);
        client.println( "Connection: close" );
        client.println();
        client.println();
        client.stop();
        client.flush();
        lastmon = millis();
        Serial.print("OK");
      }
       if (millis() - lasttime > temptime) {
        char server[] = "narodmon.ru";
        int port = 8283;
        if (client.connect(server, port)) {
          client.print(F(""));
          client.print(F("#T0#"));
          client.print(t);
          client.print(F());
          client.print("#P1#");
          client.print(d, 1);
          client.print(F());
          client.print("#H1#");
          client.print(h);
          client.print(F());
          client.print("##");
          delay(200);
          client.stop();
        }
        lasttime = millis ();
      }
    }
     
    Код передатчика
    Код (C++):

    #include <SPI.h>                                      
    #include <nRF24L01.h>                                
    #include <RF24.h>                                    
    #include <DallasTemperature.h>
    #include <Wire.h>
    #include <SI7021.h>
    #include <BH1750.h>
    #define PIN A1
    #define ONE_WIRE_BUS 5
    OneWire oneWire(ONE_WIRE_BUS);
    SI7021 sensor;
    BH1750 lightMeter;
    int lux;
    DallasTemperature sensors(&oneWire);
    RF24           radio(7, 8);                          
    int            data[4];                              
    void setup(){
        Wire.begin();
        radio.begin();
        lightMeter.begin();                                
        radio.setChannel(20);                              
        radio.setDataRate     (RF24_1MBPS);              
        radio.setPALevel      (RF24_PA_MAX);            
        radio.openWritingPipe (0x1234567890LL);    
    }

    void loop(){
        data[0] = sensor.getHumidityPercent();
        sensors.requestTemperatures();
        data[1] = sensors.getTempCByIndex(0);;
        data[2] = analogRead(PIN);
        lux = lightMeter.readLightLevel();
        data[3] = lux;
        radio.write(&data, sizeof(data));          
        delay(180000);
    }
     
     
    Последнее редактирование: 26 фев 2019
  5. Garry_Poter

    Garry_Poter Нерд

    Код я прикрепил дальше. Ну если бы с микросхемой была бы проблема то он бы в разное время не работал а так ровно через сутки +- 2 часа .
     
  6. parovoZZ

    parovoZZ Гуру

  7. ИгорьК

    ИгорьК Гуру

  8. Garry_Poter

    Garry_Poter Нерд

  9. ИгорьК

    ИгорьК Гуру

    Берите свое устройство, присоединяйте к порту компьютера, дописывайте код вывода в порт и выгоняйте в него данные. Наблюдайте.
     
  10. parovoZZ

    parovoZZ Гуру

    не имея опыта - думать бесполезно.

    Любая проблема не очень распространенная. Необходимо брать диагностический инструмент и дефектовать. По форумам шляться бесполезно.

    Ничего сложного я не рассказываю.
     
  11. Garry_Poter

    Garry_Poter Нерд

    Разберусь-отпишусь здесь
     
  12. ImrDuke

    ImrDuke Гик

    Вариант с перезагрузкой модуля я подсказал.
    Можно еще попробовать заменить на другой модуль.
     
  13. ImrDuke

    ImrDuke Гик

    Хорошо бы увидеть программы целиком и со схемами подключения.
     
  14. Garry_Poter

    Garry_Poter Нерд

    Да я понял) попробую но пусть сначала в монитор порта выводит двое суток. Программы там целиком просто убран адрес сервера и мак адрес контроллера. Схему подключения позже сделаю докину.
     
  15. parovoZZ

    parovoZZ Гуру

    Т.к. JTAG адаптера у меня нет (как и у львиной доли здесь присутствующих), то для выяснения того, выполняется ли тот или иной участок кода внутри МК я делаю (среди прочего, а не только!) так.
    Пишем макрос для пина (это может быть пин со светодиодом или просто свободный пин, на который можно повесить ЛА):
    Код (C++):
    #define LED PINA1
    #define LEDpin PINA
    #define LEDport PORTA
    #define LEDddr DDRA
    Далее в секции инициализации переводим пин на выход
    Код (C++):
    LEDddr |= 1<<LED;
     
    В интересующем месте/участке кода зажигаем светодиод:
    Код (C++):

    LEDport |= (1<<LED);
    ,
    либо же генерируем прямоугольные импульсы:
    Код (C++):

    LEDpin |= (1<<LED);
    я точно знаю, что данные вставки занимают 1-2 такта процессора, поэтому вычислить скорость выполнения цикла или ещё что, не составит никакого труда.
     
  16. ИгорьК

    ИгорьК Гуру

    Это архиважно при задержке в коде три минуты.

    А иначе тупо вставляем в код вывод в сериал в разных частях скетча, причем не "блинк" светодиодом, а что-то более информативное, чтобы видеть, где оно упадет.

    Но если мы корабль на луну отправляем, это, конечно не годится.
     
  17. parovoZZ

    parovoZZ Гуру

    Да. Я так отлаживался до появления ЛА. В разных участках кода и по пути исполнения программы вставлял числа. И таких мест у меня было порядка 50. Ну и попутно наружу выводил значения регистров в проблемных местах. Следующее развитие - это JTAG адаптер. Но, к сожалению, все мной используемые МК его не поддерживают. Ну и цена конская.
     
  18. Garry_Poter

    Garry_Poter Нерд

    Код (C++):
    if(radio.available()){                          
            radio.read(&data, sizeof(data));            
            h = data[0];
            t = data[1];
            osad = data[2];
            lux = data[3];
            Serial.print(t);
            d = ms5611.readPressure();
            d = d / 133.322;
          }
    Выяснилось что контроллеры все же не зависают. Просто в один момент, этот момент происходит в разное время вместо показаний от второго контроллера, приходят нули. В результате контроллер которые принимает данные просто потом отказывается проверять буфер на наличие новых данных и тупо пропускает это условие пока не нажмешь reset
     
  19. b707

    b707 Гуру

    Чего это он "отказывается"? Может надо было попросить вежливо? Или пригрозить?

    Если иронии не поняли - поясняю - конктроллеру все равно, что там приходит, нули или единицы. Это не должно никак влиять на дальнейшую работу. Ищите ошибку в коде

    И еще - зачем вы в цикл опроса приемника вставили работу с датчиком давления?
     
    Последнее редактирование: 2 мар 2019
  20. b707

    b707 Гуру

    добавлю
    простите мой французский - но что это за бредятина?
    Код (C++):
    client.print( "GET /scripts.php?");
        client.print("t=");
        client.print(t);
        client.print("*C");
        client.print("_");
        client.print("&");
        client.print("h=");
        client.print(h);
        client.print("%");
        client.print("_");
        client.print("&");
        client.print("d=");
        client.print(d, 1);
    Зачем вы в клиент каждый символ отдельно пихаете? Разве нельзя было написать так:
    Код (C++):
    client.print( "GET /scripts.php?t=");
        client.print(t);
        client.print("*C_&h=");
        client.print(h);
        client.print("%_&d=");
        client.print(d, 1);