Auch wenn Du das Anzeigeformat änderst, so musst Du trotzdem das Datum im Format "yyyy/mm/dd" übergeben: GUICtrlSetData($date, StringFormat('%04d/%02d/%02d', @YEAR, 12, 31))
Beiträge von Oscar
-
-
Bei der Fehlermeldung würde ich mal auf: "Excel nicht installiert" tippen.
Im übrigen ist eine Automatisierung mit MouseClick höchst fehleranfällig. Besser wäre ControlClick.
-
Zu Frage 1 habe ich nicht wirklich eine Lösung. Das sieht mir nach einem Bug aus.
Zu Frage 2 musst Du $ES_NOHIDESEL als Stil benutzen, dann bleibt der Text selektiert, auch wenn das RichEdit den Focus verliert.
Zu Frage 3 gibt es WM_GETMINMAXINFO. Damit kann man die Mindest- und/oder Maximalgröße des Fensters festlegen.
Hier als Beispiel:
AutoIt
Alles anzeigen#include <MsgBoxConstants.au3> #include <GUIConstantsEx.au3> #include <GuiRichEdit.au3> #include <WindowsConstants.au3> Opt("GUIOnEventMode", 1) ; Change to OnEvent mode Local $hEditorGui = GUICreate("Mini Editor", 500, 600, -1, -1, BitOR($WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU)) GUISetOnEvent($GUI_EVENT_CLOSE, "CloseButton") Local $IDClipboardButton = GUICtrlCreateButton("In Zwischenablage kopieren", 10, 560, 160) GUICtrlSetOnEvent(-1, "ClipboardButton") Local $IDSaveButton = GUICtrlCreateButton("Speichern", 200, 560, 80) GUICtrlSetOnEvent(-1, "SaveButton") Local $IDCloseButton = GUICtrlCreateButton("Abbrechen", 320, 560, 80) GUICtrlSetOnEvent(-1, "CloseButton") Local $hRichEdit = _GUICtrlRichEdit_Create($hEditorGui, "", 10, 10, 480, 540, BitOR($ES_NOHIDESEL, $ES_MULTILINE, $ES_WANTRETURN, $WS_VSCROLL, $WS_HSCROLL)) ; fenster mit Testzeilen füllen For $x = 0 To 100 _GUICtrlRichEdit_AppendText($hRichEdit, "Zeile " & $x & ": Dies ist ein Beispieltext." & @CRLF) Next ; Cursorpos an den Textanfang _GUICtrlRichEdit_SetSel($hRichEdit, 0, 0) GUISetState(@SW_SHOW, $hEditorGui) ; Funktion um das Fenster bei Grössenänderung anzupassen GUIRegisterMsg($WM_SIZE, "WM_SIZE") ; Register the function GUIRegisterMsg($WM_GETMINMAXINFO, 'WM_GETMINMAXINFO') While 1 Sleep(100) WEnd ;------------------------------------------------------------------------------------------------------ ; ab hier Funktionen ;------------------------------------------------------------------------------------------------------ Func WM_GETMINMAXINFO($hWnd, $msg, $wParam, $lParam) Local $tMINMAXINFO = DllStructCreate('int;int;int;int;int;int;int;int;int;int', $lParam) DllStructSetData($tMINMAXINFO, 7, 320) ; min X DllStructSetData($tMINMAXINFO, 8, 280) ; min Y DllStructSetData($tMINMAXINFO, 9, 800) ; max X DllStructSetData($tMINMAXINFO, 10, 640) ; max Y Return $GUI_RUNDEFMSG EndFunc ;==>WM_GETMINMAXINFO ; Fenstergrösse ändern (für Editor Fenster) Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam) Local $iWidth = _WinAPI_LoWord($lParam) Local $iHeight = _WinAPI_HiWord($lParam) If $iWidth < 400 Then _WinAPI_MoveWindow($hRichEdit, 10, 10, $iWidth - 20, $iHeight - 120) If $iWidth < 170 Then GUICtrlSetData($IDClipboardButton, "In Zwisch...") GUICtrlSetPos($IDClipboardButton, 10, $iHeight - 100, 80) Else GUICtrlSetData($IDClipboardButton, "In Zwischenablage kopieren") GUICtrlSetPos($IDClipboardButton, 10, $iHeight - 100, 160) EndIf GUICtrlSetPos($IDSaveButton, 10, $iHeight - 70) GUICtrlSetPos($IDCloseButton, 10, $iHeight - 40) Else _WinAPI_MoveWindow($hRichEdit, 10, 10, $iWidth - 20, $iHeight - 60) GUICtrlSetPos($IDClipboardButton, 10, $iHeight - 40) GUICtrlSetPos($IDSaveButton, 200, $iHeight - 40) GUICtrlSetPos($IDCloseButton, 320, $iHeight - 40) EndIf Return 0 ;Return $GUI_RUNDEFMSG EndFunc ;==>WM_SIZE ; kompletten oder nur selektierten Text in Zwischenablage Func ClipboardButton() ; akt. Cursorpos merken ;~ Local $aPos = _GUICtrlRichEdit_GetSel($hRichEdit) ; Pos des Anzeigefensters merken Local $aScrollpos = _GUICtrlRichEdit_GetScrollPos($hRichEdit) If _GUICtrlRichEdit_IsTextSelected($hRichEdit) Then ;Text wurde selektiert und nur dieser wird kopiert ;~ _GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1]) _GUICtrlRichEdit_Copy($hRichEdit) Else ; kompletter Text soll kopiert werden _GUICtrlRichEdit_SetSel($hRichEdit, 0, -1) _GUICtrlRichEdit_Copy($hRichEdit) ; alte Cursorpos wieder herstellen ;~ _GUICtrlRichEdit_SetSel($hRichEdit, $aPos[0], $aPos[1]) EndIf ; Fensterausschnitt wieder herstellen _GUICtrlRichEdit_SetScrollPos($hRichEdit, $aScrollpos[0], $aScrollpos[1]) EndFunc ;==>ClipboardButton Func SaveButton() MsgBox($MB_OK, "INFO", "Speichern wurde gedrückt", 3, $hEditorGui) EndFunc ;==>SaveButton Func CloseButton() Exit EndFunc ;==>CloseButtonTip zum Schluß: Zum formatieren des AutoIt-Scripts kannst Du [STRG] + [t] verwenden.
-
Mir ging es ja eigentlich eher darum, wie man aus dem @GUI_WinHandle die enthaltenen Objekte in dem Fenster ermitteln kann, um dann Status, Texte, usw. abzufragen.
Falls das jemand weiß, ich wäre sehr interessiert daran (ohne dass ich vorher die Obiekt-IDs alle speichern muss).
Buttons oder generell alle Control-Elemente sind unter Windows einfach nur Child-Fenster.
Hat man das Handle vom Hauptfenster kann man sich alle "Kinder" auflisten lassen:
AutoIt
Alles anzeigen#include <Array.au3> #include <GUIConstantsEx.au3> #include <WinAPISysWin.au3> Opt('GUIOnEventMode', 1) _CreateGui() While Sleep(1000) WEnd Func _CreateGui() GUICreate('Test1234', 640, 480) GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseGui') GUICtrlCreateButton('B1', 10, 10, 60, 20) GUICtrlCreateButton('B2', 100, 10, 60, 20) GUICtrlCreateButton('B3', 200, 10, 60, 20) GUICtrlCreateButton('Show button infos', 80, 60, 120, 25) GUICtrlSetOnEvent(-1, '_ShowButtonInfo') GUISetState() EndFunc Func _CloseGui() GUIDelete(@GUI_WinHandle) Exit EndFunc Func _ShowButtonInfo() Local $ahChilds = _WinAPI_EnumChildWindows(@GUI_WinHandle) If @error Then Return Local $iCount = $ahChilds[0][0] Local $aOut[$iCount][3] For $i = 1 To $iCount $aOut[$i-1][0] = $ahChilds[$i][0] ; das Handle des Buttons $aOut[$i-1][1] = _WinAPI_GetDlgCtrlID($ahChilds[$i][0]) ; die ID des Buttons $aOut[$i-1][2] = WinGetTitle($ahChilds[$i][0]) ; der Titel des Buttons Next _ArrayDisplay($aOut, 'Output', '', 0, Default, 'Handle|ID|Title') EndFunc -
@Musashi : Ja, den Fehler kann ich nachvollziehen. Damals war das mit Dim noch ok, aber mittlerweile sollte man das ganz vermeiden.
Wer die alte Version noch benutzen will, kann das ja ändern, aber ich empfehle lieber die "neue" Version ("New_SelectFilesOrFolder.au3" im Post#1 zum download).
-
Das Problem ist, dass Du bei jedem Klick auf einen der Optionsbuttons ein neues Fenster erstellst, mit lokalen Variablen (der zweite Fehler).
Man könnte zwar rückwärts vom Ok-Button wieder das Parentfenster ermitteln und dort dann die Checkboxen, aber das ändert nichts daran, dass Du Dir ein Speicherleck schaffst, durch das ständige neu erstellen von den Fenstern.
Besser ist es die drei Optionenfenster am Anfang (global) zu erstellen und die IDs der Checkboxen in ein 2D-Array oder drei Einzelarrays speichern.
So lässt sich beim Klick auf "ok" leicht abfragen, welche Checkboxen gesetzt sind.
-
So:
AutoItGlobal $sStart = 'äääSTART' Global $sEnd = 'ENDEööö' Global $sText = StringFormat('1.Zeile cvdegf\r\nfdfhewuhvcd dsfewuf\r\n frfhee ffer äääSTART bla und blubb\r\ndies und das\r\nENDEööö djere Rest\r\n') Global $sResult = StringRegExpReplace($sText, '(?s)(.*' & $sStart & ').+(' & $sEnd & '.*)', '$1$2') ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sResult = ' & @CRLF & $sResult & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console -
"\b" und "\w" matchen nur: A-Za-z0-9.
Deswegen muss man die Zeichen schon selbst zusammenstellen, die als Ende in Frage kommen:
AutoIt#include <Array.au3> $sString = "Fahre ich in Abgrund1 Abgrund2_oder Abgrund3, Abgrund4-4; oder folge folge folgeich der Straße? Text kann Sonderzeichen enthalten" & @CRLF & "Fahre ich in Abgrund Abgrundoder Abgrund, Abgrund; oder folge folge folgeich der Straße? Text egal PRE"& @CRLF MsgBox(0,$sString,"Text") ;This works by searching for the beginning of a word (\b), then the letters "Ab", then any number of repetitions of alphanumeric ;characters (\w*), then the end of a word (\b). $aResult = StringRegExp($sString,'(Ab.+?)(?:[ ;_,-\.\?\v])',3) _ArrayDisplay($aResult,"Results 1") $aResult = StringRegExp($sString,'(Str.+?)(?:[ ;_,-\.\?\v])',3) _ArrayDisplay($aResult,"Results 2")Edit: Zur Frage 2:
-
Für externe Referenzspannungen schau mal hier: https://www.arduino.cc/reference/en/l…nalogreference/
-
Wenn der Arduino das messen könnte, kann ich die Berechnung ja dort gleich ausführen. - Kann er das?
Darauf ein ganz klares: Jein!

Im Prinzip beißt sich die Katze dabei in den eigenen Schwanz. Zur Berechnung der gemessenen (eigenen) Versorgungsspannung, muss man ja erstmal die Versorgungsspannung kennen (Referenz).
Nun kommt aber ein Trick des ATmega ins Spiel. Es gibt nämlich durchaus eine interne Referenzspannung (1.1 Volt). Kann man aktivieren mit analogReference(INTERNAL);.
Aber: Vorsicht!
Dann darf die Spannung an den analogen Anschlüssen nicht größer als die Referenzspannung werden.
Du brauchst dann also immer einen Spannungsteiler pro Eingang.
-
Die Werte sind nahezu linear (ich habe ohne Filterung gemessen, daher sind Schwankungen OK), das passt. Aber woher kommen diese Werte?
Hey, das sieht doch gut aus!

Bei analogRead bekommst Du nicht die Spannungswerte, sondern den Sample-Wert (10 Bit, also: 0...1023).
Kann man aber leicht in Spannung umrechnen: 5V geteilt durch 1024 mal dem Sample-Wert = 5 / 1024 * 333 = ca. 1.63 Volt
Um die Genauigkeit noch zu erhöhen, musst Du die Größe der Versorgungsspannung messen. Wenn die z.B. "nur" 4.7 Volt beträgt, dann damit rechnen: 4.7 / 1024 * 333 = 1.52 Volt.
-
Hier habe ich nur einen anderen Spannungsbereich: 1V Offset und linearer Output 1V/kPa - also max. 5V. Das anzupassen, wird aber nicht so schwer sein.
Ja, bis max. 5V ist kein Problem mit dem Nano. Der verträgt an seinen analogen Eingängen bis 5V oder genauer: bis zur Versorgungsspannung (was meistens das Gleiche ist).
Aufpassen musst Du nur, wenn Du die Geräte mit zwei getrennten Spannungsquellen betreibst. Also z.B. den Nano über USB und den Sensor von einem anderen 5V-Regler.
Wenn dann der USB-Anschluss nur 4.5V liefert und der Sensor aber 5V, dann wird es kritisch.
Der zweite, von Dir genannte, Sensor braucht min. 10V Versorgungsspannung. Klar, dann brauchst Du eine extra Spannungsquelle und (ganz wichtig) am Nano dann einen Spannungsteiler (2:1 oder 3:1).
Größenordnung im Zehner-Kilo-Ohm-Bereich, also 30kOhm <-> 10 kOhm. Nicht viel größere Werte nehmen, weil damit die Meßergebnisse verfälscht werden. Und nicht unter der Output-Impedanz (1,4k - 3k).
Und die Widerstände sollten mindestens 1%-Metallschicht-Widerstände sein, sonst handelst Du Dir damit einen zu großen Meßfehler ein.
Edit: Wenn Du ein Display brauchst, nimm eines von den vielen 16x2 oder 20x4 LCDs und am besten gleich mit I2C-Huckepackplatine:
https://www.amazon.de/AZDelivery-HD4…ps%2C168&sr=8-6
oder:
https://www.amazon.de/SunFounder-Ser…s%2C168&sr=8-11
Die sind relativ günstig und funktionieren einwandfrei. Allerdings muss man beim ersten Anschluss den Kontrast-Trimmer anpassen, sonst sieht man nichts.
-
Ich habe noch zig.. Platinen von verschrotteten Geräten, die einen Drucksensor haben
Wenn Du dazu auch ein Datenblatt hast, wird das wohl gehen.
Wenn Du die genaue Typenbezeichnung von den Sensoren hast, dann einfach mal mit Zusatz "Arduino" googeln. Oftmals findet sich dann bereits eine Library, die Du benutzen kannst.
-
Aber du hättest mal nen Tipp geben können wegen der Bootloadereinstellung (habs aber nach 5 min googeln dann gefunden):
Oh, stimmt! Sorry!
Die China-Clones sind alle noch mit dem alten Bootloader.
-
Ich habe schon mal einen Test gemacht (ein paar Arduino Nano habe ich hier auch rumliegen).
Auf dem Nano reichen schon ein paar Zeilen, um den analogen Port "A0" auszulesen und auf Anforderung über die Serielle Schnittstelle (USB) zu senden:
C
Alles anzeigenconst char COMMAND[] = "get"; char comBuffer[8]; void setup() { Serial.begin(115200); } void loop() { if (Serial.available()) { Serial.readBytes(comBuffer, 3); if (strncmp(comBuffer, COMMAND, 3) == 0) { uint16_t analogValue = analogRead(A0); sprintf(comBuffer, "A%i#\0", analogValue); Serial.print(comBuffer); Serial.flush(); } } }Auf der AutoIt-Seite brauchst Du meine kleine UDF ("SerialComm.au3"). Ich habe mal ein Beispielprogramm dazu geschrieben (siehe ZIP-Archive im Anhang).
So kannst Du den Arduino Nano connecten und der übermittelt dann jede Sekunde die Daten von A0. Natürlich kann man die Frequenz auch auf eine Minute setzen. Zum Testen war es aber mit einer Sekunde einfacher.
Falls Du mehr analoge Eingänge abfragen willst, sag Bescheid, dann passe ich das an.
-
Ok, wenn Du alles vom PC aus steuern willst (per AutoIt), dann würde ich einen Arduino Nano nehmen. Es würde zwar auch ein "nackter" ATmega328P oder sogar ein ATtinyx5 ausreichen, aber der Nano hat den Vorteil, dass ein USB-Seriell-Wandler bereits "on Board" ist.
Der Nano besitzt außerdem 8 analoge Eingänge. Du könntest also sogar 8 Geräte gleichzeitig anschließen. Ich packe Dir mal den PinOut vom Nano in den Anhang.
Die Echtzeituhr und den SD-Cardreader brauchst Du dann ja auch nicht. Das kann das AutoIt-Script erledigen. Die Stromversorgung des Nano erfolgt dann über das USB-Kabel, also auch kein externes Netzteil.
Somit bleibt dann nur der Arduino Nano plus eine Buchse (oder mehrere) um die Geräte anzuschließen.

Edit: Wenn ich vom "Arduino Nano" schreibe, meine ich eigentlich die China-Clones mit CH340-Chipsatz (muss man einen Treiber installieren). Die gibt es einzeln für 7€ oder im 3er Pack für 11€. Zum Beispiel: https://www.amazon.de/AZDelivery-Atm…DD78VSC1G0&th=1
-
Ok, der Ablauf ist ja einfach!
Wobei vielleicht ein Taster, zum starten/stoppen der Aufnahme, ganz hilfreich wäre. Und eine zusätzliche LED, zum anzeigen, dass die Aufnahme läuft (die interne blaue LED habe ich für die WLAN-Verbindung verplant).
Kannst Du noch ein paar Angaben zum A/D-Wandler machen?
Die 1V sind Maximum hast Du oben geschrieben. Das ist definitiv so? Ich frage, weil der "D1 mini" max. 3.3V am Analogeingang verträgt.
Und diese 1V entsprechen 20mBar (tun sie das immer oder ist das einstellbar?). Und ist die Kennlinie linear? Also 0.5V sind dann 10mBar, 0.25V gleich 5mBar usw.?
Und ist WLAN vorhanden? Und Internet?
Bei 8 Stunden und 60 Messungen/h wären das 480 Messungen insgesamt. Um die Auflösung von 10Bit zu erhalten, brauchen wir 2 Bytes pro Messung, das ergibt 960 Bytes.
Hübschen wir das auf und setzen Stunden/Minuten vor jede Messung, also nochmal 2 Bytes pro Messung, macht 1920 Bytes. Dafür bräuchte man nicht mal die SD-Karte.
Könnte man komplett im RAM speichern, bis zum Abruf.
Willst Du Dir dann die Meßergebnisse auf den Rechner holen und dort speichern?
Oder sollen die lieber auf eine SD-Karte gespeichert werden?
-
Alternativ direkt zum Einstecken in einen USB-Port am Rechner
Diese Digispark ATtiny85 sind total schrottig. Ich hatte mir mal 3 von denen bestellt.
Die wackeln dermaßen im USB-Port, dass sie ständig die Verbindung trennen. Ich musste dann schon ein Stück Pappe zusammen mit dem USB-Stecker einstecken, damit das wenigstens halbwegs fest war.
Dann lieber den ATtiny standalone. Obwohl, bei Reichelt gibt es z.Z. den ATmega328P für 1.75€. Da habe ich mich eingedeckt und schon mehrere Projekte damit erstellt.
Der ATmega328P ist mir lieber als der ATtiny85, weil er einfach von allem mehr hat. Vor allem mehr Speicher.
-
Das Thema interessiert mich doch sehr und so habe ich schonmal das "Gerüst" programmiert bzw. aus meinem schon vorhandenen Projekt rauskopiert.
WLAN-Verbidung wird hergestellt, NTP-Server nach Datum/Uhrzeit befragt, Webserver gestartet, Infoseite wird erstellt und kann per Browser (oder AutoIt) abgerufen werden.
Die Infoseite sieht dann so aus:
Screenshot_2019-11-07 Datalogger-Info.png
Der Rest hängt dann davon ab, wie lange das loggen der Daten dauert und wie das Ergebnis aussehen soll.
-
Ich habe das gerade mal mit dem Wemos getestet (habe sowieso mehrere von denen rumliegen).
Das mit der Kommunikation zwischen Wemos und AutoIt ist viel einfacher, als ich dachte. Einfach einen Webserver auf dem Wemos und von AutoIt, per InetRead, die Daten holen.
Wenn also WLAN vorhanden ist, dann brauchst Du nicht mal ein Kabel zum Rechner. Und wenn das WLAN auch noch Internet-Zugang hat, dann können wir auch noch die Echtzeituhr (RTC) einsparen.
Datum und Uhrzeit holen wir dann von einem NTP-Server.
Und damit brauchst Du nur:
- einen Wemos D1 mini (https://www.reichelt.de/d1-mini-esp826…l?&trstct=pos_0)
- und einen SD-Cardreader (https://www.reichelt.de/d1-shield-micr…?&trstct=pos_12)
4,99€ plus 1,20€ plus Versandkosten 5,95€ = 12,14€ bei Reichelt.