HM-LC-Bl1-FM externes setzen der Position

Entwicklung und Bau von Hardware aller Art, die im HM-Umfeld eingesetzt werden kann

Moderator: Co-Administratoren

Antworten
Horbi
Beiträge: 6
Registriert: 29.05.2019, 12:51

HM-LC-Bl1-FM externes setzen der Position

Beitrag von Horbi » 19.08.2019, 18:01

Hallo Zusammen,

suche mir gerade einen Wolf und komme nicht weiter. Ich würde gerne einen Rolladenaktor zur Steuerung eines Garagentorantriebs nutzen.
Der Sketch basiert derzeit ja auf einer Timersteuerung für das Öffnen und Schliessen.
Am Garagentorantrieb habe ich Endschalter, für offen als auch zu.
Zusätzlich könnte ich eine Positionsbestimmung des Tors über Drehgeber, etc bauen.
Wie kann ich im Sketch zur Laufzeit den Timer beim öffnen/schliessen übersteuern?
Ein

Code: Alles auswählen

 sdev.channel(1).updateLevel(200);
setzt mir zwar den Level sofort, aber beendet nicht den Timer.
Ich bräuchte also eine Möglichkeit direkt auf die StateMachine einzuwirken...

Viele Grüße
Horst

papa
Beiträge: 340
Registriert: 22.05.2018, 10:23
Danksagung erhalten: 7 Mal

Re: HM-LC-Bl1-FM externes setzen der Position

Beitrag von papa » 19.08.2019, 19:45

Puh - das ist so nicht vorgesehen. Du könntest versuchen mit switchState() den Timer zu stoppen. Dazu musst Du eine Methode im BlChannel machen, die dann Zugriff auf den aktuellen Status in der "state" Variablen hat.

Code: Alles auswählen

void stopTimer () {
  if( state == AS_CM_JT_RAMPON ) {
    switchState(AS_CM_JT_RAMPON,AS_CM_JT_ON,0);
  }
  if( state == AS_CM_JT_RAMPOFF ) {
    switchState(AS_CM_JT_RAMPOFF,AS_CM_JT_OFF,0);
  }
}
Musst Du mal probieren, ob das klappt.
Anfragen zur AskSin++ werden nur im Forum beantwortet

Horbi
Beiträge: 6
Registriert: 29.05.2019, 12:51

Re: HM-LC-Bl1-FM externes setzen der Position

Beitrag von Horbi » 20.08.2019, 15:56

Danke, war ein guter Hinweis. Habe es jetzt so gelöst und scheint zu funktionieren:

Code: Alles auswählen

	case KEY_OPENED_PIN:
		DPRINTLN(F("KEY_OPENED "));
		sdev.channel(1).stop();
		sdev.channel(1).updateLevel(200);
		break;
Habe aber noch ein Problem. Ich würde gerne den Stromverbrauch zum jeweiligen Level messen und speichern (damit ich merke ob irgendwas den Motor blockiert). Also ein Array mit Level in 10'er Schritten von 0 bis 200 - bräuchte dafür aber einen trigger. Jetzt habe ich in der Blind.h das gefunden - trigger scheint alle 100ms aufgerufen zu werden:

Code: Alles auswählen

class BlindStateMachine : public StateMachine<BlindPeerList> {

  class LevelUpdate : public Alarm {
    BlindStateMachine&  sm;
    uint16_t  done;
    uint16_t  fulltime;
    uint8_t   startlevel;
  public:
    LevelUpdate (BlindStateMachine& m) : Alarm(0), sm(m), done(0), fulltime(0), startlevel(0) {
      async(true);
    }
    ~LevelUpdate () {}
    void start (AlarmClock& clock,uint16_t ft) {
      startlevel = sm.status();
      fulltime = ft;
      done = 0;
      set(millis2ticks(100));
      clock.add(*this);
      sm.triggerChanged();
    }
    void stop (AlarmClock& clock) {
      clock.cancel(*this);
      if( done > fulltime ) done = fulltime;
      uint8_t dx = (done * 200UL) / fulltime;
      if( sm.state == AS_CM_JT_RAMPON ) {
        if( dx > (200-startlevel) ) dx = 200-startlevel;
        sm.updateLevel(startlevel + dx);
      }
      else if( sm.state == AS_CM_JT_RAMPOFF ) {
        if( dx > startlevel ) dx = startlevel;
        sm.updateLevel(startlevel - dx);
      }
      sm.triggerChanged();
    }
    virtual void trigger (AlarmClock& clock) {
      // add 0.1s
      ++done;
      set(millis2ticks(100));
      clock.add(*this);
    }
  };
  

Wie kann ich den virtuellen trigger in den Hauptsketch bekommen?
Und gibt es eine variable die ich dann auslesen kann um den momentanen Level angezeigt zu bekommen?

papa
Beiträge: 340
Registriert: 22.05.2018, 10:23
Danksagung erhalten: 7 Mal

Re: HM-LC-Bl1-FM externes setzen der Position

Beitrag von papa » 20.08.2019, 19:43

Hm - da kommt man nicht ran. Du kannst aber im Channel in den motorUp/Down/Stop Methoden nen eigenen Alarm starten/stoppen. Das aktuelle Level gibt es in status().
Anfragen zur AskSin++ werden nur im Forum beantwortet

Antworten

Zurück zu „Hardwareentwicklung und Selbstbau von Aktoren und Sensoren“