1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Oscar

Beiträge von Oscar

  • RegExp Wiederholung

    • Oscar
    • 26. Februar 2017 um 13:41

    So:

    AutoIt
    $sTest = "ff hg 4f hg" ;erlaubt
    MsgBox(0, 'Test', '"' & $sTest & '"' & @CRLF & @CRLF & (StringRegExp($sTest, '(\w{3,}(\s||\z))+') ? 'nicht erlaubt' : 'erlaubt'))
    $sTest = "ff hg 4fg hg" ;nicht erlaubt
    MsgBox(0, 'Test', '"' & $sTest & '"' & @CRLF & @CRLF & (StringRegExp($sTest, '(\w{3,}(\s||\z))+') ? 'nicht erlaubt' : 'erlaubt'))
  • Wann ist AutoIt nicht mehr die richtige Wahl

    • Oscar
    • 26. Februar 2017 um 12:20

    Das lässt sich nicht so einfach beantworten.
    AutoIt ist (aufgrund der Tatsache, dass es sich um eine Interpretersprache handelt) geschwindigkeitsmäßig oftmals nicht ausreichend.
    Das macht sich aber erst bei umfangreichen Berechnungen (welcher Art auch immer) bemerkbar.
    Dafür kann man mit AutoIt sehr einfach Benutzeroberflächen erstellen und die Sprache ist leicht erlernbar.

    Ich würde sagen: Wer AutoIt mag, der wird es benutzen und wenn es geschwindigkeitsmäßig nicht reicht, dann werden die entsprechenden Funktionen eben in C++ oder Assembler geschrieben.

    Es ist also IMHO keine Frage ob "das oder das", sondern eher ein "der Teil in AutoIt und der andere Teil in C/Assembler".

  • Arduino GPS-Wetterstation

    • Oscar
    • 25. Februar 2017 um 19:45

    Ich möchte euch mal mein neuestes Projekt vorstellen.
    Das wird eine Wetterstation, die sich über ein GPS-Modul die Atom-Uhrzeit (und Datum) holt.
    Bis das GPS-Modul Empfang hat und die Uhrzeit bereitstellt, übernimmt ein DS3231-RTC-Modul die Uhrzeit-/Datumsanzeige.
    Außerdem werden diverse Wetterdaten (Luftdruck (mit Tendenz), Temperatur + Luftfeuchtigkeit (innen), Temperatur + Luftfeuchtigkeit (außen), sowie die Helligkeit (in Lux)) ausgelesen und auf dem 3.2" TFT angezeigt.
    So weit eigentlich noch nichts besonderes (bis auf das GPS-Modul). Das schaffen die meisten Wetterstationen auch.
    Meine Wetterstation speichert aber alle Wetterdaten und zwar alle 5 Minuten. Das sind pro Tag 288 Datensaetze á 12 Bytes = 3456 Bytes/Tag.
    Immer um Null Uhr werden diese 3456 Bytes auf eine SD-Card gespeichert. Die 8GB-Karte sollte dafür sehr lange ausreichen. ^^
    Und damit auch AutoIt mit im Spiel ist, werde ich noch eine Auswert-Software fuer den PC schreiben. Bisher kann ich (per AutoIt-Script) immerhin schon die (auf der SD-Karte) gespeicherten Dateien abrufen. Somit habe ich die Wetterdaten schonmal auf dem PC.
    Dieses Konzept finde ich ganz praktisch, weil ich so die SD-Karte immer im Arduino lassen kann (der Arduino speichert nebenbei weiter die Wetterdaten) und wenn ich den PC starte, kann ich die Daten der letzten Tage/Wochen abrufen.
    Hier habe ich mal den bisherigen Aufbau mit Fritzing gezeichnet:
    GPS_Wetterstation_Steckplatine_v2.png
    Ich verwende also einen Arduino Mega2560 (Basis) und einen Arduino Nano (Außensensor).
    Die serielle Verbindung zwischen den Beiden besteht momentan noch aus ein paar kurzen Kabeln. Das wird später eine RS485-Verbindung (Teile sind bestellt), weil das ein 5m Kabel werden soll.
    Funk wäre noch eine Alternative gewesen, aber dann hätte ich mir wieder Gedanken um die Spannungsversorgung des Außensensors machen müssen.
    Batterien/Akkus will ich vermeiden, weil der Außensensor beim wechseln der Batterien keine Daten senden kann.

    Im Großen und Ganzen läuft das Ganze bereits und befindet sich derzeit im Langzeit-Test.
    Erstaunlicherweise habe ich sogar mitten im Zimmer GPS-Empfang. Uhrzeit und Datum schon nach wenigen Sekunden.
    Die Position (Breiten-/Längengrad) erst nach ein paar Minuten (dafür braucht man den Empfang von 4 Satelliten). Genauer wird die Position wenn 6 oder 7 Satelliten empfangen werden.
    Dann kann ich die Koordinaten bei GoogleMaps eingeben und bekomme direkt meine Wohnungsposition angezeigt. :)

    Edit: Neues Fritzing-Bild mit der RS-485 Verbindung.

  • ListView nicht al­pha­be­tisch sondern über .data vorgegeben sortieren

    • Oscar
    • 24. Februar 2017 um 10:51

    Und was sagt uns das?
    Der Fehler liegt oftmals im geheimen (nicht geposteten) Teil des Scripts.

    Was lernen wir daraus (hoffentlich)?
    Bei Problemen sollte man das ganze Script posten.

    Aber wenn ich mir den Ausschnitt so anschaue, dann kann ich mir schon denken, warum nicht alles gepostet wurde. :/

  • if GuiCtrlRead(var) = 1 then setstate(lock/hide) else setstate(unlock/show)

    • Oscar
    • 23. Februar 2017 um 08:22
    Zitat von Friesel

    Bitte beachte, dass ich extra die Konstanten und nicht wie vorher die addierten Werte verwendet habe.
    Gerade als Anfäger können diese nichtssagenden Zahlen sehr verwirrend sein und so oder so machen Konstanten ein Script sehr viel besser lesbar...

    Es geht nicht nur darum, dass das Script besser lesbar ist, sondern auch darum, dass das Script in Zukunft lauffähig bleibt.
    Wenn die AutoIt-Entwickler (warum auch immer) den Wert einer Konstanten ändern, dann funktioniert das Script nicht mehr, wenn man den Wert eingetragen hat.
    Deshalb besser die Konstanten verwenden.

    Ok, jetzt kommt wahrscheinlich der Einwand mit der GDI+ Konstanten, wo die Konstante geändert wurde.
    Ich gebe zu, da haben sich die Entwickler wirklich nicht mit Ruhm bekleckert.

    Und noch ein Hinweis zum checken, ob der Haken bei einer Checkbox gesetzt ist:
    Verwende: BitAND(GuiCtrlRead($checkbox), $GUI_CHECKED)
    Das ist eindeutig, auch wenn der 3State-Modus benutzt wird.

  • Patcher patcht nur teilweise

    • Oscar
    • 22. Februar 2017 um 18:51

    Ich habe mir mal die Mühe gemacht und einen nicht blockierenden Downloader geschrieben (siehe unten).
    Ich verwende hier allerdings den OnEvent-Modus, weil dort die Schleifengeschwindigkeit nicht von Mausbewegungen/Tastatureingaben abhängt ,wie das im MessageLoop-Modus der Fall wäre.
    Der wesentliche Unterschied zu Deinem Script ist, dass ich die Event-Funktionen "sofort" wieder verlasse. Damit bleibt die GUI bedienbar.
    Die Downloads finden in der Endlosschleife (while true) statt und auch diese wird nicht blockiert durch weitere Schleifen, sondern es werden nur die anfallenden Daten ausgewertet.
    Ich hoffe, dass das einigermassen verständlich ist!?

    AutoIt
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <InetConstants.au3>
    
    
    Global $aDownloads[4] = ['https://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup.exe', _
    		'https://www.autoitscript.com/autoit3/files/beta/autoit/autoit-v3.3.15.0-beta-setup.exe', _
    		'https://www.autoitscript.com/cgi-bin/getfile.pl?../autoit3/scite/download/SciTE4AutoIt3.exe', _
    		'https://notepad-plus-plus.org/repository/7.x/7.3.2/npp.7.3.2.Installer.exe']
    Global $iDownloadCount = 0
    
    
    Global $iPercent = 0, $iPercentOld = 0, $iPercentAll = 0, $iPercentAllOld = 0
    Global $fStart = False, $fStop = False
    Global $hDownload = -1, $iDownloadSize
    
    
    Opt('GUIOnEventMode', 1)
    
    
    Global $hGui = GUICreate('File Downloader', 420, 250)
    GUISetOnEvent($GUI_EVENT_CLOSE, '_End')
    
    
    Global $idProgressAll = GUICtrlCreateProgress(10, 100, 400, 16)
    Global $idPercentAll = GUICtrlCreateLabel('0%', 10, 120, 400, 20, $ES_CENTER)
    GUICtrlSetFont(-1, 10, 600)
    
    
    Global $idProgress = GUICtrlCreateProgress(10, 150, 400, 16)
    Global $idPercent = GUICtrlCreateLabel('0%', 10, 170, 400, 20, $ES_CENTER)
    GUICtrlSetFont(-1, 10, 600)
    
    
    Global $idStart = GUICtrlCreateButton('Start', 10, 30, 100, 25)
    GUICtrlSetOnEvent(-1, '_StartNextDownload')
    
    
    Global $idStop = GUICtrlCreateButton('Stop', 120, 30, 100, 25)
    GUICtrlSetOnEvent(-1, '_StopDownload')
    GUICtrlSetState(-1, $GUI_DISABLE)
    
    
    Global $hStatus = _GUICtrlStatusBar_Create($hGui)
    GUISetState()
    
    
    While Sleep(10)
    	If $fStart Then ; wenn der Download gestartet wurde
    		If InetGetInfo($hDownload, $INET_DOWNLOADERROR) Then ; wenn ein Fehler aufgetreten ist
    			InetClose($hDownload) ; das Handle schliessen
    			_GUICtrlStatusBar_SetText($hStatus, 'Download Fehler')
    			$fStart = False
    		Else ; kein Fehler, also hier weiter
    			$iPercentAll = Int(100 / UBound($aDownloads) * ($iDownloadCount + 1))
    			If $iPercentAll <> $iPercentAllOld Then ; die Anzeige nur aktualisieren, wenn sich der Wert geaendert hat
    				$iPercentAllOld = $iPercentAll
    				GUICtrlSetData($idProgressAll, $iPercentAll)
    				GUICtrlSetData($idPercentAll, $iPercentAll & '%')
    			EndIf
    			$iPercent = Int(100 / $iDownloadSize * InetGetInfo($hDownload, $INET_DOWNLOADSIZE))
    			If $iPercent <> $iPercentOld Then ; die Anzeige nur aktualisieren, wenn sich der Wert geaendert hat
    				$iPercentOld = $iPercent
    				GUICtrlSetData($idProgress, $iPercent)
    				GUICtrlSetData($idPercent, $iPercent & '%')
    			EndIf
    			If $fStop Then ; wenn der Benutzer auf "Stop" geklickt hat
    				InetClose($hDownload) ; das Handle schliessen
    				_GUICtrlStatusBar_SetText($hStatus, 'Download abgebrochen')
    				$fStop = False
    				$fStart = False
    				$iDownloadCount = 0
    				GUICtrlSetState($idStart, $GUI_ENABLE)
    				GUICtrlSetState($idStop, $GUI_DISABLE)
    			Else ; nicht auf "Stop" geklickt, also hier weiter
    				If InetGetInfo($hDownload, $INET_DOWNLOADCOMPLETE) Then ; wenn der Download abgeschlossen ist
    					InetClose($hDownload) ; das Handle schliessen
    					$iDownloadCount += 1 ; den Download-Zaehler erhoehen
    					If $iDownloadCount = UBound($aDownloads) Then ; wenn das Ende erreicht ist
    						_GUICtrlStatusBar_SetText($hStatus, 'Download fertig')
    						$fStart = False
    						$iDownloadCount = 0
    						GUICtrlSetState($idStart, $GUI_ENABLE)
    						GUICtrlSetState($idStop, $GUI_DISABLE)
    					Else ; das Ende ist noch nicht erreicht, also
    						_StartNextDownload() ; den naechsten Download starten
    					EndIf
    				EndIf
    			EndIf
    		EndIf
    	EndIf
    WEnd
    
    
    Func _StartNextDownload()
    	GUICtrlSetState($idStart, $GUI_DISABLE)
    	GUICtrlSetState($idStop, $GUI_ENABLE)
    	Local $sFilename = @ScriptDir & '\' & StringRegExpReplace($aDownloads[$iDownloadCount], '.+\/(.+)', '$1')
    	ConsoleWrite('URL: "' & $aDownloads[$iDownloadCount] & '"' & @CR)
    	ConsoleWrite('Filename: "' & $sFilename & '"' & @CR)
    	$hDownload = InetGet($aDownloads[$iDownloadCount], $sFilename, $INET_FORCERELOAD, $INET_DOWNLOADBACKGROUND)
    	_GUICtrlStatusBar_SetText($hStatus, 'Download ' & $iDownloadCount & ' gestartet')
    	$iDownloadSize = InetGetSize($aDownloads[$iDownloadCount])
    	ConsoleWrite('Size: ' & $iDownloadSize & @CR)
    	$fStart = True
    EndFunc   ;==>_StartNextDownload
    
    
    Func _StopDownload()
    	$fStop = True
    EndFunc   ;==>_StopDownload
    
    
    Func _End()
    	InetClose($hDownload)
    	Exit
    EndFunc   ;==>_End
    Alles anzeigen
  • Patcher patcht nur teilweise

    • Oscar
    • 18. Februar 2017 um 10:16

    Wenn Du die Funktion "_patch" über ein GUI-Event aufrufst, dann ist GUIGetMsg so lange gesperrt (reagiert nicht auf weitere Events), wie die Funktion abgearbeitet wird.
    Das heißt, dass Du das Patch-Konzept ganz auf eine nicht blockierende Funktion abändern musst, wenn Du weiter auf die GUI-Events reagieren willst.

    Und noch ein Hinweis zu INetGet: Wenn Du den Background-Modus benutzt, bekommst Du ein Handle zurück. Dieses muss unbedingt nach dem Download mit InetClose geschlossen werden. Ansonsten liegt noch ein Lock auf der Datei.

  • Abfragen ob Tastatur benutz wird

    • Oscar
    • 2. Februar 2017 um 16:17

    Das ist mit _Timer_GetIdleTime viel einfacher abzufragen.

  • reguläre Suche - Verzeichnisnamen

    • Oscar
    • 31. Januar 2017 um 14:42

    Ich würde den Pfad aufsplitten und wieder neu zusammensetzen:

    AutoIt
    #include <Array.au3>
    #include <WinAPIShPath.au3>
    
    
    $sPath = "d:\test\01\05\01\test.txt"
    
    
    $sNewPath = _RemoveFolderNr($sPath, 3) ; das 3. Verzeichnis entfernen
    MsgBox(0, 'Test', 'Neuer Pfad: "' & $sNewPath & '"')
    
    
    Func _RemoveFolderNr($sPath, $iFolderNr)
    	Local $sFile = _WinAPI_PathStripPath($sPath) ; Dateinamen sichern
    	$sPath = _WinAPI_PathRemoveFileSpec($sPath) ; Dateinamen entfernen
    	Local $aFolder = StringSplit($sPath, '\', 2) ; Pfad aufteilen
    	If $iFolderNr > UBound($aFolder) - 1 Then $iFolderNr = UBound($aFolder) - 1
    	Local $sNewPath = ''
    	For $i = 0 To UBound($aFolder) - 1
    		If $i <> $iFolderNr Then $sNewPath &= $aFolder[$i] & '\'
    	Next
    	Return $sNewPath & $sFile
    EndFunc
    Alles anzeigen
  • Button betätigen nach Ereignissänderung

    • Oscar
    • 24. Januar 2017 um 14:13

    Ein Array-Fehler offensichtlich!
    In Zeile 48 und 49 wird auf ein drittes Array-Element ($aArray[$i][2]) zugegriffen, obwohl es nur 2 Elemente gibt. Hier wäre also nur 0 oder 1 erlaubt.

  • Warte auf Datei script #Fragenmachtspaß

    • Oscar
    • 23. Januar 2017 um 19:22

    Der Vorteil bei meinem Script ist, dass es die meiste Zeit nichts zu tun hat (Prozessorlast nahe Null).
    Erst wenn sich in dem zu überwachenden Verzeichnis etwas ändert (eine Datei neu erstellt oder geändert wird), bekommt das Script von Windows eine Meldung mit dem Pfad zu der Datei, die sich geändert hat.
    Und mit Hilfe des ScriptingDictionary überprüfe ich dann nur, ob sich genau diese Datei bereits im Listview befindet. Wenn nein, dann hinzufügen. Der große Vorteil bei dem Dictionary ist die Geschwindigkeit. Je mehr Dateien dort aufgenommen werden, umso größer ist der Geschwindigkeitsvorteil gegenüber einem Array. AutoIt braucht relativ lange, um ein umfangreiches Array nach doppelten zu durchsuchen. $oDictionary.Exists($sPath) ist dagegen sehr schnell.
    Ich sehe aber gerade, dass Du ja eigentlich nicht alle Dateien aufnehmen willst, sondern nur die mit einer bestimmten Endung.
    Aber ich denke, diese Änderung an dem Script kann ich Dir dann als Aufgabe mitgeben. :)

  • Warte auf Datei script #Fragenmachtspaß

    • Oscar
    • 23. Januar 2017 um 08:24

    Das ist alles viel zu umständlich!
    Mit "_WinAPI_ShellChangeNotifyRegister" und einem ScriptingDictionary-Objekt (um die doppelten Einträge auszufiltern) ist das Ganze viel kürzer und einfacher zu machen:

    AutoIt
    #include <Date.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WinAPI.au3>
    #include <WinAPIShellEx.au3>
    #include <WinAPIShPath.au3>
    
    
    Global Const $g_sPath = @ScriptDir & '\test\' ; <- das zu ueberwachende Verzeichnis
    
    
    OnAutoItExitRegister('OnAutoItExit')
    
    
    Global $oDictionary = ObjCreate('Scripting.Dictionary')
    $oDictionary.CompareMode = 1
    
    
    Global $iMsg = _WinAPI_RegisterWindowMessage('SHELLCHANGENOTIFY')
    
    
    Global $hGui = GUICreate('Test', 640, 480)
    Global $idListview = GUICtrlCreateListView('Datum|Datei|Pfad', 10, 10, 620, 460)
    _GUICtrlListView_SetColumnWidth($idListview, 0, 130)
    _GUICtrlListView_SetColumnWidth($idListview, 1, 230)
    _GUICtrlListView_SetColumnWidth($idListview, 2, 230)
    GUISetState()
    GUIRegisterMsg($iMsg, 'WM_SHELLCHANGENOTIFY')
    Global $g_iID = _WinAPI_ShellChangeNotifyRegister($hGui, $iMsg, $SHCNE_ALLEVENTS, BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT), $g_sPath, False)
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    Exit
    
    
    Func WM_SHELLCHANGENOTIFY($hWnd, $iMsg, $wParam, $lParam)
        #forceref $hWnd, $iMsg
        Local $sPath = _WinAPI_ShellGetPathFromIDList(DllStructGetData(DllStructCreate('dword Item1; dword Item2', $wParam), 'Item1'))
    	Switch $lParam
    		Case $SHCNE_UPDATEITEM
    			If Not $oDictionary.Exists($sPath) Then
    				$oDictionary.Add($sPath, 1)
    				GUICtrlCreateListViewItem(_NowCalc() & '|' & _WinAPI_PathStripPath($sPath) & '|' & _WinAPI_PathRemoveFileSpec($sPath), $idListview)
    			EndIf
    	EndSwitch
    EndFunc   ;==>WM_SHELLCHANGENOTIFY
    
    
    Func OnAutoItExit()
        If $g_iID Then _WinAPI_ShellChangeNotifyDeregister($g_iID)
    	$oDictionary = ''
    EndFunc
    Alles anzeigen
  • Button betätigen nach Ereignissänderung

    • Oscar
    • 22. Januar 2017 um 09:06

    Dein Script macht genau das, was "Du" da programmiert hast. Es prüft einmal die Farben und beendet sich dann.
    Wenn es mehr machen soll, brauchst Du wohl eine (Endlos-)Schleife.

  • mit AutoIt ein Relais am Arduino schalten

    • Oscar
    • 20. Januar 2017 um 14:44

    Einzeln würde ich die nicht kaufen. Da zahlst Du pro Stück 6-7 EUR.
    Im Zehnerpack gibt es die für ca. 17 EUR = https://www.amazon.de/DS18B20-Digital-Temperature-Sensor-Thermperatursensor/dp/B00BJY8S8C/ref=sr_1_2?ie=UTF8&qid=1484919314&sr=8-2&keywords=sensor+ds18b20
    Oder als wasserdichte Version für 27 EUR = https://www.amazon.de/Demiawaking-Wasserdichte-Digitale-Temperatur-Temperaturf%C3%BChler/dp/B00EQ1OSR0/ref=sr_1_6?ie=UTF8&qid=1484919314&sr=8-6&keywords=sensor%2Bds18b20&th=1


    Wenn es nicht so eilig ist (3-4 Wochen Lieferzeit), dann 17 EUR für die wasserdichte Version = https://www.amazon.de/Temperaturfuehler-Wasserdicht-Digital-Temperatur-DS18b20/dp/B01CTY43H0/ref=sr_1_80?ie=UTF8&qid=1484919521&sr=8-80&keywords=sensor+ds18b20

  • mit AutoIt ein Relais am Arduino schalten

    • Oscar
    • 20. Januar 2017 um 14:31

    Google mal nach "ds18b20"!
    Die gibt es als kleines "Transistor-Gehäuse" oder eingegossen in ein Stahlrohrgehäuse (wasserdicht).
    Eine Genauigkeit von +-0.5 Grad Celsius zum kleinen Preis. Außerdem einfach in der Ansteuerung (OneWire) und digital auslesbar.
    Ich habe hier mittlerweile ein Dutzend davon rumliegen. Zu dem Preis gibt es nichts besseres.

  • mit AutoIt ein Relais am Arduino schalten

    • Oscar
    • 20. Januar 2017 um 09:19

    Ich habe das Projekt noch etwas erweitert. Ein Luftfeuchte-Sensor (DHT22) und ein externer Temperatur-Sensor (DS18B20) werden nun vom Arduino eingelesen und an das AutoIt-Programm übergeben.

    Erforderliche Hardware:

    - ein Arduino Nano (Clone)
    - ein Relais-Modul (da befindet sich nicht nur das Relais drauf, sondern
    auch noch ein Transistor, Freilaufdiode und meist 1 oder 2 LEDs)
    - ein DHT22 Luftfeuchtesensor
    - ein DS18B20 Temperatursensor
    - zwei 4,7 kOhm Widerstände
    - ein Steckbrett
    - ein paar "Strippen"

    Hier die Fritzing-Steckplatine:
    Relaismodul_Steckplatine.png

    Das Programm für den Arduino:

    C
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <DHT.h>
    
    
    #define RelaisPin 2                  // Pin D2 fuer das Relais-Modul
    #define DHTPIN 3                     // Pin D3 fuer den Luftfeuchte-Sensor
    #define ONE_WIRE_BUS 4               // Pin D4 fuer den Temperatur-Sensor DS18B20
    #define DHTTYPE DHT22                // Luftfeuchte-Sensortyp: DHT 22 (AM2302)
    
    
    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    DHT dht(DHTPIN, DHTTYPE);
    
    
    String inputString = "";             // Einen String zum speichern der seriellen Eingabe
    boolean stringComplete = false;      // Variable zum anzeigen, dass die Eingabe beendet ist
    uint32_t sensorMillis = 0;           // Variable zum merken der letzten Messung
    const uint8_t bitRes = 12;           // Aufloesung (in Bit) des Temperatursensors
    const uint16_t sensorWait = 1000;    // Wartezeit (in ms) bis die Sensoren erneut ausgelesen werden
    int32_t DHThum = -99;                // Variable zum speichern der Luftfeuchtigkeit vom DHT
    int32_t DHTtemp = -999;              // Variable zum speichern der Temperatur vom DHT
    int32_t temp = -999;                 // Variable zum speichern der Temperatur vom DS18B20
    
    
    void setup() {
      Serial.begin(115200);                 // serielle Schnittstelle initialisieren
      sensors.setResolution(bitRes);        // die Aufloesung festlegen
      sensors.setWaitForConversion(false);  // den Sensor asynchron (nicht blockierend) abfragen
      sensors.requestTemperatures();        // Temperatur-Anfrage ausloesen
      inputString.reserve(32);              // 32 Bytes fuer den String reservieren
      digitalWrite(RelaisPin, HIGH);        // den Relais-Pin auf HIGH setzen (negative Logik HIGH = aus)
      pinMode(RelaisPin, OUTPUT);           // den Relais-Pin auf Ausgang schalten
      dht.begin();                          // den Luftfeuchte-Sensor initialisieren
      Serial.println("Ready.");             // "Ready." ueber die serielle Schnittstelle ausgeben
    }
    
    
    void loop() {
      uint32_t nowMillis = millis();
      if (nowMillis - sensorMillis >= sensorWait) { // wenn die Konvertierungszeit erreicht ist, dann...
        temp = sensors.getTempCByIndex(0) * 10;     // die aktuelle Temperatur auslesen und in ein INT umwandeln
        sensors.requestTemperatures();              // die naechste Temperatur-Anfrage ausloesen
        sensorMillis = nowMillis;                   // die Millisekunden merken
        DHThum = dht.readHumidity();
        DHTtemp = dht.readTemperature() * 10;
      }
      if (stringComplete) {                  // wenn die Eingabe komplett ist, dann...
        if (inputString.startsWith("r1")) {  // beginnt die Eingabe mit "r1", dann...
          digitalWrite(RelaisPin, LOW);      // das Relais einschalten (negative Logik HIGH = aus)
          Serial.println("r1");              // "r1" als Bestaetigung zurueckgeben
        }
        if (inputString.startsWith("r0")) {  // beginnt die Eingabe mit "r0", dann...
          digitalWrite(RelaisPin, HIGH);     // das Relais ausschalten (negative Logik HIGH = aus)
          Serial.println("r0");              // "r0" als Bestaetigung zurueckgeben
        }
        if (inputString.startsWith("t0")) {  // beginnt die Eingabe mit "t0", dann...
          Serial.println(DHTtemp);           // die Temperatur und
          Serial.println(DHThum);            // die Luftfeuchtigkeit zurueckgeben
        }
        if (inputString.startsWith("t1")) {  // beginnt die Eingabe mit "t1", dann...
          Serial.println(temp);              // die Temperatur zurueckgeben
        }
        inputString = "";                    // Eingabestring leeren
        stringComplete = false;              // "Eingabe komplett" zuruecksetzen
      }
    }
    
    
    /*
      SerialEvent occurs whenever a new data comes in the
      hardware serial RX.  This routine is run between each
      time loop() runs, so using delay inside loop can delay
      response.  Multiple bytes of data may be available.
    */
    void serialEvent() {
      while (Serial.available()) {
        // get the new byte:
        char inChar = (char)Serial.read();
        // add it to the inputString:
        inputString += inChar;
        // if the incoming character is a newline, set a flag
        // so the main loop can do something about it:
        if (inChar == '\n' || inputString.length() >= 31) {
          stringComplete = true;
        }
      }
    }
    Alles anzeigen

    und das AutoIt-Programm:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <GuiStatusBar.au3>
    #include <MsgBoxConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include 'cfx.au3'
    
    
    ; hier die Parameter für die serielle Schnittstelle eintragen
    Global Const $iComPort = 9
    Global Const $iBaudrate = 115200
    ; die folgenden Einstellungen sind die Standardeinstellungen (SERIAL_8N1) beim Arduino
    Global Const $iDataBits = 8
    Global Const $iParity = 0
    Global Const $iStopBits = 1
    
    
    Global Const $sInitResponse = 'Ready.' & @CRLF ; Meldung vom Arduino, wenn der COM-Port geoeffnet wird
    Global Const $iResponseLen = StringLen($sInitResponse) ; die Stringlaenge der Meldung
    Global Const $iTimeOut = 5000 ; innerhalb dieser Zeit muss der Arduino antworten (in Millisekunden)
    
    
    Global $hGui = GUICreate('AutoIt-Serial', 400, 120)
    GUISetBkColor(0xCCCCCC)
    GUISetFont(10, 400, 0, 'Tahoma')
    GUICtrlCreateGroup('Relais 1', 10, 10, 190, 55)
    GUICtrlSetFont(-1, 9, 400, 2, 'Arial')
    Global $idButtonOff = GUICtrlCreateButton('Aus', 30, 30, 50, 28)
    GUICtrlSetState(-1, $GUI_DISABLE)
    Global $idButtonOn = GUICtrlCreateButton('An', 90, 30, 50, 28)
    Global $idLED = GUICtrlCreateLabel('', 160, 34, 20, 20, Default, $WS_EX_CLIENTEDGE)
    GUICtrlSetBkColor(-1, 0xFF0000)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    GUICtrlCreateGroup('Temperatur / Luftfeuchtigkeit', 210, 10, 180, 55)
    GUICtrlSetFont(-1, 9, 400, 2, 'Arial')
    Global $idTempIn = GUICtrlCreateLabel('', 230, 32, 70, 20, $SS_CENTER)
    GUICtrlSetFont(-1, 14, 600, 0, 'Arial', 5)
    Global $idHumIn = GUICtrlCreateLabel('', 300, 32, 70, 20, $SS_CENTER)
    GUICtrlSetFont(-1, 14, 600, 0, 'Arial', 5)
    GUICtrlCreateGroup('', -99, -99, 1, 1)
    
    
    Global $hStatus = _GUICtrlStatusBar_Create($hGui)
    Global $aParts[2] = [210, -1]
    _GUICtrlStatusBar_SetParts($hStatus, $aParts)
    _GUICtrlStatusBar_SetMinHeight($hStatus, 24)
    GUISetState()
    Global $sReceive
     _GUICtrlStatusBar_SetText($hStatus, 'Öffne COM-Port...')
    Global $idSerialPort = _OpenCOMPort($iComPort, $iBaudrate, $iDataBits, $iParity, $iStopBits)
    If $idSerialPort = -1 Then Exit MsgBox($MB_ICONERROR, 'Fehler', 'Der COM-Port konnte nicht geöffnet werden!')
    
    
     _GUICtrlStatusBar_SetText($hStatus, 'Auf Antwort warten...')
    Global $sReceive = _ReceiveStringWait($idSerialPort, $iResponseLen, $iTimeOut)
    If $sReceive <> $sInitResponse Then
    	_CloseCOMPort($idSerialPort)
    	MsgBox($MB_ICONERROR, 'Fehler', 'Der Arduino antwortete nicht!')
    	Exit
    EndIf
    ConsoleWrite(@ScriptLineNumber & ' Antwort: ' & $sReceive)
     _GUICtrlStatusBar_SetText($hStatus, $sReceive)
    
    
    AdlibRegister('_GetTemp', 1000)
    _GetTemp()
    While True
    	Switch GUIGetMsg()
    		Case $GUI_EVENT_CLOSE
    			_CloseCOMPort($idSerialPort)
    			Exit
    		Case $idButtonOn
    			_SendSerialString($idSerialPort, 'r1' & @LF)
    			$sReceive = _ReceiveStringWait($idSerialPort, 4, $iTimeOut)
    			ConsoleWrite(@ScriptLineNumber & ' Antwort: ' & $sReceive)
    			If $sReceive = 'r1' & @CRLF Then
    				GUICtrlSetBkColor($idLED, 0x00FF00)
    				GUICtrlSetState($idButtonOn, $GUI_DISABLE)
    				GUICtrlSetState($idButtonOff, $GUI_ENABLE)
    			EndIf
    		Case $idButtonOff
    			_SendSerialString($idSerialPort, 'r0' & @LF)
    			$sReceive = _ReceiveStringWait($idSerialPort, 4, $iTimeOut)
    			ConsoleWrite(@ScriptLineNumber & ' Antwort: ' & $sReceive)
    			If $sReceive = 'r0' & @CRLF Then
    				GUICtrlSetBkColor($idLED, 0xFF0000)
    				GUICtrlSetState($idButtonOn, $GUI_ENABLE)
    				GUICtrlSetState($idButtonOff, $GUI_DISABLE)
    			EndIf
    	EndSwitch
    WEnd
    
    
    Func _GetTemp()
    	_SendSerialString($idSerialPort, 't0' & @LF)
    	$sReceive = _ReceiveStringWait($idSerialPort, 8, $iTimeOut)
    	$sReceive = StringStripWS($sReceive, 8) / 10
    	GUICtrlSetData($idTempIn, StringFormat('%.01f°C', $sReceive))
    	$sReceive = _ReceiveStringWait($idSerialPort, 8, $iTimeOut)
    	$sReceive = StringStripWS($sReceive, 8)
    	GUICtrlSetData($idHumIn, StringFormat('%02i%%', $sReceive))
    
    
    	_SendSerialString($idSerialPort, 't1' & @LF)
    	$sReceive = _ReceiveStringWait($idSerialPort, 8, $iTimeOut)
    	$sReceive = StringStripWS($sReceive, 8) / 10
    	 _GUICtrlStatusBar_SetText($hStatus, StringFormat('Außentemp.:  %.01f°C', $sReceive), 1)
    EndFunc
    Alles anzeigen

    In der Arduino-IDE müssen folgende Bibliotheken installiert sein:
    - "OneWire.h" -> meine ist von Jim Studt und co.
    - "DallasTemperature.h" -> meine ist von Miles Burton und co.
    - "DHT.h" -> meine ist von Adafruit

    Hier noch ein Screenshot vom AutoIt-Programm:

    Dateien

    AutoItSerial.zip 4,94 kB – 465 Downloads
  • mit AutoIt ein Relais am Arduino schalten

    • Oscar
    • 18. Januar 2017 um 17:22

    Hier mal ein kleines Projekt, wie man mit AutoIt ein Relais am Arduino schalten kann.

    Als erstes die erforderliche Hardware:
    - ein Arduino Nano (Clone)
    - ein Relais-Modul (da befindet sich nicht nur das Relais drauf, sondern auch noch ein Transistor, Freilaufdiode und meist 1 oder 2 LEDs)
    - ein Steckbrett
    - ein paar "Strippen"

    Hier die Fritzing-Steckplatine:
    Relaismodul_Steckplatine.png

    Das Programm für den Arduino-Nano:

    C
    #define RelaisPin 2              // Pin fuer das Relais-Modul 
    String inputString = "";         // Einen String zum speichern der seriellen Eingabe
    boolean stringComplete = false;  // Variable zum anzeigen, dass die Eingabe beendet ist
    
    
    void setup() {
      Serial.begin(115200);          // serielle Schnittstelle initialisieren
      inputString.reserve(200);      // 200 Bytes fuer den String reservieren
      digitalWrite(RelaisPin, HIGH); // den Relais-Pin auf HIGH setzen (negative Logik HIGH = aus)
      pinMode(RelaisPin, OUTPUT);    // den Relais-Pin auf Ausgang schalten
      Serial.println("Ready.");      // "Ready." ueber die serielle Schnittstelle ausgeben
    }
    
    
    void loop() {
      if (stringComplete) {                  // wenn die Eingabe komplett ist, dann...
        if (inputString.startsWith("a1")) {  // beginnt die Eingabe mit "a1", dann...
          digitalWrite(RelaisPin, LOW);      // das Relais einschalten (negative Logik HIGH = aus)
          Serial.println("a1");              // "a1" als Bestaetigung zurueckgeben
        }
        if (inputString.startsWith("a0")) {  // beginnt die Eingabe mit "a0", dann...
          digitalWrite(RelaisPin, HIGH);     // das Relais ausschalten (negative Logik HIGH = aus)
          Serial.println("a0");              // "a0" als Bestaetigung zurueckgeben
        }
        inputString = "";                    // Eingabestring leeren
        stringComplete = false;              // "Eingabe komplett" zuruecksetzen
      }
    }
    
    
    /*
      SerialEvent occurs whenever a new data comes in the
      hardware serial RX.  This routine is run between each
      time loop() runs, so using delay inside loop can delay
      response.  Multiple bytes of data may be available.
    */
    void serialEvent() {
      while (Serial.available()) {
        // get the new byte:
        char inChar = (char)Serial.read();
        // add it to the inputString:
        inputString += inChar;
        // if the incoming character is a newline, set a flag
        // so the main loop can do something about it:
        if (inChar == '\n') {
          stringComplete = true;
        }
      }
    }
    Alles anzeigen

    Und das AutoIt-Programm:

    AutoIt
    #include <MsgBoxConstants.au3>
    #include 'cfx.au3'
    ; hier die Parameter für die serielle Schnittstelle eintragen
    Global Const $iComPort = 9
    Global Const $iBaudrate = 115200
    Global Const $iDataBits = 8
    Global Const $iParity = 0
    Global Const $iStopBits = 1
    
    
    Global Const $sInitResponse = 'Ready.' & @CRLF ; Meldung vom Arduino, wenn der COM-Port geoeffnet wird
    Global Const $iResponseLen = StringLen($sInitResponse) ; die Stringlaenge der Meldung
    Global Const $iTimeOut = 5000 ; innerhalb dieser Zeit muss der Arduino antworten (in Millisekunden)
    
    
    Global $idSerialPort = _OpenCOMPort($iComPort, $iBaudrate, $iDataBits, $iParity, $iStopBits)
    If $idSerialPort = -1 Then Exit MsgBox($MB_ICONERROR, 'Fehler', 'Der COM-Port konnte nicht geöffnet werden!')
    
    
    Global $sReceive = _ReceiveStringWait($idSerialPort, $iResponseLen, $iTimeOut)
    If $sReceive <> $sInitResponse Then
    	_CloseCOMPort($idSerialPort)
    	MsgBox($MB_ICONERROR, 'Fehler', 'Der Arduino antwortete nicht!')
    	Exit
    EndIf
    ConsoleWrite(@ScriptLineNumber & ' Antwort: ' & $sReceive)
    MsgBox($MB_ICONINFORMATION,'','Relais einschalten')
    _SendSerialString($idSerialPort, "a1" & @LF)
    $sReceive = _ReceiveStringWait($idSerialPort, 4, $iTimeOut)
    ConsoleWrite(@ScriptLineNumber & ' Antwort: ' & $sReceive)
    MsgBox($MB_ICONINFORMATION,'','Relais ausschalten')
    _SendSerialString($idSerialPort, "a0" & @LF)
    $sReceive = _ReceiveStringWait($idSerialPort, 4, $iTimeOut)
    ConsoleWrite(@ScriptLineNumber & ' Antwort: ' & $sReceive)
    _CloseCOMPort($idSerialPort)
    Alles anzeigen

    Es wird noch eine UDF ("cfx.au3") benötigt, die sich, zusätzlich zu den obigen Programmen, im ZIP-Archiv befindet.
    Die Einstellungen für die serielle Schnittstelle müßt ihr u.U. noch im AutoIt-Programm anpassen. Das sollte eigentlich nur den COM-Port betreffen.
    Und schon kann man das Relais, von AutoIt aus, ein-/ausschalten.

    Dateien

    AutoItRelais.zip 3,48 kB – 438 Downloads
  • Button betätigen nach Ereignissänderung

    • Oscar
    • 18. Januar 2017 um 12:17

    Das scheinen aber auch keine Control-Elemente zu sein. Sieht mir eher nach Grafiken/Bildern aus.
    Da bleibt wohl nur PixelGetColor.

  • Ausgänge ansteuern mit AutoIt

    • Oscar
    • 18. Januar 2017 um 11:54

    Ich denke, bevor man konkrete Vorschläge machen kann, sollte der TO erstmal klar sagen, was er ganz genau machen will.
    "Eine Signallampe bei einer Bedingung am PC schalten" ist irgendwie nur sehr vage beschrieben.
    Und dann auch mal dazuschreiben, welche persönlichen Voraussetzungen vorhanden sind bzw. was erwartet wird.
    Also Hardware selbst bauen oder fertig kaufen?
    Software selbst schreiben (liegt ja eigentlich nahe, bei einem Post im AutoIt-Forum, aber man weiß ja nie) oder fertig kaufen (bzw. auf kostenlose fremde Hilfe hoffen)?

  • Ausgänge ansteuern mit AutoIt

    • Oscar
    • 17. Januar 2017 um 19:47

    Na klar! Das kommt auf die Hardware an.
    Mein Hobby (neben AutoIt) ist der Arduino-Mikrocontroller. Den kann man per USB/Seriell-Wandler programmieren und auch ansteuern.
    Ein ESP8266 ist standardmäßig WLAN fähig. Den könnte man dann auch als Webserver ansteuern.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™