Hjälp med Arduino kod.

Permalänk

Hjälp med Arduino kod.

sitter och knåpar på en "anti AFK" apparat på en arduino för tröttnat på att man blir utslängd från gta online efter 1 minut så fort man ska hämta en kopp kaffe...

#include <Keyboard.h> void setup() { // put your setup code here, to run once: pinMode(2, INPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); Keyboard.begin(); } void loop() { // put your main code here, to run repeatedly: if (digitalRead(2) == HIGH) { Keyboard.press('w'); Keyboard.press('s'); delay(random(50, 100)); Keyboard.release('w'); Keyboard.release('s'); digitalWrite(9, HIGH); delay(1000); digitalWrite(9, LOW); delay(random(14000, 19000)); } while (digitalRead(2) == LOW) { digitalWrite(10, LOW); delay(1000); } while (digitalRead(2) == HIGH) { digitalWrite(10, HIGH); delay(1000); } }

använder pin 2 för att aktivera och avaktivera "anti Afk" funktionen (funkar som det ska)
pin 10 ska vara en led som visar om scriptet körs
och pin 9 är en led som blinkar en gång varje gång den skickar w+s knappen. (funkar som det ska)

får dock inte leden på pin 10 att släckas/tändas direkt när jag switchar pin 2 hög/låg utan den måste varje gång vänta på att alla timers ska ticka ut i koden för att klicka W+s med

trodde att en while funktion skulle lösa det och att den kontinuerligt skulle köra dessa i loop medans resten jobbade parralellt och uppdatera typ direkt men tydligen inte.

är inget geni direkt på arduino koden utan mest trial n error.
den funkar som den ska nu men den uppdaterar inte "aktiv" dioden när jag ändrar status på pin 2 direkt utan tar 15-20s innan den tänds/släcks.

något arduino kodgeni som har någon idé?

(ja jag har även ett liknande script i Auto it men osäker på hur kinkigt rockstarts anti cheat är för sk injections via mjukvara så inte vågat testa det där av att jag tänkte att en "hårdvarubot" som detekteras som ett tangentbord borde teoretiskt inte gå att identifiera sålänge de inte förbjuder användning av tangentbord...)

har arduinon på breadboard för till fället i prototyp stadiet och kopplingen ser ut såhär. (notera är osäker på mitt handklottrade schema om symbolerna för led är rätt eller vända åt rätt håll men skit samma de sitter rätt i verkligheten för de tänds iaf.)

EDIT: ser nu att symbolerna är defentivt fel men ni förstår nog vad jag menar på bilden.

Visa signatur

ASUS B550-f-Gaming, R9 5800X3D, HyperX 3200Mhz cl16 128Gb ram, rtx 3070ti.
[Lista] De bästa gratisprogrammen för Windows
[Diskussion] De bästa gratisprogrammen för Windows

Permalänk
Medlem

Din kod är blockerande. Räkna samman alla delays du har i koden så ser du säkert ett samband med tiden det tar innan LEDen reagerar. Använd funktionen millis() istället för delays

Arduinons ingångar har extremt hög impedans, och är därmed väldigt känslig för inducerad spänning i kretsarna som är kopplade till dem. Du kan eventuellt vilja kika på att köra ingång 2 i INPUT_PULLUP mode, och ha ingången att aktiveras när den dras låg istället. Robustare så, du slipper oavsiktliga aktiveringar pga induktion. Utöver det sparar du en resistor.

Visa signatur

Nu lurade jag dig att slösa bort ett par värdefulla sekunder av ditt liv på att läsa denna fullständigt poänglösa signatur!

Permalänk
Medlem

Arduino kör vanlig C++ och de vanliga Atmega32u4 och liknande har endast en kärna och enda sättet att köra saker "parallellt" är att ha kod som inte blockerar så som delay(). Det du letar efter är millis() som ger dig hur länge din arduino varit igång i millisekunder, som en unsigned long(16-bit). Du kan sedan spara det och läsa millis() tills en viss tid har passerat.

Ser också på kopplingen att du vill nog köra INPUT_PULLUP på pin 2 som kommer tvinga den positiv(5v), så att du kan jorda som du gjort men utan motståndet. Sen tänk på att när du jordar pin 2 med din knapp så kommer den läsa LOW vid knapptryck och HIGH utan knapptryck.

Permalänk
Skrivet av kaput:

Din kod är blockerande. Räkna samman alla delays du har i koden så ser du säkert ett samband med tiden det tar innan LEDen reagerar. Använd funktionen millis() istället för delays

jo ja satt å läste om millis men de va rena grekiskan... tänkte om de gick att göra med delay då den iaf i mina ögon är mer självförklarande.

hitta ingen bra guide som förklarade hur funktionen fungerade utan bara radade upp exempel med typ 50 rader men utan att förklara vad varje rad gjorde...

är typ mitt 2a program jag kodar i arduinons programspråk så är helt grön och typ 99% trial n error samt google i den mån det går.

personligen tyckte jag att while kod borde körts parralellt med allt annat som de programspråk jag är van vid men uppenbarligen inte...

Skrivet av swesen:

Arduino kör vanlig C++ och de vanliga Atmega32u4 och liknande har endast en kärna och enda sättet att köra saker "parallellt" är att ha kod som inte blockerar så som delay(). Det du letar efter är millis() som ger dig hur länge din arduino varit igång i millisekunder, som en unsigned long(16-bit). Du kan sedan spara det och läsa millis() tills en viss tid har passerat.

har typ ingen erfarenhet (eller utbildning )av C++ kod alls ren gissning trial n error av vad som verkar kunna fungera baserat på andra programspråk jag har mer erfarenhet av...

Skrivet av swesen:

Ser också på kopplingen att du vill nog köra INPUT_PULLUP på pin 2 som kommer tvinga den positiv(5v), så att du kan jorda som du gjort men utan motståndet. Sen tänk på att när du jordar pin 2 med din knapp så kommer den läsa LOW vid knapptryck och HIGH utan knapptryck.

sitter en växlande brytare där så den är antingen på konstant eller av konstant beroende på hur den ställs.

jo läste om "pullup" funktionen men att det ändå var rekommenderat att köra fysisk resistor på pinnen som säkerhet så struntade i det och bara satte på en 1m resistor som ändå redan satt kvar på brädan sen ett tidigare projekt.

Visa signatur

ASUS B550-f-Gaming, R9 5800X3D, HyperX 3200Mhz cl16 128Gb ram, rtx 3070ti.
[Lista] De bästa gratisprogrammen för Windows
[Diskussion] De bästa gratisprogrammen för Windows

Permalänk
Medlem
Skrivet av Rouge of Darkness:

jo ja satt å läste om millis men de va rena grekiskan... tänkte om de gick att göra med delay då den iaf i mina ögon är mer självförklarande.

hitta ingen bra guide som förklarade hur funktionen fungerade utan bara radade upp exempel med typ 50 rader men utan att förklara vad varje rad gjorde...

är typ mitt 2a program jag kodar i arduinons programspråk så är helt grön och typ 99% trial n error samt google i den mån det går.

personligen tyckte jag att while kod borde körts parralellt med allt annat som de programspråk jag är van vid men uppenbarligen inte...

Utan att ha kollat något på vad arduino kör, så är tanken att du inte blockerar ö.h.t. i loop().
Det du vill använda är en variabel som du använder som en räknare. Räknaren ökar du med millis för varje varv.
millis() använder millisekunder (duh) sen programmet kördes igång. Kolla om du nått upp i så många millisekunder du vill "vänta" innan du utför ditt kommando, resetta sedan din räknare.

float variabel = 0f; float cooldown = 7000f; loop(){ variabel += millis(); if (variabel <= cooldown){ variabel = 0f; // Utför kommandot } }

Typ något sådant. Om millis() är en tidstämpel så blir det lite annorlunda.

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Medlem

If-satsen kommer aldrig triggas (möjligen första gången) samma condition använda för att avbryta den sista while-loopen

Permalänk
Medlem
Skrivet av Rouge of Darkness:

jo ja satt å läste om millis men de va rena grekiskan... tänkte om de gick att göra med delay då den iaf i mina ögon är mer självförklarande.

hitta ingen bra guide som förklarade hur funktionen fungerade utan bara radade upp exempel men utan att förklara vad div rader gjorde...

är typ mitt 2a program jag kodar i arduinons programspråk så är helt grön och typ 99% trial n error samt google i den mån det går.

Jo, det är förstås lite mer invecklat, men du kommer inte komma undan millis() om du tänkt hålla på med Arduino. Detta är ju inget jättekomplicerat projekt, men du är redan där. Det är typ bara att bita ihop och ta den berömda tjuren vid hornen

Till din tröst kan jag iaf säga att det egentligen inte är särskilt komplicerat, bara helvetiskt jobbigt att beskriva på ett pedagogiskt sätt med annat än exempel. När du väl fattat det kommer det kännas naturligt att använda.

Visa signatur

Nu lurade jag dig att slösa bort ett par värdefulla sekunder av ditt liv på att läsa denna fullständigt poänglösa signatur!

Permalänk
Medlem

@Pamudas Det där kommer tyvärr inte funka så bra.

Det du menar är något i stil med

unsigned long delayMS = 1000; unsigned long lastMillis = 0; loop() { unsigned long currentMillis = millis(); if (currentMillis >= lastMillis + delayMS) { // perform delayed command lastMillis = currentMillis; } }

Skrivet av Rouge of Darkness:

sitter en växlande brytare där så den är antingen på konstant eller av konstant beroende på hur den ställs.

jo läste om "pullup" funktionen men att det ändå var rekommenderat att köra fysisk resistor på pinnen som säkerhet så struntade i det och bara satte på en 1m resistor som ändå redan satt kvar på brädan sen ett tidigare projekt.

Problemet är att det bildar en spänningsdelare (voltage divider) och den inbyggda har ett motstånd på 20-50kOhm.

Permalänk
Medlem
Skrivet av swesen:

@Pamudas Det där kommer tyvärr inte funka så bra.

Det du menar är något i stil med

unsigned long delayMS = 1000; unsigned long lastMillis = 0; loop() { unsigned long currentMillis = millis(); if (currentMillis >= lastMillis + delayMS) { // perform delayed command lastMillis = currentMillis; } }

Problemet är att det bildar en spänningsdelare (voltage divider) och den inbyggda har ett motstånd på 20-50kOhm.

Såklart, det blir ju en tidstämpel-ish ändå

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk

aja får väl sätta mig ner å djupdyka vad de olika raderna i det ni skriver gör...

för blir inte klok av era exempel vad raderna gör...

mer än Pamudas inlägg att
variabel += millis();

if (variabel <= cooldown){

jämför variabel+millis() och är den mindre än 7000 så går den vidare och sätter variable till 0.

Visa signatur

ASUS B550-f-Gaming, R9 5800X3D, HyperX 3200Mhz cl16 128Gb ram, rtx 3070ti.
[Lista] De bästa gratisprogrammen för Windows
[Diskussion] De bästa gratisprogrammen för Windows

Permalänk
Medlem
Skrivet av Rouge of Darkness:

aja får väl sätta mig ner å djupdyka vad de olika raderna i det ni skriver gör...

för blir inte klok av era exempel vad raderna gör...

mer än Pamudas inlägg att
variabel += millis();

if (variabel <= cooldown){

jämför variabel+millis() och är den mindre än 7000 så går den vidare och sätter variable till 0.

unsigned long delayMS = 1000; // din önskade fördröjning unsigned long lastMillis = 0; // variabel för att spara tiden den senaste gången koden i if satsen kördes loop() { unsigned long currentMillis = millis(); // sparar millis resultat // kolla om nuvarande tid är mer eller lika med senaste tiden + fördröjningen if (currentMillis >= lastMillis + delayMS) { // kör det du vill göra här // spara senaste tiden du körde koden i if satsen lastMillis = currentMillis; } }

Vad kan du för andra språk? Är intresserad vilket språk som använder while för parallell programmering.

Permalänk
Skrivet av swesen:

unsigned long delayMS = 1000; // din önskade fördröjning unsigned long lastMillis = 0; // variabel för att spara tiden den senaste gången koden i if satsen kördes loop() { unsigned long currentMillis = millis(); // sparar millis resultat // kolla om nuvarande tid är mer eller lika med senaste tiden + fördröjningen if (currentMillis >= lastMillis + delayMS) { // kör det du vill göra här // spara senaste tiden du körde koden i if satsen lastMillis = currentMillis; } }

Vad kan du för andra språk? Är intresserad vilket språk som använder while för parallell programmering.

Kan? inga...
har bara försökt lära mig grunderna mha trial n error och ingen minns en fegis typ.

men har försökt mig på en jäkla massa olika från 70-80tal å frammåt typ men skulle inte säga att jag behärskar någon utan majoriteten av tiden sitter jag mest med instruktionsboken och google.

tror ja börja med att leka runt i typ basic 7 nån gång i början på 90talet på våran commondor 128 å har sen testat på lite allt möjligt frammåt till nu.

att while kan parralellkoppla funktioner tror jag var till någon gammal robotprogrammeringsmjukvara i DOS vi använde på gymnasiet men minns inte vad programmet hette eller om det var nån gammal 80-90tal muzubichi plc Dos kodningsmjukvara som man kunde använda while för parralellfunktioner

jag är inte rädd för att göra ett försök även om ja inte har någon aning om vad jag egentligen gör...

nu för tiden använder jag mest på med ABB´s robotsystem typ inget annat så inte omöjligt att de e nån av de äldre modellerna typ S3 eller S4 som while kan användas ABB har ett relativt förenklat programmeringsspråk där många funktioner kommer som fördiga paket med funktioner så man behöver inte skriva allt från grunden varje gång.

har normalt inte tiden att sitta men har semester nu så hade lite dötid i morse typ därför jag gav mig på detta miniprojekt.

får se ja kanske skippar av och på funktionen genom mjukvaran helt och bruteforcar det med en strömbrytare på 5V stiftet i usbkontakten man behöver inte uppfinna hjulet 2 ggr liksom och ger samma resultat som att göra det med kod.

Visa signatur

ASUS B550-f-Gaming, R9 5800X3D, HyperX 3200Mhz cl16 128Gb ram, rtx 3070ti.
[Lista] De bästa gratisprogrammen för Windows
[Diskussion] De bästa gratisprogrammen för Windows

Permalänk
Medlem
Skrivet av Rouge of Darkness:

Kan? inga...
har bara försökt lära mig grunderna mha trial n error och ingen minns en fegis typ.

men har försökt mig på en jäkla massa olika från 70-80tal å frammåt typ men skulle inte säga att jag behärskar någon utan majoriteten av tiden sitter jag mest med instruktionsboken och google.

tror ja börja med att leka runt i typ basic 7 nån gång i början på 90talet på våran commondor 128 å har sen testat på lite allt möjligt frammåt till nu.

att while kan parralellkoppla funktioner tror jag var till någon gammal robotprogrammeringsmjukvara i DOS vi använde på gymnasiet men minns inte vad programmet hette eller om det var nån gammal 80-90tal muzubichi plc Dos kodningsmjukvara som man kunde använda while för parralellfunktioner

jag är inte rädd för att göra ett försök även om ja inte har någon aning om vad jag egentligen gör...

nu för tiden använder jag mest på med ABB´s robotsystem typ inget annat så inte omöjligt att de e nån av de äldre modellerna typ S3 eller S4 som while kan användas ABB har ett relativt förenklat programmeringsspråk där många funktioner kommer som fördiga paket med funktioner så man behöver inte skriva allt från grunden varje gång.

har normalt inte tiden att sitta men har semester nu så hade lite dötid i morse typ därför jag gav mig på detta miniprojekt.

får se ja kanske skippar av och på funktionen genom mjukvaran helt och bruteforcar det med en strömbrytare på 5V stiftet i usbkontakten man behöver inte uppfinna hjulet 2 ggr liksom och ger samma resultat som att göra det med kod.

Intressant, nästan alla språk jag lärt mig är på något sätt grundat i C (C++, C#, Python, JavaScript) och där betyder while att koden inom klamrarna körs om och om igen så länge det som står i parantesen är sant.

Jag har själv gått ifrån hobbynivå till att jobba som mjukvaruingengör på ganska kort tid, så förstår absolut att det inte alltid går att förstå vad som står i dokumentation och exempel i början.

Arduinos egna dokumentation tycker jag man förstod sig på ganska tidigt, till skillnad från Microsofts C# som kräver mycket förståelse först.