Sari la conținut
ELFORUM - Forumul electronistilor

Adaugare contact magnetic


loleksibolek

Postări Recomandate

Am mesterit o incuietoare actionata cu un servomotor si comandata de un arduino plus un RC522.Partea de soft e luata de pe site-ul d-lui Nicu Florica si de pe instructables .Problema care o am si caruia nu reusesc sa-i dau de cap e urmatoarea: acum,la citirea tag-ului rfid servomotorul trage boltul in interior(Servo1.write(0)) iar dupa temporizare il aduce in pozitia de blocare usa(Servo1write(180)).Nu reusesc sa ii adaug un contact(in sketch) pe unul din pini in asa fel incat cu contactul acela facut sa pot da comanda (servo1.write(0)) contactul sa-l desfac(adica sa deschid fizic usa) si apoi cand fac iar contactul(usa inchisa ) sa-i dea comanda (servo1.write(180)) dupa 1-2 secunde.Practic vreau un contact magnetic care sa sesizeze cand usa e inchisa si sa o incuie .

Multumesc.

 

 

#include <Wire.h>
#include "Servo.h"
int servoPin = 3;
Servo Servo1;
#include <SPI.h>
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN,RST_PIN);
int serNum[5];
int ics = 0;
const int led3= A3;
void setup(){
Serial.begin(9600);
SPI.begin();
rfid.init();
pinMode(led3, OUTPUT);
Servo1.attach(servoPin);
Servo1.write(180);
}
void loop(){
if(rfid.isCard()){
ics = ics + 1;
if(rfid.readCardSerial()){
Serial.print("secventa ");
Serial.print(ics);
Serial.print(" si cod card = ");
Serial.print(rfid.serNum[0],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[1],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[2],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[3],DEC);
Serial.print(" ");
Serial.print(rfid.serNum[4],DEC);
Serial.println("");
Serial.println("---------");
}
if ((rfid.serNum[0]==198) && (rfid.serNum[1]==166)
&& (rfid.serNum[2]==101) && (rfid.serNum[3]==84)
&& (rfid.serNum[4]==81))
{Serial.println("xxxxx");
Serial.println("---------");
digitalWrite(led3, HIGH);
Servo1.write(0);
delay(4000);
}
if ((rfid.serNum[0]==0) && (rfid.serNum[1]==146)
&& (rfid.serNum[2]==154) && (rfid.serNum[3]==124)
&& (rfid.serNum[4]==116))
{Serial.println("Acces permis");
Serial.println("---------");
digitalWrite(led3, HIGH);
Servo1.write(0);
delay(4000);
}
rfid.halt();
delay(500);
Servo1.write(180);
digitalWrite(led3, LOW);
} }
Editat de loleksibolek
Link spre comentariu
  • Răspunsuri 7
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Daca am inteles bine ce vrei codul ar trebui sa arate cam asa:

#include <Wire.h>
#include "Servo.h"
#include <SPI.h>
#include <RFID.h>

int servoPin = 3;
int contact = 4; //usa inchisa = contact inchis

Servo Servo1;
#define SS_PIN 10
#define RST_PIN 9
RFID rfid(SS_PIN, RST_PIN);

int serNum[5];
int ics = 0;
const int led3 = A3;
bool stare = true;

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.init();
  pinMode(led3, OUTPUT);
  pinMode(contact, INPUT);
  Servo1.attach(servoPin);
  Servo1.write(180);
}

void loop() {
  if (digitalRead(contact) = HIGH) {//folosim rfid doar daca este inchisa
    if (rfid.isCard()) {
      ics = ics + 1;
      if (rfid.readCardSerial()) {
        Serial.print("secventa ");
        Serial.print(ics);
        Serial.print(" si cod card = ");
        Serial.print(rfid.serNum[0], DEC);
        Serial.print(" ");
        Serial.print(rfid.serNum[1], DEC);
        Serial.print(" ");
        Serial.print(rfid.serNum[2], DEC);
        Serial.print(" ");
        Serial.print(rfid.serNum[3], DEC);
        Serial.print(" ");
        Serial.print(rfid.serNum[4], DEC);
        Serial.println("");
        Serial.println("---------");
      }
      if ((rfid.serNum[0] == 198) && (rfid.serNum[1] == 166)
          && (rfid.serNum[2] == 101) && (rfid.serNum[3] == 84)
          && (rfid.serNum[4] == 81)) {
        Serial.println("xxxxx");
        Serial.println("---------");
        digitalWrite(led3, HIGH);
        stare = false;
      }
      if ((rfid.serNum[0] == 0) && (rfid.serNum[1] == 146)
          && (rfid.serNum[2] == 154) && (rfid.serNum[3] == 124)
          && (rfid.serNum[4] == 116)) {
        Serial.println("Acces permis");
        Serial.println("---------");
        digitalWrite(led3, HIGH);
        stare = false;
      }
      rfid.halt();
      delay(500);
    }
    if (!stare) {
      Servo1.write(0);
      delay(4000);
      Servo1.write(180);
      digitalWrite(led3, LOW);
      stare = true;
    }
  }
  else {//usa deschisa
    while (1) {// se asteapta pana se inchide
      if (digitalRead(contact) == HIGH) {
        delay(2000);
        Servo1.write(180);
        stare = true;
        break;
      }
    }
    /*while(digitalRead(contact) == LOW) {
      }
      delay(2000);
      Servo1.write(180);
      stare = true;
     */
  }
}

Editat de Amaf
Link spre comentariu

Am probat, nu citeste tag-ul decat cu contactul facut si pinul 4(HIGH) dar indiferent de starea contactului se activeaza servo1.write(180) dupa cele 4 secunde.Ceea ce mie nu-mi iese nicicum(cunostintele mele de programare sunt f limitate) e ca dupa ce s-a activat servo si trece in (0) sa nu treaca in (180) decat dupa ce pinul 4 a trecut iar in (HIGH).Deci: contact facut -pinul 4 (HIGH) -servo(180)-citeste tag-ul---servo(0)-contactul se desface-pin4(LOW)--asteapta pana cand pinul 4 trece din nou (HIGH)-temporizare 2-3 sec-servo (180) si se reia ciclul cand se citeste un tag bun.

 

Multumesc.

 

L.e.

Am rezolvat,cred ca destul de empiric dar...

aici

 

  1. if (!stare) {
    Servo1.write(0);
    delay(4000);
    Servo1.write(180);
    digitalWrite(led3, LOW);
    stare = true;
    }
    
    am inlocuit pe linia 4 Servo1.Write (180) cu Servo1.write(0).Acum dupa citirea tag-ului si desfacerea contactului asteapta inchiderea contactului (contact HIGH) ,temporizeaza si da comanda Servo1.write(180) sau daca contactul nu se inchide ramane Servo1write(0).

 

 

Multumesc Amaf.

Editat de loleksibolek
Link spre comentariu
  • 4 săptămâni mai târziu...

Alta belea.Am nevoie de un servomotor ceva mai maricel comandat de un arduino,in functie de nivelul unui pin.Adica pinul are 5v,servomotorul se duce la 180 grade .Pinul trece in 0 volti,servomotorul vine la 0.Atat.Problema care o intampin e ca atunci cand servomotorul se duce la cate grade ii comand,el nu se opreste complet,ramane un fel de barait ca si cum ar incerca sa-si regleze pozitia fin.Asta e normal,servomotorul fiind costruit pt asa ceva,sa-si pastreze pozitia comandata,dar eu n-am nevoie de asta,dupa ce trece in una din cele doua pozitii vreau sa-i tai comanda.Am incercat cu detach() dar nu reusesc,m-am gandit sa comand un pin ca iesire si sa-l programez ca la orice comanda data servomotorului sa se activeze cateva secunde apoi sa se opreasca si sa comand un releu care sa-i taie comada la servo dar nici asa n-am reusit.

#include <Servo.h> 
int servoPin = 3; 
int ledPin=  4;
int comanda = 5;
int buttonState = 0;
Servo ServoT; 
void setup() { 
  pinMode(comanda,INPUT);
  pinMode(ledPin,OUTPUT);
  
  digitalWrite(ledPin,LOW);
  for(int x=0; x<2; x++)
  {
    pinMode(comanda, INPUT); 
  }  
}
void loop()
  {
   for(int x=0; x<2; x++)
  {
    buttonState = digitalRead(comanda);
  }
 
  if (buttonState  == LOW)
  { 
    ServoT.attach(servoPin);
    ServoT.write(18);

   }
if   (buttonState  == HIGH)
  {
    ServoT.attach(servoPin);
    ServoT.write(120)
   
     }

Cu codul asta merge dar servomotorul ramane alimentat ca sa-si mentina pozitia,daca ii pun comanda unul led nu trece de delay.Am incercat asa

if (buttonState == High)
{
servoT.write(18);
digitalWrite (ledPin,HIGH);
delay(1000);
digitalWrite(ledPin,LOW);
}

servomotorul se duce in 18 grade,ledul se aprinde dar ramane aprins.

Ca sa intelegeti mai bine,servomotorul roteste sfera unui robinet,n-am nevoie sa mentina pozitia,doar ca atunci cand primeste comanda sa deschida sau sa inchida robinetul iar apoi sa ,,muteasca" pana la comanda urmatoare.Multumesc.

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