• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
zabezpieczenie przeciążeniowe dla silnika rolety
#1
Witam forumowiczów.
W ramach mojego małego projektu ynteligentnego domu chciałem sprawdzić czy jest możliwość napisania kodu na arduino, który działałby jako detekcja przeszkody. Silnik rolety podłączony jest do dwóch przekaźników oraz do dwóch czujników acs712. Wydaje mi się, że detekcja w roletach, które posiadają tą funkcję jako wbudowaną to nic innego jak nastawiona graniczna wartość prądu po przekroczeniu, której silnik wyłącza się lub wykonuje określony krótki ruch w przeciwną stronę a następnie zatrzymuje się.
Poniże zamieszczam kod i mam kilka pytań:
1. Dlaczego po przekroczeniu zadanej wartości silnik wyłącza się całkowicie a nie wykonuje sekwencji wyłącz kierunek-->włącz przeciwny kierunek na 3 sekundy -->wyłącz się całkowice ?
2. Dlaczego serial monitor wyrzuca mi tylko wartości prądu dla opuszczania a dla podnoszenia już nie ?
3. Dlaczego czasami program wypluwa do serial.print nan - not a number zamiast liczby ?
4. Czy można zrobić taki zapis aby wartość "amperów" wyświetlała się tylko wtedy gdy np. jest włączony RELAY_1 ?

Kod:
#define MY_DEBUG
#define MY_GATEWAY_SERIAL
#define MY_REPEATER_FEATURE

#include <SPI.h>
#include <MySensors.h>
#include <Bounce2.h>

//--------------Roleta w kuchni duże okno-------------------------
#define ROLETA_1_CHILD 1
#define BUTTON_PIN A3
#define BUTTON_PIN2 A4
#define RELAY_1  2
#define RELAY_2  3
#define acs712_RELAY_1 A0 //pin analogowy do którego podłączony jest ascs712 dla kierunku góra
#define acs712_RELAY_2 A1 //pin analogowy do którego podłączony jest ascs712 dla kierunku dół
//----------------------------------------------------------------
#define RELAY_ON 0  
#define RELAY_OFF 1

//----------------------------------------------------------------
long ostania_probka = 0;
long ostania_probka_RELAY_2 = 0;
long suma_probek = 0;
long suma_probek_RELAY_2 = 0;
int licznik_probek = 0;
int licznik_probek_RELAY_2 = 0;
float vpc = 4.8828125;          //rozdzielczość to 5V/1024 * 1000
int napiecie_w_gniazdku = 220;  //napięcie jakie jest w gniazdku sieciowym
int typ_acs712 = 185;           // dla acs712 5A wartość = 185
int kalibracja_acs712 = 512;    //ustwiamy wartość przy której wskazania na serial monitor z czujnika acs712 będą wynosiły 0 bez uruchomionej rolety
int kalibracja_acs712_RELAY_2 = 512;
float nastaw_detekcji_roleta_w_kuchni_duze_okno_opuszczanie = 0.35;  //ustawiamy wartość Amperów przy której zadziała zabezpieczenie
float nastaw_detekcji_roleta_w_kuchni_duze_okno_podnoszenie = 0.55;
// Inicjalizacja obiektu Bounce
Bounce debouncer = Bounce();
Bounce debouncer2 = Bounce();

void before() {

 pinMode(RELAY_1, OUTPUT);
 pinMode(RELAY_2, OUTPUT);
 digitalWrite(RELAY_1,HIGH);
 digitalWrite(RELAY_2,HIGH);

}

void setup() {

// Konfiguracja pinu przycisku i aktywowanie rezystora podciągającego:
 pinMode(BUTTON_PIN,INPUT_PULLUP);
 pinMode(BUTTON_PIN2,INPUT_PULLUP);

 
// Po konfiguracji przycisku, ustawienie działania funkcji Bounce :
 debouncer.attach(BUTTON_PIN);
 debouncer.interval(5);
 debouncer2.attach(BUTTON_PIN2);
 debouncer2.interval(5);  
 
}


void presentation()
{
 sendSketchInfo("Rolety parter", "1.0");
 
present(ROLETA_1_CHILD, S_COVER);

}

MyMessage msg(ROLETA_1_CHILD, S_COVER);
MyMessage msg2(ROLETA_1_CHILD, S_COVER);


void loop() {

//--------------Roleta w kuchni duże okno-------------------------

 if (debouncer.update()) {
   int value = debouncer.read();
   if(value == LOW){
        saveState(1, !loadState(1));
        digitalWrite(RELAY_1, loadState(1)?RELAY_ON:RELAY_OFF);
        digitalWrite(RELAY_2, HIGH);
        send(msg.set(loadState(1)));
        }
 }
 

if(millis() > ostania_probka + 1) {
suma_probek += sq(analogRead(acs712_RELAY_1) - kalibracja_acs712);
licznik_probek++;
ostania_probka=millis();
}

if(licznik_probek==1000) {
float value1 = sqrt(suma_probek/licznik_probek);
float mv = value1 * vpc;
suma_probek = 0;
licznik_probek = 0;

Serial.print("obciążenie rolety dużego okna w kuchni - opuszczanie = ");
Serial.println(mv/typ_acs712);

if ((mv/typ_acs712) > nastaw_detekcji_roleta_w_kuchni_duze_okno_opuszczanie) {
digitalWrite(RELAY_1,HIGH);
delay(300);
digitalWrite(RELAY_2,LOW);
delay(3000);
digitalWrite(RELAY_2,HIGH);
}
}


 if (debouncer2.update()) {
     int value2 = debouncer2.read();
   if(value2 == LOW){
        saveState(2, !loadState(2));
        digitalWrite(RELAY_2, loadState(2)?RELAY_ON:RELAY_OFF);
        digitalWrite(RELAY_1, HIGH);
        send(msg2.set(loadState(2)));
        }
 }
if(millis() > ostania_probka + 1) {
suma_probek_RELAY_2 += sq(analogRead(acs712_RELAY_2) - kalibracja_acs712_RELAY_2);
licznik_probek_RELAY_2++;
ostania_probka_RELAY_2=millis();
}
if(licznik_probek_RELAY_2==1000) {
float value2 = sqrt(suma_probek_RELAY_2/licznik_probek_RELAY_2);
float mv_RELAY_2 = value2 * vpc;
suma_probek_RELAY_2 = 0;
licznik_probek_RELAY_2 = 0;

Serial.print("obciążenie rolety dużego okna w kuchni - podnoszenie = ");
Serial.println(mv_RELAY_2/typ_acs712);

if((mv_RELAY_2/typ_acs712) > nastaw_detekcji_roleta_w_kuchni_duze_okno_podnoszenie) {
digitalWrite(RELAY_2,HIGH);
delay(300);
digitalWrite(RELAY_1,LOW);
delay(3000);
digitalWrite(RELAY_1,HIGH);
 }
}
}


void receive(const MyMessage &message) {
 
//--------------Roleta w kuchni duże okno-------------------------
 {
 if (message.sensor == ROLETA_1_CHILD){
    if (message.type == V_UP) {
   digitalWrite(RELAY_1, HIGH);
   digitalWrite(RELAY_2, LOW);
 }
 }
 if (message.sensor == ROLETA_1_CHILD){
 if (message.type == V_STOP ) {
   digitalWrite(RELAY_1, HIGH);
   digitalWrite(RELAY_2, HIGH);
 }
 }
 if (message.sensor == ROLETA_1_CHILD){
 if (message.type == V_DOWN) {
   digitalWrite(RELAY_2, HIGH);
   digitalWrite(RELAY_1, LOW);
 }
 }

}
}
 
Odpowiedź
#2
Witam
Sprawdź linię kodu nr 94 i 125.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(01-05-2018, 03:49)kaczakat napisał(a): Witam
Sprawdź linię kodu nr 94 i 125.

Masz rację tutaj był błąd. Teraz wyświetla obciążęnie przy opuszczaniu i podnoszeniu.

Nadal nie mogę rozgryźć tego miejsca :

if ((mv/typ_acs712) > 0.35) {
digitalWrite(RELAY_1,HIGH);
delay(300);
digitalWrite(RELAY_2,LOW);
delay(3000);
digitalWrite(RELAY_2,HIGH);
}

silnik wyłącza się tj. RELAY_1, HIGH i na tym koniec :/
 
Odpowiedź
#4
Dodaj sobie w tych miejscach, których nie jesteś pewien czy się wykonują, Serial.println("Zrobilo się realy1 HIGH") itd., bo nie ma powodu by to się nie wykonało.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości