самопальная ОПС на 1 канал. точнее прототип. помогите плз, не взлетает.

example86
Offline
Зарегистрирован: 07.12.2017

Доброго времени суток. 

вот что должно было получиться

"на порту д2 висит геркон, на д3 реле нр, имеется считыватель rfid и 2 ключа .

при включенном питании светодиод на д4 (зеленый) горит, при постановке на охрану загорается д5 (красный)
при включении объект под охраной!, записываем статус в переменную,
при размыкании д2 включить д3.
при появлении на считывателе зарегистрированного ключа поменять статус в переменной погасить д5 выключить д3 если сработала, выключить услови при размыкании д2 включить д3
при появлении на считывателе зарегистрированного ключа поменять статус в переменной включить д5 слушать д2".
 
теперь что имеем:
 
int RelayDev = 3;//d3
int GerkonDev = 2; //d2
int Stat = 1;//еще  одна хрень для статуса
int Arm = 0; //переменная статуса
int RedLed = 4;//d4
int GreenLed = 5;//d5
//добавляем херню длярфид
#include <SPI.h>
#include <MFRC522.h> // библиотека "RFID".
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
unsigned long uidDec, uidDecTemp;  // для храниения номера метки в десятичном формате
void setup() {
pinMode(RelayDev, OUTPUT);//выход 
pinMode(GerkonDev, INPUT);//вход
pinMode(GreenLed, OUTPUT); //индикация питания
SPI.begin();  //  инициализация SPI / Init SPI bus.
mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.
}

void loop() {
digitalWrite(GreenLed, HIGH);//индикатор питания включен
digitalWrite(RedLed, HIGH);//индикатор запущеной службы вроде тоже
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }
  uidDec = 0;
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec * 256 + uidDecTemp;
  }

//а с этого места уже заплюхался. 
  if (uidDec == 1973922155 || 299185877) {
    digitalWrite(RelayDev, LOW);
    digitalWrite(RedLed, HIGH);
    }

      
Arm = digitalRead(GerkonDev);//забираем статус геркона
if (Arm == LOW) {
  digitalWrite(RelayDev, HIGH);
    }
}

 

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

И что именно не работает? "Не взлетает" это что? бутлоадер слетел и не шьется или что? Если конкретные вопросы по коду задавайте конкретные вопросы.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

в С такая логика не работает 

39   if (uidDec == 1973922155 || 299185877)

нада 

39

  if ((uidDec == 1973922155L) || (uidDec == 299185877L)) // не забывать про long

и вот это, хоть ни на што не влияеть, но в loop-е явно лишнее

23 digitalWrite(GreenLed, HIGH);//индикатор питания включен
24 digitalWrite(RedLed, HIGH);//индикатор запущеной службы вроде тоже
 

если GreenLed должен гореть все время, то его надо в setup() и включить.  

А RedLed независимо от того, должен он гореть или нет, включается при каждом входе в loop() (это значит всегда).  

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

заведи все свои ключи в массив и проверяй потом, правильный ли ключ приклали, в одной функции, читабельней будет

long idKeys[] = { 0xDEADBEEF, 0xBEEFDEAD };  // массив ключиков, не более 255


bool ValidKey(long key)  // вернуть true, если ключ найден в массиве разрешенных и false, если нет
{
	int size = sizeof(idKeys) / sizeof(long);

	if (size > 255) abort();            // или вывести здесь ошибку, что ключей больше 255

	for (byte i = 0; i < byte(size); i++)  // иначе i и size сравниваца будет как int, а это дольше и не нужно
	{
		if (idKeys[i] == key) return true;
	}

	return false;
}

 

example86
Offline
Зарегистрирован: 07.12.2017

ой, не совсем корректно написал. мозги уже в отключенном состоянии были %) 

самая большая сложность в том что постановка и снятие с охраны происходит по предъявлении ключа считывателю.  конечно уже и форум читал и примеры смотрел все возможные, но самый нормальный пример это вот этот абстрактный пример подходит идеально, но как указать вместо абстрактного buttonPin условия наличия  uid'ов ключей.

const int buttonPin = 2;
const int ledPin = 13;
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop() {
digitalRead(buttonPin);
while(!digitalRead(buttonPin)){}
digitalWrite(ledPin, HIGH);
while(digitalRead(buttonPin)){}
while(!digitalRead(buttonPin)){}
digitalWrite(ledPin, LOW);
while(digitalRead(buttonPin)){}
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

как указать вместо абстрактного buttonPin условия наличия  uid'ов ключей.

как в самом первом скетче написано в строке #7 : "Добавляем херню для rfid" 

example86
Offline
Зарегистрирован: 07.12.2017

Эээ.. То есть? Немного не понял ход Ваших мыслей

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

в скетче из сообщения #4 нету ничего для чтения RFID ключей.  Надо добавить. 

example86
Offline
Зарегистрирован: 07.12.2017

доброго времени еще раз.

ткните рожей в ошибку плз(

#include <SPI.h> //вроде нужна для mfrc522
#include <MFRC522.h> // библиотека "RFID".
#define SS_PIN 10 //пин ss ридера
#define RST_PIN 9 //пин rst ридера
int RelayDev = 3;//d3
int GerkonDev = 2; //d2
int Arm;
int RedLed = 4;//красный светодиод на d4 
int GreenLed = 5;//зеленый светодиод на d5
MFRC522 mfrc522(SS_PIN, RST_PIN); //объявляем ридер
unsigned long uidDec, uidDecTemp;  // для храниения номера метки в десятичном формате
long key;
void setup() {
pinMode(RelayDev, OUTPUT);//реле как выход 
pinMode(GerkonDev, INPUT);//геркон вход
pinMode(GreenLed, OUTPUT); //индикация питания
pinMode(RedLed, OUTPUT); //индикация при боевом режиме
SPI.begin();  //  инициализация SPI / Init SPI bus.
mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.
digitalWrite(GreenLed, HIGH);//светильник включен, питание есть работает всегда
Arm = digitalRead(GerkonDev);//забираем статус геркона
}
void loop() {

   // Поиск новой метки
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }
  // Выбор метки
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }
  uidDec = 0;
  // Выдача серийного номера метки.
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    uidDecTemp = mfrc522.uid.uidByte[i];
    uidDec = uidDec * 256 + uidDecTemp;
long uidDec[] = {1973922155L, 299185877L };  // массив ключиков, не более 255
bool ValidKey(long key);  // вернуть true, если ключ найден в массиве разрешенных и false, если нет
int size = sizeof(uidDec) / sizeof(long);

  for (byte i = 0; i < byte(size); i++)  // иначе i и size сравниваца будет как int, а это дольше и не нужно
  {
    if (uidDec[i] == key) return true;
  }
  return false;
}
uidDec; //где-то
while(!uidDec){} //тут 
digitalWrite(RedLed, HIGH); //я 
if (Arm == LOW)  
{
digitalWrite(RelayDev, HIGH); //сделал
}
while(uidDec){} //какую то
while(!uidDec){} //х..ню
digitalWrite(RedLed, LOW);
if (Arm == LOW) 
{
  digitalWrite(RelayDev, LOW); 
}
while(uidDec){} //я дятел(


}
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Дак ошибка секретная же. Тем более написан бессмысленный набор операторов, с виду похожих на С

example86
Offline
Зарегистрирован: 07.12.2017
#include <SPI.h> //нужно для MFRC522.h
#include <MFRC522.h> // библиотека "RFID".
#define STATE_LED 5
MFRC522 mfrc522(10, 9); //объявляем считыватель
unsigned long uidDec, uidDecTemp;  //номера метки(10)
int State=1;


void setup() {
  Serial.begin(9600);
  Serial.println("Waiting for card...");
  SPI.begin();  //  инициализация SPI / Init SPI bus.
  mfrc522.PCD_Init();     // инициализация MFRC522 / Init MFRC522 card.

 pinMode(STATE_LED, OUTPUT);


}
void loop() {
  if ( ! mfrc522.PICC_IsNewCardPresent()) {  return;} //ждем метку...
  if ( ! mfrc522.PICC_ReadCardSerial()) { return; }   // Метка есть)
  uidDec = 0;
  for (byte i = 0; i < mfrc522.uid.size; i++) {uidDecTemp = mfrc522.uid.uidByte[i];  uidDec = uidDec * 256 + uidDecTemp; }   // получаем серийник(10)
  Serial.println("Card UID: ");
  Serial.println(uidDec); // Выводим UID метки в консоль.

///////////////////////////////////////////////////////////////////////////////////////////////////////

  
  if (uidDec == 1973922155 || 299185877 )
{ 
   uidDec = 0;
if ( State==1 ){
  
    Serial.println("Security state: Off");
    tone(2, 700, 500); // Делаем звуковой сигнал, Открытие
    State = 0;
  delay(2000); // метку ввели. отсеиваем лишнее
  } 
else
{
   State=1;
   Serial.println("Security state: On");
    tone(2, 700, 1000); // Делаем звуковой сигнал, Открытие
    delay(2000); // метку ввели. отсеиваем лишнее
  }
}  }

вот эта фигня уже работает. дык блин, почти то же самое делал..  отсюда