Permalänk
Medlem

Kod till arduino

Hej!

Jag hoppas jag skriver i rätt forum-del nu annars får mod gärna flytta den.
Jag jobbar med ett teknikarbete i skolan där jag gör en modell av en trafikljus korsning. Problemet är då att jag är ny med kodning och kan inte lyckas få det att funka som jag vill...

På bilden ser ni hur korsningen ser ut, dom röda markeringarna är övergångsställen man ser också hur ljusen ska vara på (grön, röd). Min tanke är att precis som på en vanlig korsning ska lamporna byta färg (grön-gul-röd och tvärt om) med en delay på kanske 30-60sek men också byta till motsatt färg efter ~10sek från att man trycker på knappen som finns vid varje övergångsställ.

Jag behöver då hjälp med en kod som funkar till min Arduino UNO som gör detta, om det nu finns någon snäll själ därute som skulle kunna hjälpa mig!
Jag hoppas ni förstod min mindre bra beskrivning, men fråga gärna om ni undrar något.

Hälsningar Hekeb

Visa signatur

Phenom II X6 1090T 3.8 GHz | Gigabyte GTX580 3GB | HAF 922 | ASUS P8P67 Pro | 16GB DDR3 1600 MHz | XFX 650W | A-DATA SSD 511-Series 60GB

Permalänk
Medlem

Hur långt har du kommit än så länge? Var exakt stöter du på problem? Har du hårdvaran klar med kopplingar från din Arduino till trafikljusen? Är det koden för kommunikation med hårdvaran, eller den övergripande logiken som är svårt?

Permalänk
Medlem

Jag antar att du redan börjat med att bryta ner problemet i mindre delar.
Du kommer ju inte stöta på problemet att alla signaler visar olika, några av signalerna kommer ju faktiskt alltid att visa samma sak som någon annan signal.

För mig så känns den här uppgiften ganska lämpad för en tillståndsmaskin.
Om du listar alla möjliga tillstånd och till varje tillstånd knyter du information om
1) vilka signaler lyser grönt
2) vilka signaler lyser rött
3) vilket tillstånd ska vi gå vidare till om tiden löper ut (30-60 sek)
4) vilket tillstånd ska vi gå vidare till om någon trycker på övergångsställe 1
5) vilket tillstånd ska vi gå vidare till om någon trycker på övergångsställe 2
6) vilket tillstånd ska vi gå vidare till om någon trycker på övergångsställe 3
7) vilket tillstånd ska vi gå vidare till om någon trycker på övergångsställe 4

enum states { STATE_1, STATE_2, STATE_3, ..., MAX_STATES } current_state; enum events { TIME_OUT, BUTTON_0, BUTTON_1, BUTTON_2, BUTTON_3, MAX_EVENTS } new_event; void action_s1_timeout (void); void action_s1_button0 (void); ... void action_s2_timeout (void); void action_s2_button0 (void); ... enum events get_new_event (void); void (*const state_table [MAX_STATES][MAX_EVENTS]) (void) = { { action_s1_timeout, action_s1_button0, ... }, { action_s2_timeout, action_s2_button0, ... }, ... }; void main (void) { new_event = get_new_event (); if (((new_event >= 0) && (new_event < MAX_EVENTS)) && ((current_state >= 0) && (current_state < MAX_STATES))) { state_table [current_state][new_event] (); //call the function } else { /* invalid event/state - handle appropriately */ } } void action_s1_timeout (void) { // do stuff //change state? current_state = STATE_2; //change lights? } void action_s1_button0 (void) {}; ... void action_s2_timeout (void) {}; void action_s2_button0 (void) {}; ... /* Return the next event to process - how this works depends on your application. */ enum events get_new_event (void) { return TIME_OUT; }

Visa signatur

weeeee

Permalänk
Medlem
Skrivet av pelleplu:

Hur långt har du kommit än så länge? Var exakt stöter du på problem? Har du hårdvaran klar med kopplingar från din Arduino till trafikljusen? Är det koden för kommunikation med hårdvaran, eller den övergripande logiken som är svårt?

Kopplingen är inte klar en, man vet vart lampor m.m. ska sitta och det är enkelt. Men det är just kodningen jag kan i stort sätt bara grunderna på... Och jag har försökt göra en kod av de jag kunde, men det slutar alltid skit.

Skrivet av mounte:

Jag antar att du redan börjat med att bryta ner problemet i mindre delar.
Du kommer ju inte stöta på problemet att alla signaler visar olika, några av signalerna kommer ju faktiskt alltid att visa samma sak som någon annan signal.

För mig så känns den här uppgiften ganska lämpad för en tillståndsmaskin.
Om du listar alla möjliga tillstånd och till varje tillstånd knyter du information om
1) vilka signaler lyser grönt
2) vilka signaler lyser rött
3) vilket tillstånd ska vi gå vidare till om tiden löper ut (30-60 sek)
4) vilket tillstånd ska vi gå vidare till om någon trycker på övergångsställe 1
5) vilket tillstånd ska vi gå vidare till om någon trycker på övergångsställe 2
6) vilket tillstånd ska vi gå vidare till om någon trycker på övergångsställe 3
7) vilket tillstånd ska vi gå vidare till om någon trycker på övergångsställe 4

enum states { STATE_1, STATE_2, STATE_3, ..., MAX_STATES } current_state; enum events { TIME_OUT, BUTTON_0, BUTTON_1, BUTTON_2, BUTTON_3, MAX_EVENTS } new_event; void action_s1_timeout (void); void action_s1_button0 (void); ... void action_s2_timeout (void); void action_s2_button0 (void); ... enum events get_new_event (void); void (*const state_table [MAX_STATES][MAX_EVENTS]) (void) = { { action_s1_timeout, action_s1_button0, ... }, { action_s2_timeout, action_s2_button0, ... }, ... }; void main (void) { new_event = get_new_event (); if (((new_event >= 0) && (new_event < MAX_EVENTS)) && ((current_state >= 0) && (current_state < MAX_STATES))) { state_table [current_state][new_event] (); //call the function } else { /* invalid event/state - handle appropriately */ } } void action_s1_timeout (void) { // do stuff //change state? current_state = STATE_2; //change lights? } void action_s1_button0 (void) {}; ... void action_s2_timeout (void) {}; void action_s2_button0 (void) {}; ... /* Return the next event to process - how this works depends on your application. */ enum events get_new_event (void) { return TIME_OUT; }

De där lät bra! Men som jag skrev ovan kan jag bara grunderna, så de här ser svårt ut... Kan du kanske förklara hur man "konfigurerar" de?

Visa signatur

Phenom II X6 1090T 3.8 GHz | Gigabyte GTX580 3GB | HAF 922 | ASUS P8P67 Pro | 16GB DDR3 1600 MHz | XFX 650W | A-DATA SSD 511-Series 60GB

Permalänk
Medlem

Hela tanken med tillståndsmaskiner (finita) är att det finns ett antal (finita) tillstånd. Sedan finns det länkar från ett tillstånd till ett eller flera andra.
Låt säga att spelar tre i rad vi har följande tillstånd
START, DIN_TUR, MIN_TUR, SLUT

Under START så slumpar vi en spelare som börjar, 50% chans att det blir min tur, 50% chans att det blir din tur. vems_tur = slumpa_tal_0_eller_1(); om vems_tur = 0 sätt tillståndet till MIN_TUR, om vems_tur = 1 sätt tillståndet till DIN_TUR.
Funktionerna som driver MIN_TUR och DIN_TUR ser ganska likadana ut:
MIN_TUR:
gör_ett_tillåtet_drag();
om kolla_om_vinst() så sätt tillståndet till SLUT
annars sätt tillståndet till DIN_TUR

DIN_TUR:
gör_ett_tillåtet_drag();
om kolla_om_vinst() så sätt tillståndet till SLUT
annars sätt tillståndet till MIN_TUR

osv.

Du kan nu fundera över hur ditt problem ser ut, vilka tillstånd och vilka övergångar från ett tillstånd till ett annat som finns.

t.ex. så kanske du är i tillståndet:
väg vänster-höger grön
där kan följande händelser inträffa:
1) 30 sekunder löper ut
2) någon trycker på knapp vid övergångsställe

givet dessa händelser så tas du vidare till ett annat tillstånd 1) tar dig till väg upp-ner grön 2) tar dig till övergångsställe vänster-höger eller upp-ner grön

Visa signatur

weeeee

Permalänk
Medlem
Skrivet av mounte:

Hela tanken med tillståndsmaskiner (finita) är att det finns ett antal (finita) tillstånd. Sedan finns det länkar från ett tillstånd till ett eller flera andra.
Låt säga att spelar tre i rad vi har följande tillstånd
START, DIN_TUR, MIN_TUR, SLUT

Under START så slumpar vi en spelare som börjar, 50% chans att det blir min tur, 50% chans att det blir din tur. vems_tur = slumpa_tal_0_eller_1(); om vems_tur = 0 sätt tillståndet till MIN_TUR, om vems_tur = 1 sätt tillståndet till DIN_TUR.
Funktionerna som driver MIN_TUR och DIN_TUR ser ganska likadana ut:
MIN_TUR:
gör_ett_tillåtet_drag();
om kolla_om_vinst() så sätt tillståndet till SLUT
annars sätt tillståndet till DIN_TUR

DIN_TUR:
gör_ett_tillåtet_drag();
om kolla_om_vinst() så sätt tillståndet till SLUT
annars sätt tillståndet till MIN_TUR

osv.

Du kan nu fundera över hur ditt problem ser ut, vilka tillstånd och vilka övergångar från ett tillstånd till ett annat som finns.

t.ex. så kanske du är i tillståndet:
väg vänster-höger grön
där kan följande händelser inträffa:
1) 30 sekunder löper ut
2) någon trycker på knapp vid övergångsställe

givet dessa händelser så tas du vidare till ett annat tillstånd 1) tar dig till väg upp-ner grön 2) tar dig till övergångsställe vänster-höger eller upp-ner grön

Då förstår jag lite bättre och det låter precis som så jag vill ha det! Jag får söka efter lite guider på google så kommer de nog lösa sig, annars hör jag av mig till dig om det är okej

Visa signatur

Phenom II X6 1090T 3.8 GHz | Gigabyte GTX580 3GB | HAF 922 | ASUS P8P67 Pro | 16GB DDR3 1600 MHz | XFX 650W | A-DATA SSD 511-Series 60GB

Permalänk
Testpilot

Det går att "fuska" lite då en fyrvägskorsning ju egentligen bara är två olika ljus och de andra är sen kopior av dem, om man trycker på knappen för att gå över det vänstra övergångsstället spelar det ingen roll om även det högra blir grönt eftersom hela den horisontella bilvägen måste ha rött och samma med den högra knappen, båda knapparna kan egentligen vara samma knapp och du behöver då bara läsa av två ingångar totalt.

Totalt blir det alltså bara två olika lägen/tillstånd du måste ha, ett där horisontella vägen och horisontella översgångställen har grönt medan den vertikala vägen och vertikala övergångsställen har rött (som din bild) och sen tvärt om.

Om du sen ska ha den mer avancerad som en riktig korsning där det ju inte blir grönt vid övergångsställena om man inte har tryckt så får du pilla lite extra.

Visa signatur

Kolla gärna in min RGB-LED-ljusstake i galleriet
[Gigabyte GA-Z97MX-Gaming 5][Intel Core i5 4690K][Corsair XMS3 16GB][Asus GeForce RTX 2060 Super Dual Evo OC]

Permalänk
Medlem
Skrivet av hunden:

Det går att "fuska" lite då en fyrvägskorsning ju egentligen bara är två olika ljus och de andra är sen kopior av dem, om man trycker på knappen för att gå över det vänstra övergångsstället spelar det ingen roll om även det högra blir grönt eftersom hela den horisontella bilvägen måste ha rött och samma med den högra knappen, båda knapparna kan egentligen vara samma knapp och du behöver då bara läsa av två ingångar totalt.

Totalt blir det alltså bara två olika lägen/tillstånd du måste ha, ett där horisontella vägen och horisontella översgångställen har grönt medan den vertikala vägen och vertikala övergångsställen har rött (som din bild) och sen tvärt om.

Om du sen ska ha den mer avancerad som en riktig korsning där det ju inte blir grönt vid övergångsställena om man inte har tryckt så får du pilla lite extra.

Jo de gör ju saken enklare, så jag kör nog på det tillsammans med det Mounte skrev här ovan så ska jag nog lyckas!

Visa signatur

Phenom II X6 1090T 3.8 GHz | Gigabyte GTX580 3GB | HAF 922 | ASUS P8P67 Pro | 16GB DDR3 1600 MHz | XFX 650W | A-DATA SSD 511-Series 60GB