Sari la conținut
ELFORUM - Forumul electronistilor

Arduino UNO - Integrare sistem alarma - deschidere porti.


Postări Recomandate

Buna ziua,

Am intr-o locatie un siste de alarma si un sistem separat pentru automatizare porti.

Ce am facut pana in momentul de fata. Cand se armeaza sistemul de alarma imi activeaza o iesire (PGM 2) si imi actioneaza un releu.

Sistemul de porti are pe placa zona C, 2 si 3, daca fac un strap individual pe acestea ( adica intre 2 si C sau 3 si C ) imi inchide sau deschide poarta. Zona 2 inchidere si zona 3 deschidere. Pana aici totul bine si frumos.

Centrala de alarma cand se armeaza imi activeaza releul pana la dezarmare. Doar ca pe sistemul de porti pe acele zone trebuie sa ii dau un N.C. de cateva secunde si sa revina pe N.O. Pana acum sistemul de alarma se armeaza si imi inchide poarta, dezarmez imi deschide poarta, doar ca nu se mai poate deschide din telecomanda porti, deoarece imi ramane activata zona din centrala ( adica strap intre C si 2.

 

Asa ca am zis sa incerc cu arduino!

Din iesirea de la centrala al legat un RELEU. Prin releu trec ceva de genul pushbutton arduino si vad in el 1 sau 0 ( High sau LOW, presupun). M-am documentat pe net si am folosit acest cod pentru arduino




// TEST - OPEN/CLOSE GATE SYSTEM.
// set pin numbers:
const int PGMalarm = 2;        // Starea sistemului de alarma.
const int GateOpen =  11;      // Actioneaza releu 1 - deschide poarta.
const int GateClose = 12;      // Actioneaza releu 2 - inchide poarta.



void setup() {
  // initialize output PIN:
  pinMode(GateOpen, OUTPUT);
  pinMode(GateClose, OUTPUT);
  // initialize input PIN:
  pinMode(PGMalarm, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  const int System  = PGMalarm ;
  
  // Verificam daca sistemul de alarma este armat!
  // Daca sistemul este armat atunci starea (System) este HIGH
  if (System == HIGH) {
    //Daca sistemul este HIGH atunci este armat si inchide poarta.
    //Actioneaza releul 1 pentru 5secunde.
    digitalWrite(GateClose, HIGH);
    delay(3000);
    digitalWrite(GateClose, LOW);
  } 
  if (System == LOW)  {
    // Daca sistemul este LOW atunci este dezarmat si deschide poarta.
    //Actioneaza releul 2 pentru 5secunde.
    digitalWrite(GateOpen, HIGH);
    delay(3000);
    digitalWrite(GateOpen, LOW);
    
  }
}

Ce doresc eu sa fac, pe acest arduino am o placa cu doua relee.

Cand primeste semnal de LOW sau HIGH ( si o sa ramana in HIGH pana la dezarmare ) de la centrala de alarma ( asta inseama ca s-a armat ). Atunci sa imi activeze releul 1 timp de 2-3 secunde si sa revina la starea initiala. Cand se dezarmeaza ( adica din HIGH trece in LOW ) sa imi activeze releul 2 timp de 2-3 secunde apoi sa revina la starea initiala.

 

Nu reusesc sa fac chestia asta, va rog sa imi aratati unde gresesc sau ce sa fac.

Va multumesc!

Link spre comentariu
  • Răspunsuri 16
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Imagini postate

Desi am incercat cu Arduino IDE nu am reusit sa fac mare lucru si nu pricep de ce.

Ai mai jos codul sursa pentru ceea ce vrei tu:


* alarma_forum.c
*
* Created: 21-Jun-17 11:56:33 AM
* Author : nico_2010
*/
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define GATE_OPEN 3
#define GATE_CLOSE 4
#define GATE_PORT PORTB
#define GATE_DDR DDRB
#define INPUT_SYS_0 2
#define INPUT_SYS_1 3
#define PORT_INPUT_AL PORTD
#define DDR_INPUT_AL  DDRD

volatile uint8_t state_open=0;
volatile uint8_t state_close=0;


int main(void)
{
	GATE_DDR  |=((1<<GATE_OPEN)|(1<<GATE_CLOSE));
	GATE_PORT &=~((1<<GATE_OPEN)|(1<<GATE_CLOSE));
	DDR_INPUT_AL &=~(1<<INPUT_SYS_0)|(1<<INPUT_SYS_1);
	PORT_INPUT_AL |=(1<<INPUT_SYS_0)|(1<<INPUT_SYS_1);
	EICRA |=(1<<ISC11)|(1<<ISC10)|(1<<ISC01);
	EIMSK |= (1<<INT0)|(1<<INT1);
	sei();
	/* Replace with your application code */
	while (1)
	{
		if(state_open)
		{
			GATE_PORT |=(1<<GATE_OPEN);
			_delay_ms(5000);
			GATE_PORT &=~(1<<GATE_OPEN);
			state_open=0;
		}
		if(state_close)
		{
			GATE_PORT |=(1<<GATE_CLOSE);
			_delay_ms(5000);
			GATE_PORT &=~(1<<GATE_CLOSE);
			state_close=0;
		}
	}
}
ISR(INT0_vect)
{
	state_open = 1;
}

ISR(INT1_vect)
{
	state_close = 1;
}


Ai si schema principiala, LED-urile urmand a fi inlocuite cu un tranzistoare si relee. In arhiva gasesti tot proiectul, inclusiv fisierul hex pe care il poti incarca direct in microcontrollerul ATMega328.

Bafta!

alarma_forum.zip

post-194122-0-99067500-1498037663_thumb.png

Link spre comentariu

Daca citeai pana la capat si cu atentie postarea nr.5 gaseai si raspunsul cu privire la conectarea releelor "LED-urile urmand a fi inlocuite cu un tranzistoare si relee". Intrarea semnalului de la alarma este marcata pe schema principiala prin prezenta butonului, care va fi inlocuit cu firul care vine de la sistemul de alarma.

Schema pentru Arduino Uno Rev3: https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf

Iar pentru Arduino Duemilanove aici: https://cdn.solarbotics.com/products/schematics/arduino-duemilanove-schematic.pdf cu mentiunea ca in loc de ATMega8 este instalat ATMega328

Link spre comentariu

Daca citeai pana la capat si cu atentie postarea nr.5 gaseai si raspunsul cu privire la conectarea releelor "LED-urile urmand a fi inlocuite cu un tranzistoare si relee". Intrarea semnalului de la alarma este marcata pe schema principiala prin prezenta butonului, care va fi inlocuit cu firul care vine de la sistemul de alarma.

Schema pentru Arduino Uno Rev3: https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf

Iar pentru Arduino Duemilanove aici: https://cdn.solarbotics.com/products/schematics/arduino-duemilanove-schematic.pdf cu mentiunea ca in loc de ATMega8 este instalat ATMega328

Mi-am batut capu cu schemele astea si tot nu imi dau seama unde si ce sa pun.

Nu sunt programator, daca ma puteti ajuta mai "mura in gura".

Am o placa arduino uno si o placa cu doua relee tot de la arduino.

Va multumesc!

Link spre comentariu

BUn, ground nu am cum sa il dau din sistemul de alarma in momentul asta, il dau de pe arduino.

Cu codul incarcat si ground neactivat releele sunt activate.

Daca pun minus se opreste un releu 1 pentru 5 secunde apoi face acelasi lucru si releu 2. Si raman activate.

Ce vreau eu sa faca este atunci cand ii dau minus doar un releu 1 sa activeze 5 secunde apoi sa revina la normal.

Cand ii iau minus dupa ( 1 ora, 10min, 1zi ) sa activeze doar releu 2 pentru 5 secunde. Se poate chestia asta?

Va multumesc!

Link spre comentariu

1. Monteaza cate un tranzistor NPN prin rezistente de 10k la pinii 11 si 12 ai Arduino. In colectorul lor montezi rezistente de 1k. Din colectoarele lor iei semnalul pentru placa cu relee.

2. Ai o problema cu contactul catre masa (este imperfect) si atunci ai comportamentul pe care l-ai descris.

Link spre comentariu

Poate ca deja stiai dar nu strica sa-ti reamintesc faptul ca de obicei placile cu relee au intrari care se activeaza pe LOW.

 

Asta este o practica buna pentru ca la pornire pinii GPIO de la Arduino sunt intrari si prin rezistentele interne de pull up se poate usor transmite un HIGH fals pe un GPIO care urmeaza sa fie iesire. Folosind activarea pe LOW pentru modulele de executie se evita comenzile false date in faza de pornire a montajului.

Editat de digix
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări