--[[------------------------------------------------------------------- Stand 26.2.2017 V0.61 Wenn kein Sensor gewählt (Sensor ... ) wurde, wird der Flugzustand alternativ über die die Bewegungen der Gerber SR u. QR, P1 und P3 ausgewertet. Das Filter wird dazu auf Zeitkonstante 10sec und die Schwelle auf 2% Knüppelweg gestellt. Stand 18.2.2017 V0.60 Totale effektive Flugzeit und gesamte Flugzeit (Flugstunden) des jeweiligen Modells hinzugefügt. Im Setup muss ein Telemetrie-Sensor zur Erkennung des Flugzustandes ausgewählt werden. Bestenfalls ist dies die GPS-Geschwindigkeit, z.B > 3m/s. Alternativ eine Mindesthöhe z.B. 10m vom barometrischen Höhensensor. Mittels dem Motorstrom eines Motormodells und der einzustellenden Zeitkonstante, welche die kurzen Motor-Aus-Phasen überbrückt ist auch da der Flugzustand recht zuverlässig zu bestimmen. Empfehlung für Kunstflugmodell: Schwelle halber max. Motorstrom und Zeitkonstante 10sec. Die Kontrolle der Schwelle geschieht einmal pro Minute. Die totale Flugzeit über alle Modelle wird wie die TX-Akkulaufzeit in der Datei Betrieb.jsn als neuer vierter Wert gespeichert. Die Modell-Fugzeit wird im jeweiligen Modellspeicher gespeichert. Beispiel des Dateiinhalts: [58,2957,0,129] entspricht 58 Min seit letzter TX-Ladung, 2957 Min ges. Senderlaufzeit, Reset_flag, 1129 Min totale Flugzeit alle Modelle. Stand 3.4.2017 V0.50 Akkulaufzeit-Überwachung und die totale TX-Betriebszeit Nach dem Ladevorgang des Senders auf > 97% Ladung wird die Akkulaufzeit-Überwachung beim Einschalten des Senders automatisch einmal auf Null gesetzt (Reset). Dieser Vorgang wird verriegelt bis der Akku einmal unter 97% Ladung war. Anzeige und manueller Reset unter Zusatzfunktionen "TX-Betriebszeit" Hier wird die Zeit seit dem letzten Laden bzw. Reset und die totale Betriebszeit angezeigt. Anzeige Akkulaufzeit auch über Telemetrie-Fenster "TX-Akkulaufzeit" möglich. Betriebszeiten werden in der Dateio Betrieb.jsn auf oberer Ebene der SD-Karte im TX gespeichert. Die erste Zahl ist Akkulaufzeit, die zweite die totale Betriebszeit in Minuten. Wichtig: App muss in jedem Modell zugeordnet werden --]]------------------------------------------------------------------- -- globale Variablen local B_Zeit = 0 local totBZ = 0 local totF_Zeit local modelF_Zeit =0 local ZK =1 local Val_avg = 0 local BZ_Min_str, BZ_Std_str local totBZ_Min_str, totBZ_Std_str local totFZ_Min_str, totFZ_Std_str local totFZ_Min_str, totFZ_Std_str local modelFZ_Min_str, modelFZ_Std_str local effFStd_str = "eff. Flugstunden" local lastTime local value = {} local valStr local Reset_flag = 0 local model local lastTime_ZK local G_Flag = false local componentIndexSchw, componentIndexZK local sensorLalist = {"..."} local sensorIdlist = {"..."} local sensorPalist = {"..."} -------------------------------------------------------------------------------- -- Speichert die Daten der gewählten Sensoren im Modellspeicher local function I_sensorChanged(value) Isens=value Isensid=value Isenspa=value system.pSave("Isens",Isens) system.pSave("Isensid",Isensid) system.pSave("Isenspa",Isenspa) Iid = string.format("%s", sensorIdlist[Isensid]) Iparam = string.format("%s", sensorPalist[Isenspa]) if (Iid == "...") then Iid = 0 Iparam = 0 G_Flag = true system.pSave("G_Flag", 1) ZK = 10 Schwelle = 2 else G_Flag = false system.pSave("G_Flag", 0) ZK = 1 Schwelle = 10 end system.pSave("ZK",ZK) system.pSave("Schwelle",Schwelle) form.setValue(componentIndexZK, ZK) form.setValue(componentIndexSchw, Schwelle) system.pSave("Iid", Iid) system.pSave("Iparam", Iparam) end local function onCurrChanged(value) Schwelle = value system.pSave("Schwelle",Schwelle) end local function onZKChanged(value) ZK = value system.pSave("ZK",ZK) end -------------------------------------------------------------------------------- -- Draw pages local function printForm() if(formID == 1) then local AnzBZStr = string.format("%s:%s", BZ_Std_str, BZ_Min_str) lcd.drawText(1, 3, "Betriebszeit seit", FONT_NORMAL) lcd.drawText(1, 18, "dem letzten Laden", FONT_NORMAL) lcd.drawText(100, 0, AnzBZStr, FONT_MAXI) AnzBZStr = string.format("%s:%s", totBZ_Std_str, totBZ_Min_str) lcd.drawText(1, 45, "totale Betriebszeit", FONT_NORMAL) lcd.drawText(100, 35, AnzBZStr, FONT_MAXI) AnzBZStr = string.format("%s:%s", totFZ_Std_str, totFZ_Min_str) lcd.drawText(1, 73, "totale Flugzeit", FONT_NORMAL) lcd.drawText(1, 88, "aller Modelle", FONT_NORMAL) lcd.drawText(100, 70, AnzBZStr, FONT_MAXI) AnzBZStr = string.format("%s:%s", modelFZ_Std_str, modelFZ_Min_str) lcd.drawText(1, 108, "Flugzeit von Modell:", FONT_NORMAL) lcd.drawText(1, 123, model, FONT_BOLD) lcd.drawText(100, 105, AnzBZStr, FONT_MAXI) end if(formID == 2) then if G_Flag then lcd.drawText(5, 70, "Da kein Sensor gewaehlt wurde, wird die Flugerkennung", FONT_MINI) lcd.drawText(5, 83, "ueber die Geberbewegung P1 u. P3 ausgewertet", FONT_MINI) end local Val_str = string.format("%6.1f", Val_avg) lcd.drawText(8, 115, string.format("gefilterter Sensorwert: %s", Val_str),FONT_NORMAL) if Val_avg > Schwelle then lcd.drawImage(280, 115,":timer") end end end -------------------------------------------------------------------------------- -- Draw the main form (Application interface) and Setup -- Initialize with page 1 local function initForm(subform) if(subform == 1) then form.setButton(1,"Value",HIGHLIGHTED) form.setButton(2,"Setup",ENABLED) form.setButton(4,"Reset",ENABLED) form.setFocusedRow (1) formID = 1 end if(subform == 2) then form.setButton(1,"Value",ENABLED) form.setButton(2,"Setup",HIGHLIGHTED) form.setButton(4,"Reset",ENABLED) form.addRow(2) form.addLabel({label= "Sensor z.Flugerkenn.",width=150}) componentIndexSens = form.addSelectbox(sensorLalist,Isens,true,I_sensorChanged) form.addRow(2) form.addLabel({label= "Schwellwert der Flugerkennung",width=250}) componentIndexSchw = form.addIntbox(Schwelle,0,32767,0,0,1,onCurrChanged) form.addRow(2) form.addLabel({label= "Schwellwert-Filter Zeitkonst.[s]",width=250}) componentIndexZK =form.addIntbox(ZK,1,50,0,0,1,onZKChanged) form.setFocusedRow (1) formID = 2 end end --------------------------------------------------------------------------------- -- button are pressed local function keyPressed(key) if(key==KEY_1) then form.reinit(1) end if(key==KEY_2) then form.reinit(2) end if(key==KEY_4) then B_Zeit = 0 -- Betriebszeit Reset value ={B_Zeit, totBZ, Reset_flag, totF_Zeit } local json_text = json.encode(value) -- Write back f = io.open("Betrieb.jsn","w") if(f) then io.write(f, json_text,"\n") io.close(f) end end end -------------------------------------------------------------------------------- -- Draw the telemetry window for TX-Betriebszeit local function printTelemetry_BZ() lcd.drawText(15,1,string.format("%s:%s", BZ_Std_str, BZ_Min_str),FONT_BIG) end -- Draw the telemetry window for eff Flugstunden local function printTelemetry_FZ() lcd.drawText(15,1,string.format("%s:%s", modelFZ_Std_str, modelFZ_Min_str),FONT_BIG) end --------------------------------------------------------------------------------- -- Runtime functions local function loop() -- Differenzzeit berechnen local newTime = system.getTimeCounter() local t_delta = newTime - lastTime_ZK -- in ms lastTime_ZK = newTime local TX_Data = system.getTxTelemetry() local sensor_I = system.getSensorByID(Iid, Iparam) local k2 = t_delta / 1000 / ZK -- ZK = 1 bedeutet 1s local k1 = 1 - k2 if G_Flag then local p1, p3 = system.getInputs("P1","P3") if p1 < 0 then p1 = p1 * -1 end if p3 < 0 then p3 = p3 * -1 end Val_avg = Val_avg * k1 + (p1 + p3) * 100 * k2 -- Zeitkonstante 100 * 27ms = 2,7s else if sensor_I and sensor_I.valid then -- Messewert filtern Val_avg = Val_avg * k1 + sensor_I.value * k2 -- Zeitkonstante 100 * 27ms = 2,7s end end if newTime > (lastTime + 60000) then -- nach einer Min. lastTime = newTime B_Zeit = B_Zeit +1 totBZ = totBZ +1 if Val_avg > Schwelle then totF_Zeit = totF_Zeit +1 modelF_Zeit = modelF_Zeit +1 system.pSave("Flugzeit", modelF_Zeit) end if TX_Data.txBattPercent <= 97 then Reset_flag = 0 end value ={B_Zeit, totBZ, Reset_flag, totF_Zeit} local json_text = json.encode(value) -- Write back f = io.open("Betrieb.jsn","w") if(f) then io.write(f, json_text,"\n") io.close(f) end end local Std = math.floor(B_Zeit / 60) local Min = B_Zeit - Std * 60 BZ_Std_str = string.format("%10d", Std ) BZ_Min_str = string.format("%02d", Min ) Std = math.floor(totBZ / 60) Min = totBZ - Std * 60 totBZ_Std_str = string.format("%10d", Std ) totBZ_Min_str = string.format("%02d", Min ) Std = math.floor(totF_Zeit / 60) Min = totF_Zeit - Std * 60 totFZ_Std_str = string.format("%10d", Std ) totFZ_Min_str = string.format("%02d", Min ) Std = math.floor(modelF_Zeit / 60) Min = modelF_Zeit - Std * 60 modelFZ_Std_str = string.format("%10d", Std ) modelFZ_Min_str = string.format("%02d", Min ) if( system.getTime() % 2 == 0 ) and (Val_avg > Schwelle) then effFStd_str = "eff. Flugstunden ***" else effFStd_str = "eff. Flugstunden" end system.registerTelemetry(2, effFStd_str, 1, printTelemetry_FZ) end ------------------------------------------------------------------------- -- Application initialization local function init() -- Erafsst einmal alle Sensoren welche vorhanden sind local sensors = system.getSensors() for i,sensor in ipairs(sensors) do if (sensor.label ~= "") then table.insert(sensorLalist, string.format("%s", sensor.label)) table.insert(sensorIdlist, string.format("%s", sensor.id)) table.insert(sensorPalist, string.format("%s", sensor.param)) end end -- Setup-Werte aus dem Modellspeicher laden, bzw. Default-Werte verwenden -- Default Werte sind die des Linkvaro (Pro) Höhe Isens = system.pLoad("Isens",0) Isensid = system.pLoad("Isensid",107556) Isenspa = system.pLoad("Isenspa",0) Iid = system.pLoad("Iid",107556) Iparam = system.pLoad("Iparam",5) modelF_Zeit = system.pLoad("Flugzeit",0) Schwelle = system.pLoad("Schwelle",2) ZK = system.pLoad("ZK",10) if Isens <= 1 then G_Flag = true else G_Flag = false end model = system.getProperty("Model") -- Modellname lastTime = system.getTimeCounter() lastTime_ZK = system.getTimeCounter() f = io.open("/Betrieb.jsn","r") -- Gespeicherter Wert lesen if(f) then valStr = io.read(f, 30) io.close(f) local value = json.decode(valStr) B_Zeit = value[1] totBZ = value[2] Reset_flag = value[3] totF_Zeit = value[4] else B_Zeit = 0 totBZ = 0 Reset_flag = 0 totF_Zeit = 0 end if totF_Zeit == nil then totF_Zeit = 0 end -- wegen Kompatibilität zur V0.50 local TX_Data = system.getTxTelemetry() if (TX_Data.txBattPercent > 97) and (Reset_flag == 0) then B_Zeit = 0 Reset_flag = 1 end -- TM-Fenster für Betriebsstunden definieren system.registerTelemetry(1,"TX-Akkulaufzeit", 1, printTelemetry_BZ) system.registerTelemetry(2, effFStd_str, 1, printTelemetry_FZ) system.registerForm(1,MENU_APPS,"Betriebszeit",initForm, keyPressed, printForm) end -------------------------------------------------------------------------------- return {init=init, loop=loop, author="wsTech", version="0.61", name= "Betriebszeiten"}