Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  12 1658
Hei, prøve å lage en tilstandsmaskin, der jeg lager en motor med gir og rpm osv, (virtuelt) på arduino, lurte på om noen hadde ett visuelt oppsett (etc thinkercad) hvor knappene osv skal være å hvordan selve koden kan se ut...

S_NEUTRAL Motor er på
Andre tilstandar / knappar er ikkje i bruk.
Om gir variabel = 0, RPM minskar/ aukar til 1000.

Om gir variabel !=0,
Minsk RPM-hastigheit formel gradvis inntil motor stopper.
S_GEAR_UP Om gir variabel = 0
Clutch knapp blir trykt
Gir opp knapp blir trykt

Om gir variabel !=0
RPM > 2000
Clutch knapp blir trykt
Gir opp knapp blir trykt Aukar gir variabelen med 1.
Kan auke ifrå ein verdi på -1 opp til ein maksverdi på 6
S_GEAR_DOWN Om gir variabel = 0
Clutch knapp blir trykt
Gir ned knapp blir trykt

Om gir variabel !=0
RPM < 1500
Clutch knapp blir trykt
Gir ned knapp blir trykt Minskar gir variabelen med 1.
Kan minske ifrå ein verdi på 6 ned til ein minimalverdi på -1
S_ACCELERATION Akselerasjon knapp blir trykt /
potmeter får større verdi enn 0
(Gass pedal) Om gir variabel =0,
Auk RPM uavhengig frå RPM-hastigheit formel

Om gir variabel !=0,
Auk RPM-hastigheit formel gradvis
S_BRAKE Brems knapp blir trykt. Reduserer RPM-hastigheit formel.

Om gir variabel !=0 og RPM < 500:
bytt til S_ENGINE_STALL
S_CLUTCH Clutch knapp blir trykt. RPM verdi går mot 1000 raskt, er uavhengig av RPM-hastigheit formel
S_ENGINE_STALL Gir variabel != 0, og RPM < 500
Motoren har stoppet.
Bytt til S_ENGINE_START
S_ENGINE_STOP Motorstopp knapp blir trykt. Motoren stopper
RPM RPM-hastigheit formel blir redusert.
S_ENGINE_START Motoren er av eller har stoppa.

Om motorstart knapp blir trykt ned og gir variabel = 0.
Auk RPM verdi til 1000

Om motorstart knapp blir trykt ned, gir variabel !=0 og clutch knapp blir trykt ned.
Auk RPM-hastigheit formel til 1000



https://imma.gr/124557x07490

jeg fant ut av det vieulle, men trenger hjelp med koden, switch case hvordan få det til å fungere med det oppsette jeg har
Sist endret av ticsyboy; 27. november 2023 kl. 10:16. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Skal du simulere en motor, eller er dette en oppgave der du må bruke en tilstandsmaskin som "krav"?
skal simulere en motor :P med det oppsettet jeg har lagt ut bilde av er en motor med de her kravene:
¬¬Tilstand Handling for å bytte til Handling
S_NEUTRAL Motor er på
Andre tilstandar / knappar er ikkje i bruk.
Om gir variabel = 0, RPM minskar/ aukar til 1000.

Om gir variabel !=0,
Minsk RPM-hastigheit formel gradvis inntil motor stopper.
S_GEAR_UP Om gir variabel = 0
Clutch knapp blir trykt
Gir opp knapp blir trykt

Om gir variabel !=0
RPM > 2000
Clutch knapp blir trykt
Gir opp knapp blir trykt Aukar gir variabelen med 1.
Kan auke ifrå ein verdi på -1 opp til ein maksverdi på 6
S_GEAR_DOWN Om gir variabel = 0
Clutch knapp blir trykt
Gir ned knapp blir trykt

Om gir variabel !=0
RPM < 1500
Clutch knapp blir trykt
Gir ned knapp blir trykt Minskar gir variabelen med 1.
Kan minske ifrå ein verdi på 6 ned til ein minimalverdi på -1
S_ACCELERATION Akselerasjon knapp blir trykt /
potmeter får større verdi enn 0
(Gass pedal) Om gir variabel =0,
Auk RPM uavhengig frå RPM-hastigheit formel

Om gir variabel !=0,
Auk RPM-hastigheit formel gradvis
S_BRAKE Brems knapp blir trykt. Reduserer RPM-hastigheit formel.

Om gir variabel !=0 og RPM < 500:
bytt til S_ENGINE_STALL
S_CLUTCH Clutch knapp blir trykt. RPM verdi går mot 1000 raskt, er uavhengig av RPM-hastigheit formel
S_ENGINE_STALL Gir variabel != 0, og RPM < 500
Motoren har stoppet.
Bytt til S_ENGINE_START
S_ENGINE_STOP Motorstopp knapp blir trykt. Motoren stopper
RPM RPM-hastigheit formel blir redusert.
S_ENGINE_START Motoren er av eller har stoppa.

Om motorstart knapp blir trykt ned og gir variabel = 0.
Auk RPM verdi til 1000

Om motorstart knapp blir trykt ned, gir variabel !=0 og clutch knapp blir trykt ned.
Auk RPM-hastigheit formel til 1000
Det fremstår sånn om du ber Freak om å gjøre skoleoppgaven din. Litt frekt å bare dunke ut en komplisert oppgave uten at det ser ut sånn om du har gjort et forsøk.

Start smått. Velg ut 2 eller 3 states og få de på plass. Dropp giring for eksempel. Så ekspander med mer funksjonalitet når det fungerer.

Begynn smått sånn som vekst sier.

Del opp problemstillingen i flere mindre problemstillinger.

Det værste du kan gjøre for deg selv innen programmering er at du bruker studietiden din på at andre løser oppgavene dine. Da er du ganske fucked på din første programmeringsjobb.
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Sitat av ticsyboy Vis innlegg
skal simulere en motor :P med det oppsettet jeg har lagt ut bilde av er en motor med de her kravene:

[akkurat det samme en gang til]
Vis hele sitatet...
Ja, jeg så det første gangen...

Først: skoleoppgave eller ikke, ingen kommer til å hoste opp ferdig kode for deg, hovedinnsatsen er din. Men hvis det er en skoleoppgave er det relevant, og dessuten bare ryddig å informere om når du spør om hjelp. Både oppgaven og... nonsense-nivået i det du skal gjøre hinter til skolen. (Forøvrig en teit ting å prøve å "skjule", hvis tanken skulle streifet... )

Så: hva har du prøvd, har du noe kode eller formeninger om hvordan denne bør se ut? Hvor stopper det/hva gir deg problemer?
Sist endret av robhol; 27. november 2023 kl. 18:22.
har prøvd, kom sikkert ut litt feil, det jeg lurer på er om noen har noen fremgangsmåte å få gjort dette på?

Dette er det jeg har til nå, men jeg får ikke til at rpm skal gå stabilt oppover når jeg trykker accelerator, å får ikke til at ved hvær 2000rpm må holde clutch for å bytte til et gir opp eller ned..

får det enda ikke til: dette er det jeg har så langt..

Kode

const int S_NEUTRAL = 1;
const int S_GEAR_UP = 2;
const int S_GEAR_DOWN = 3;
const int S_ACCELERATION = 4;
const int S_BRAKE = 5;
const int S_CLUTCH = 6;
const int S_ENGINE_STALL = 7;
const int S_ENGINE_STOP = 8;
const int S_ENGINE_START = 9;
const int carMaxRev = 9000;
int currentState;
int Gear;
int Rpm;
int Velocity;
int targetRpm;  // Target RPM for gearing up

// Replace the following with the actual pin numbers or variables for your buttons and LEDs
const int neutralButtonPin = 2;
const int gearUpButtonPin = 3;
const int gearDownButtonPin = 4;
const int accelerationButtonPin = 11;
const int brakeButtonPin = 6;
const int clutchButtonPin = 7;
const int neutralLedPin = 8;
const int engineOffLedPin = 12;
const int accelerationLedPin = 13;

void setup() {
  currentState = S_NEUTRAL;
  Gear = 0;
  Velocity = 0;
  targetRpm = 2000;  // Initial target RPM

  // Setup buttons
  pinMode(neutralButtonPin, INPUT);
  pinMode(gearUpButtonPin, INPUT);
  pinMode(gearDownButtonPin, INPUT);
  pinMode(accelerationButtonPin, INPUT);
  pinMode(brakeButtonPin, INPUT);
  pinMode(clutchButtonPin, INPUT);

  // Setup LEDs
  pinMode(neutralLedPin, OUTPUT);
  pinMode(engineOffLedPin, OUTPUT);
  pinMode(accelerationLedPin, OUTPUT);

  // Start serial communication
  Serial.begin(9600);
}

float rpmToVelocityConversion(int rpm) {
  // Conversion logic here
}

void checkGear() {
  if (Gear > 5) {
    Gear = 5;
  }
  if (Gear < 0) {
    Gear = 0;
  }
}

void changeStateTo(int newState) {
  currentState = newState;
}

void updateLEDs() {
  // Control LEDs based on the current state
  digitalWrite(neutralLedPin, currentState == S_NEUTRAL);
  digitalWrite(engineOffLedPin, currentState == S_ENGINE_STOP || currentState == S_ENGINE_STALL);
  digitalWrite(accelerationLedPin, currentState == S_ACCELERATION);
}

void loop() {
  // Read inputs from buttons
  int neutralButtonState = digitalRead(neutralButtonPin);
  int gearUpButtonState = digitalRead(gearUpButtonPin);
  int gearDownButtonState = digitalRead(gearDownButtonPin);
  int accelerationButtonState = digitalRead(accelerationButtonPin);
  int brakeButtonState = digitalRead(brakeButtonPin);
  int clutchButtonState = digitalRead(clutchButtonPin);

  // Update RPM based on the current state and gear
  Rpm = rpmToVelocityConversion(analogRead(A0));  // Replace A0 with the actual RPM sensor input pin

  // Print RPM to Serial Monitor
  Serial.print("RPM: ");
  Serial.println(Rpm);

  switch (currentState) {
    case S_NEUTRAL:
      // Handle S_NEUTRAL behavior
      // For example, turn on neutral LED
      break;
    case S_GEAR_UP:
      // Handle S_GEAR_UP behavior
      if (Rpm >= targetRpm) {
        // Gearing up after reaching the target RPM
        Gear++;
        targetRpm = 2000;  // Set target RPM for the next gear change
        changeStateTo(S_NEUTRAL);
      }
      break;
    case S_GEAR_DOWN:
      // Handle S_GEAR_DOWN behavior
      break;
    case S_ACCELERATION:
      // Handle S_ACCELERATION behavior
      while (accelerationButtonState == HIGH) {
        // Increase RPM only if the acceleration button is held down
        if (Rpm < targetRpm) {
          // Increase RPM until it reaches the target RPM
          Rpm += 10; // Adjust the increment value as needed
          // Add a small delay to avoid rapid RPM increase
          delay(50);
          // Print RPM to Serial Monitor
          Serial.print("RPM: ");
          Serial.println(Rpm);
        }
        // Read inputs from buttons
        accelerationButtonState = digitalRead(accelerationButtonPin);
        clutchButtonState = digitalRead(clutchButtonPin);
        gearUpButtonState = digitalRead(gearUpButtonPin);
      }
      // Check for clutch and gear up button presses
      if (Rpm >= targetRpm && clutchButtonState == HIGH && gearUpButtonState == HIGH) {
        changeStateTo(S_GEAR_UP);
      }
      break;
    case S_BRAKE:
      // Handle S_BRAKE behavior
      break;
    case S_CLUTCH:
      // Handle S_CLUTCH behavior
      break;
    case S_ENGINE_STALL:
      // Handle S_ENGINE_STALL behavior
      break;
    case S_ENGINE_STOP:
      // Handle S_ENGINE_STOP behavior
      break;
    case S_ENGINE_START:
      // Handle S_ENGINE_START behavior
      break;
  }

  // Update common tasks or variables here

  // Update LEDs based on the current state
  updateLEDs();

  // Check for button presses and update the state accordingly
  if (neutralButtonState == HIGH) {
    changeStateTo(S_NEUTRAL);
  } else if (gearUpButtonState == HIGH) {
    changeStateTo(S_GEAR_UP);
  } else if (gearDownButtonState == HIGH) {
    changeStateTo(S_GEAR_DOWN);
  } else if (accelerationButtonState == HIGH) {
    changeStateTo(S_ACCELERATION);
  } else if (brakeButtonState == HIGH) {
    changeStateTo(S_BRAKE);
  } else if (clutchButtonState == HIGH) {
    changeStateTo(S_CLUTCH);
  }

  // Perform a delay or use non-blocking techniques based on your requirements
  delay(100);
}
Sist endret av Dyret; 28. november 2023 kl. 17:58. Grunn: La til [code]
Oppgaven din handler jo om å håndtere logikken.

Jeg kan ikke se noe særlig av det fra koden din da det virker som det du har limt inn her er bare mal- koden i oppgaven.

Ser også ut som du har samme kode 2 ganger som kommer av to sammenhengede innlegg.

Er på mobilen nå, så klarer ikke å gi noe utfyllende svar her nå.
ja er ikke noe god på dette var derfor jeg spurte om noen her kunne hjelpe, men det var ikke mange som kunne, fikk mye mer hjelp på et annet forum, her bare ble det snakket om skole oppgaver å hvor nonsense det jeg skal lage er av en grunn...
Nå har du heller ikke fulgt rådet mitt som IneartheDx også nevnte. Du har ikke brutt koden ned til noe enklere. Du har masse irrelevant pseudokode kode som kanskje skaper bugs. For eksempel så kaller du på pseudokode for RPMen din (rpmToVelocityConversion). Du printer RPMen din etter du kaller på denne pseudokoden din. Du har en checkgear funksjon som ikke kalles på i loopen din.

Det er uendelig med feil og feilkilder i koden din som gjør det sinnsykt vanskelig for noe å bare "fortelle deg hva du skal gjøre".

Jeg syntes også at caset ditt med S_ACCELERATION virker litt funky. Trenger du egentlig enda en loop her? Om du holder inne knappen så vil den ende opp i samme case uansett. Slike nested loops øker kompleksiteten til koden din. Spesielt om du leser inn nye verdier midt i loopen.

Det konkrete rådet du har fått er at du skal bryte ned problemet. Spesielt om du er ny til dette. Drit i alt som har med gir å gjøre. Lag en tilstandsmaskin med to knapper som dekker nøytral, akselerasjon og bremsing. Grunnen til at vi sier det er at da får du på plass en form for arkitektur som du kan bygge videre på steg by steg. Du skyter deg selv i foten med fremgangsmåten din. Det vil gå 5x raskere og være 5x mindre irriterende for deg om du starter smått. Om du ikke tar det rådet så kommer jeg ikke til å bruke mer av tiden min på å hjelpe deg videre.
Burde du ikke først lære Arduino ved å gjøre enklere oppgaver før du begynner på denne mega vanskelige oppgaven?
Sitat av ticsyboy Vis innlegg
ja er ikke noe god på dette var derfor jeg spurte om noen her kunne hjelpe, men det var ikke mange som kunne, fikk mye mer hjelp på et annet forum, her bare ble det snakket om skole oppgaver å hvor nonsense det jeg skal lage er av en grunn...
Vis hele sitatet...
Stackoverflow er vel det forumet man bør benytte seg av ved hjelp til programmeringsoppgaver. Derimot så tror jeg de også vil ønske at du gir litt innsats selv før de løser oppgaven for deg.

Grunnen til at jeg ikke gidder å løse den for deg, er fordi jeg var nettopp i din situasjon når jeg tok høyere utdanning. Jeg belaget meg på at de andre i gruppa gjorde innleveringene, som gjorde at jeg ble ganske fucked på eksamen.

Også måtte jeg jobbe dobbelt så hardt for å ta igjen det tapte i ettertid.
NOOOOOOOOOOOOOOOOOO-
robhol's Avatar
Sitat av ticsyboy Vis innlegg
ja er ikke noe god på dette var derfor jeg spurte om noen her kunne hjelpe, men det var ikke mange som kunne, fikk mye mer hjelp på et annet forum, her bare ble det snakket om skole oppgaver å hvor nonsense det jeg skal lage er av en grunn...
Vis hele sitatet...
Så leit! Hvis du lurer, er det fordi du viser NULL tegn til egeninnsats, og forsterker inntrykket ved å nekte å svare ordentlig på spørsmål. Det gjør at det er vanskelig å hjelpe deg på noen produktiv måte.

Hvis folk derimot har lyst til å teskjemate deg med din egen ChatGPT-kode andre steder: flott! Ikke for deg, riktignok, hvis målet var å lære noe.
Sist endret av robhol; 29. november 2023 kl. 17:53.