Atmega328 + nrF24L01+ помогите чайнику

Vadim81
Offline
Зарегистрирован: 12.07.2020

Добрый день уважаемые форумчане. Помогите плиз, голова уже кипит. Есть nRFка + 328атмега. управляют реле. четыре релюхи работают как тактовая кнопка, две как как кнопка с фиксацией. Проблема в следующем, при нажатии на любую  тактовую кнопку, почему то вместе с ней срабатывает реле с фиксацией, а то и оба сразу. Тактовые работают корректно, а вот со вторым проблема, причем их не отключить. Выключаешь одно, включается другое. Грешу на кривые руки, программированием давно не занимался, все писал "с листа", порыл инет на этот предмет, вроде все должно работать, перепробовал уже все что можно, но блин не хочет.  Радиомодуль на отдельной плате, если интересно могу выложить схему.

#include <SPI.h>                          
#include <nRF24L01.h>                      
#include <RF24.h>                             


byte pump;                                  
int data[1];                                
RF24 radio(10,9);                           
int relay1 = 7;                              
int relay2 = 6; 
int relay3 = 8;
int relay4 = 4;
int relay5 = 3;
int relay6 = 2;
int relay7 = 1;
int relay8 = 0;

void setup(void){
  delay(1000);                               
  pump = 100;                                
  pinMode(relay1,OUTPUT);                    
  pinMode(relay2,OUTPUT);
  pinMode(relay3,OUTPUT);
  pinMode(relay4,OUTPUT);
  pinMode(relay5,OUTPUT);
  pinMode(relay6,OUTPUT);
  pinMode(relay7,OUTPUT);
  pinMode(relay8,OUTPUT);
  radio.begin();                             
  radio.setChannel(73);                     
  radio.setDataRate (RF24_1MBPS);           
  radio.setPALevel(RF24_PA_HIGH);            
  radio.openReadingPipe(1,0x1243698297LL);   
  radio.startListening  ();                  
  
}
 
void loop(void)

// Блок работы реле в режиме нажал/отпустил

{
  if (radio.available()){                    
      radio.read(data, 1);                  
   switch (data[0]){                           
      case 121:
          digitalWrite(relay1, HIGH);
          delay(50);
          digitalWrite(relay2, HIGH);
      break;    
      case 122:
          digitalWrite(relay1, HIGH);
          delay(50);
          digitalWrite(relay3, HIGH);
          
            if(pump == 100){
              delay(1000);
              digitalWrite(relay2, HIGH);
              delay(3000);
              digitalWrite(relay2, LOW);
              pump = 0;
                           }
      break;                     
      case 123:
          digitalWrite(relay2, HIGH);
          delay(50);
          digitalWrite(relay4, HIGH);
      break;
      case 124:
          digitalWrite(relay1, HIGH);
          delay(50);
          digitalWrite(relay3, HIGH);
      break;
    // Блок работы реле в режиме переключателя
   }
 if (data[0] == 125 && digitalRead(3))digitalWrite(relay5,LOW);
 else digitalWrite(relay5,HIGH);
                    
 if (data[0] == 126 && digitalRead(2))digitalWrite(relay6,LOW);
 else digitalWrite(relay6,HIGH);
  } 
    else {
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, LOW);
      digitalWrite(relay3, LOW);
      digitalWrite(relay4, LOW);
    }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

а вы уверены. что у вас реле включаются высоким уровнем (то есть подачей HIGH) ? - очень много реле, которые включаются LOW

Vadim81
Offline
Зарегистрирован: 12.07.2020

реле управляются через ULN20**ку (набор составных, транзисторных силовых ключей), которая в свою очередь, управляется атмегой уровнем HIGH. сделано для того чтобы если вдруг чего, чтобы сгорела она.

b707
Offline
Зарегистрирован: 26.05.2017

при заливке кода через USB релюшки на выводах 0 и 1 не клацают?

b707
Offline
Зарегистрирован: 26.05.2017

В строке 44 какой размер массива данных на приеме?

Vadim81
Offline
Зарегистрирован: 12.07.2020

Нет, все тихо, стартует тоже нормально. Стоит нажать на пульте кнопку, тут же включаются.

Vadim81
Offline
Зарегистрирован: 12.07.2020

на одно значение

b707
Offline
Зарегистрирован: 26.05.2017

Vadim81 пишет:

на одно значение

Уверены? - почитайте описание функции read()  в библиотеке

Vadim81
Offline
Зарегистрирован: 12.07.2020

Я не совсем понимаю к чему ВЫ. В один момент времени нажата одна кнопка, передается один элемент массива. Значение присваивается из ходя из того, какая кнопка нажата.

b707
Offline
Зарегистрирован: 26.05.2017

Vadim81 пишет:

Я не совсем понимаю к чему ВЫ. В один момент времени нажата одна кнопка, передается один элемент массива. Значение присваивается из ходя из того, какая кнопка нажата.

 с чего вы взяли, что единица в коде read(data,1) - это число принимаемых элементов? Где это написано? - это число принимаемых байт! - а это совсем не одно и тоже

Vadim81
Offline
Зарегистрирован: 12.07.2020

я не говорил что единица это число передаваемых элементов, я сказал передается/принимается один элемент массива data, размером один байт. Тем более почему тогда остальные режимы работают нормально, если ошибка здесь.

b707
Offline
Зарегистрирован: 26.05.2017

Vadim81 пишет:

передается/принимается один элемент массива data, размером один байт.

да ну? а какой тип у вашего массива - не забыли? Посмотрите в 7 строке

Вадим, что ж так тупить то? Я же ведь даже не намекаю, я прямым текстом вам сообщаю, где ошибка. И это ошибка грубая, которую обязательно надо исправить. Но не факт, что после этого все заработает - сли нет, это просто будет означать, что эта ошибка не последняя.

Vadim81
Offline
Зарегистрирован: 12.07.2020

я не туплю, если вы имеете ввиду что под тип "int" выделяется по два байта на элемент, то это не критично, значение до 255. тем более я пробовал менять размер, эффекта никакого.

b707
Offline
Зарегистрирован: 26.05.2017

Vadim81 пишет:

я не туплю, если вы имеете ввиду что под тип "int" выделяется по два байта на элемент, то это не критично, значение до 255

Уверены, что " не критично "  ?

Когда вы передаете процедуре read() адрес переменной типа int и просите отправить один байт - какой байт по вашему отправляется - младший (это там где ваше значение) или старший?

И еще я не понимаю. Если у вас значение "до 255" и отправляете вы только 1 байт - зачем массив имеет тип инт? Почему не тип byte?

А если int все-таки зачем-то нужен и вы понимаете, что передается он частично - зачем вы так делаете? Приключений не хватает?

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

 

Vadim81
Offline
Зарегистрирован: 12.07.2020

приключений как раз хватает, массив int обозначил по привычке. Тем более проблема же не в этом. Вопрос почему параллельно срабатывают узлы, которые не должны этого делать, когда остальные работают как надо. Менял я и типы данных, и тип массива, и количество байт, на выходе все равно тоже самое.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

То есть меняли прям в коде в 7 строке на

byte data[1];

И результата это не дало?

Еще от меня вопрос (я вообще далеко не спец, просто интересно) - зачем использовать массив из 1 элемента?

b707
Offline
Зарегистрирован: 26.05.2017

Vadim81 пишет:

 Менял я и типы данных, и тип массива, и количество байт, на выходе все равно тоже самое.

простите, но то что вы пишете - это абсурд. Звучит как "заправляю феррари соляркой из тепловоза и она не заводится, помогите! пробовал сменить топливо - не помогает"

Не надо менять типы данных абы как, надо делать правильно. Прежде чем двигаться дальше - исправьте код и выложите новый вариант.

BOOM пишет:

Еще от меня вопрос (я вообще далеко не спец, просто интересно) - зачем использовать массив из 1 элемента?

да потому что во всех примерах в инете - массив, а сами думать не умеем

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

b707 пишет:

да потому что во всех примерах в инете - массив, а сами думать не умеем

Ну то есть я правильно понял - и то хорошо. А то мало ли, маразм....