Futtermaschine
-
Hallo zusammen,
Ich arbeite an einer Fütterungsmaschine. Das ganze soll mit einer Hardware(Lichtschranke, Moter, etc) und einer Software laufen!
Die Software ist mit der Sprache C geschrieben und der Code wird auf einen PIC(18F... falls wichtig nenn ich euch den ganzen Typ-Namen) gebrannt.Kurze erklärung:
Maschine: Die Maschine hat eine Eingabeplattform(Tastatur) und 8 Futterfächer.also hier einmal ein bild der tastatur(grafik):
www.bilder-hochladen.net/files/6ulh-2.jpg1-8: futterfächer
9: wenn man in einem Fach ist oder in der Uhrzeit funktion wird mit dem drücken auf "+" immer +1 zur zeit dazu addiert --> eben zum einstellen
10: wenn man in einem Fach ist oder in der Uhrzeit funktion wird mit dem drücken auf "-" immer -1 zur zeit dazu addiert --> eben zum einstellen
11: unbelegt
12: beim drücken auf zufall erscheint am display "Zufallsmodus: Ein" nochmal drücken auf zufall "Zufallsmodus: Aus" nochmal drücken ein ... aus ... ein ... usw
13: beim drücken auf zeit wird die Uhrzeit eingestellt
14: unbelegt
15: unbelegt
16: beim drücken auf start werden die werte übernommen. z.b.: man drückt fach 3 --> stellt dort "13:45" ein und drückt anschließen auf start um den Wert zu übernehmen. danach springt das programm ins hauptmenüDas hauptmenü kommt sofort nach dem start des gerätes auf den display und sieht so aus:
.__________________________
|Nächste Fütterung:
|XX:XX Zufall: Aus
.------------------------------------vom hauptmenü muss man eben nur die fächer drücken und man kommt quasi überallhin und wieder zurück zum hauptmenü.
Soweit so gut. Jetzt hab ich folgendes problem:
ich hab eine neue Funktion geschrieben(ganzen am ende vom code) namens fachrandom. Diese funktion berechnet mir die nächste fütterung + zufallsmodus und ist auf eine unbelegte taste gesetzt(zwecks test). aber ich bekomms nciht hin damit es im hauptmenü stehen bleibt.
außerdem hab ich einen neuen fehler - wenn ich zufallsmodus aktiviere wird zur nächsten fütterungszeit korrekt die random zahl addiert , wenn ich jedoch die fütterungszeit änder - ändert sich die zahl nicht
z.b.:
Uhrzeit: 13:00
fach 3: 13:14
Zufall: Ein
randomzahl wird zu fach 3 addiert(nur ein eispiel): 13:35
wenn man jedoch die uhrzeit im fach 3 ändern will ändert sich diese aber NICHT die zufallsfütterungszeit-------------------------------------------------------------------------------
Ich bin kein C Profi aber ich geb mir viel mühe nur hab ich hierbei keine ahnung woran es liegen könnte! Falls der Quellcode benötigt wird - poste ich den natürlich auch(ist halt etwas lang)
Wäre echt super wenn mir jemand helfen kann ...mit freundlichen grüßen,
ein verzweifelter programmierer
-
Poste doch einfach den Quellcode, der relevant ist. Also die Funktion "fachrandom" und die Stelle, wo sie aufgerufen wird.
wenn man jedoch die uhrzeit im fach 3 ändern will ändert sich diese aber NICHT die zufallsfütterungszeit
Dann schraub doch einfach auch die Fütterungszeit hoch, wenn du die Uhrzeit hochstellst.
-
okay also hier die neue funktion - fachrandom:
void fachrandom() { int taste=0; char text1[20]="Randomzahl:\0"; char text2[20]="\0"; char text3[20]="\0"; char text4[20]="\0"; char text5[20]="\0"; char text6[20]="\0"; char text7[20]="\0"; char text8[20]="\0"; char text9[20]="\0"; char hour2[20]="\0"; char hour3[20]="\0"; char hour4[20]="\0"; char hour5[20]="\0"; char hour6[20]="\0"; char hour7[20]="\0"; char hour8[20]="\0"; char hour9[20]="\0"; char min2[20]="\0"; char min3[20]="\0"; char min4[20]="\0"; char min5[20]="\0"; char min6[20]="\0"; char min7[20]="\0"; char min8[20]="\0"; char min9[20]="\0"; char zumin5[20]="\0"; char zumin6[20]="\0"; char zumin7[20]="\0"; char zuhour5[20]="\0"; char zuhour6[20]="\0"; char zuhour7[20]="\0"; char zuhour8[20]="\0"; char zufamin5[20]="\0"; char zufamin6[20]="\0"; char zufamin7[20]="\0"; char aktuell[20]="akt:\0"; char addiert[20]="rand:"; char next[20]="Nextfeed:"; char TEST[20]="RAND-AKTIVIERT!"; char nuller[3]="\0"; char buf[20]="\0"; char buf1[20]="\0"; int hour_next=0; int min_next=0; int sec_next=0; /* zufallswert01=rand(); zufallswert=zufallswert01*2; fach5_min_zufall=zufallswert+fach5_min; fach6_min_zufall=zufallswert+fach6_min; fach7_min_zufall=zufallswert+fach7_min; */ /* lcd_cls(); lcd_println(1,1, text1); sprintf(text2, "%d", zufallswert); sprintf(text3, "%d", fach4_min); sprintf(text4, "%d", fach4_min_zufall); sprintf(text5, "%d", fach4_hour_zufall); sprintf(text6, "%d", fach4_min_neu); while(1) { if(fach4_min_zufall < 59) { lcd_move_cursor(1,14); lcd_println(14,1, text2); lcd_println(1,2, aktuell); lcd_println(6,2, text3); lcd_println(9,2, addiert); lcd_println(15,2, text4); } else { if(fach4_min_zufall > 59) { //lcd_cls(); fach4_min_neu=fach4_min_zufall-60; lcd_println(1,2, text6); } } taste=tastatur(0); if(taste==16) { nextfeed_time(); apply_data(); break; } } */ //RL- Zeit rtc_get_time(hour_next,min_next,sec_next); hour_next=decimal(hour_next); min_next=decimal(min_next); lcd_cls(); lcd_println(1,1, next); //Stunden sprintf(hour2, "%d", fach1_hour); sprintf(hour3, "%d", fach2_hour); sprintf(hour4, "%d", fach3_hour); sprintf(hour5, "%d", fach4_hour); sprintf(hour6, "%d", fach5_hour); sprintf(hour7, "%d", fach6_hour); sprintf(hour8, "%d", fach7_hour); sprintf(hour9, "%d", fach8_hour); //Minuten sprintf(min2, "%d", fach1_min); sprintf(min3, "%d", fach2_min); sprintf(min4, "%d", fach3_min); sprintf(min5, "%d", fach4_min); sprintf(min6, "%d", fach5_min); sprintf(min7, "%d", fach6_min); sprintf(min8, "%d", fach7_min); sprintf(min9, "%d", fach8_min); sprintf(zumin5,"%d", fach5_min_neu); sprintf(zumin6,"%d", fach6_min_neu); sprintf(zumin7,"%d", fach7_min_neu); sprintf(zuhour5,"%d", fach5_hour_neu); sprintf(zuhour6,"%d", fach6_hour_neu); sprintf(zuhour7,"%d", fach7_hour_neu); sprintf(zuhour8,"%d", fach8_hour_neu); sprintf(zufamin5,"%d", fach5_min_zufall); sprintf(zufamin6,"%d", fach6_min_zufall); sprintf(zufamin7,"%d", fach7_min_zufall); sprintf(nuller,"%d", anzeige); if(rand_onoff == 0) { while(1) { if(fach5_hour > hour_next)// && (fach5_min > min_next)) { lcd_println(1,2, hour6); lcd_move_cursor(3,2); lcd_write_char(':'); lcd_println(4,2, nuller); lcd_println(5,2, nuller); if(fach5_min > min_next) { lcd_println(4,2, min6); } } else { if(fach6_hour > hour_next)// && (fach6_min > min_next)) { lcd_println(1,2, hour7); lcd_move_cursor(3,2); lcd_write_char(':'); lcd_println(4,2, nuller); lcd_println(5,2, nuller); if(fach6_min > min_next) { lcd_println(4,2, min7); } } else { if(fach7_hour > hour_next)// && (fach7_min > min_next)) { lcd_println(1,2, hour8); lcd_move_cursor(3,2); lcd_write_char(':'); lcd_println(4,2, nuller); lcd_println(5,2, nuller); if(fach7_min > min_next) { lcd_println(4,2, min8); } } } } taste=tastatur(0); if(taste==16) { nextfeed_time(); apply_data(); break; } } } else { if(rand_onoff == 1) { //lcd_println(1,6, TEST); /*zufallswert01=rand(); zufallswert=zufallswert01*2; fach5_min_zufall=zufallswert+fach5_min; fach6_min_zufall=zufallswert+fach6_min; fach7_min_zufall=zufallswert+fach7_min;*/ /*if(fach5_min_zufall > 59) { fach5_min_neu=60; fach5_hour_neu=fach5_hour+1; } else { if(fach6_min_zufall > 59) { fach6_min_neu=60; fach6_hour_neu=fach6_hour+1; } else { if(fach7_min_zufall > 59) { fach7_min_neu=60; fach7_hour_neu=fach7_hour+1; } else {*/ if(fach5_hour > hour_next)// && (fach5_min > min_next)) --- //if(fach5_hour_neu > hour_next) { lcd_println(1,2, hour5); lcd_move_cursor(3,2); lcd_write_char(':'); lcd_println(4,2, nuller); lcd_println(5,2, nuller); if(fach5_min_zufall > min_next) { lcd_println(4,2, zufamin5); } //lcd_println(1,2, TEST); } else { if(fach6_hour > hour_next)// && (fach6_min > min_next)) { lcd_println(1,2, hour6); lcd_move_cursor(3,2); lcd_write_char(':'); lcd_println(4,2, nuller); lcd_println(5,2, nuller); if(fach6_min_zufall > min_next) { lcd_println(4,2, zufamin6); } } else { if(fach7_hour > hour_next)// && (fach7_min > min_next)) { lcd_println(1,2, hour7); lcd_move_cursor(3,2); lcd_write_char(':'); lcd_println(4,2, nuller); lcd_println(5,2, nuller); if(fach7_min_zufall > min_next) { lcd_println(4,2, zufamin7); } } } } } taste=tastatur(0); if(taste==16) { nextfeed_time(); apply_data(); break; } } }
→if(rand_onoff == 0) --> abfrage was passiert wenn Zufall AUS ist
→if(taste==16){nextfeed_time();apply_data();break;} --> wenn taste 16 gedrückt wird - speichern
bin drauf gekommen, vl ist das ja der fehler: im hauotmenü muss ich ja nichts speichern(!) daher ist diese if anweisung(if(taste==16)..) unnötig - werds mal rausnehmen und euch informieren
das hier ist quasi das hauptmenü das beim starten des gerätes und während der betriebnahme am display steht:
-----------------------------------------------------------------------
void nextfeed() { char text1[22]="Naechste Fuetterung:\0"; //char text1[22]="chste F\0"; char text12[22]="tterung:\0"; //char text12[22]="tterung:\0"; char text2[12]="Zufall Ein\0"; char text3[12]="Zufall Aus\0"; char buf[20]="\0"; char buf1[20]="\0"; char test[20]="\0"; //Rl- Variablen int hour_next=0; int min_next=0; int sec_next=0; //Nächste Fütterung lcd_cls(); lcd_println(1,1, text1); /* lcd_println(1,1, text1); lcd_move_cursor(1,1); lcd_write_char('N'); lcd_write_char(0xE1); //1110 0001 code =E1 = ä lcd_println(1,3, text1); lcd_write_char(0xF5); //1111 0101 code =F5 = ü lcd_println(1,11, text12); */ }
→so hier hab ich schon versucht in diese funktion einfach "fachrandom();" reinzuschreiben. es funktioniert auch aber ich kann vom hauptmenü nicht mehr auf die anderen fächer zugreifen
vl hat das was mim if(taste==16) zutun! werd das mal überarbeiten und weitere infos kommen gleich.
P.S.:
Ja genau das mein ich ja ^^
hoffe man versteht mich also:
Fach 3: 13:15
Uhrzeit: 13:00
Im Hauptmenü steht daher "Nächste Fütterung: 13:15".
Dann schalte ich aber den "Zufall: Ein" und es steht im Hauptmenü korrekt eine andere Zahl z.b.: "Nächste Fütterung: 13:35".
Wenn ich aber ins Fach 3 wechsel und dort die Zeit "13:15 auf eine andere Zahl ändern möchte wird diese übernommen - jedoch bleibt die alte Fütterungszeit(13:35) gleich. Erst wenn ich den Zufall aus und wieder ein schalte wird eine randomzahl zur neuen Fütterungszeit addiert.
Okay hab jetzt diese if anweisung weggenommen und "fachrandom();" ins hauptmenü geschrieben - jetzt funkt mein hauptmenü.und schon kam ein neuer fehler:
Der Fehler mit der zufallszahl ist noch immer bestehend(leider)
Ein Fehler bei der nächsten fütterungszeit
meine neue funktion bezieht sich ja nur auf fach 5,6 und 7(zweck test). jedoch funktioniert nur mein fach 6 korrekt
ich habe hier zum besseren vergleich:
fach5: 11:00
fach6: 13:00
fach7: 14:00
Uhrzeit: 13:00
Hauptmenü zeigt an: "Nächste Fütterung: 13:00" passt soweit
wenn ich jedoch im fach6 die Fütterzeit auf "14:13" stelle sollte ja fach7 also nächste Fütterung angezeigt werden, aber mir wird etwas anderes angezeigt.
Hauptmenü zeigt an: "Nächste Fütterung: 14:13" obwohl die zeit "14:00" beträgt und auch wenn ichs änder wechselt es sich nicht
ich hab keine ahnung woran das liegen könnte
-
Dieser Thread wurde von Moderator/in Korbinian aus dem Forum Projekte in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
du solltes dir so sachen wie schleifen und strukturen ansehen...dann wird der code um einiges kürzer und übersichtlicher!!
-
ja das sollte ich - da aber mein wissen über c beschränkt ist hab ichs ohne gelöst ... was mir aber mehr helfen würde sind ratschläge bezüglich meines problems.
-
pg_whoop schrieb:
ja das sollte ich - da aber mein wissen über c beschränkt ist hab ichs ohne gelöst ... was mir aber mehr helfen würde sind ratschläge bezüglich meines problems.
C ohne Schleifen ist wie Laufen ohne Beine
-
...Dann schalte ich aber den "Zufall: Ein" und es steht im Hauptmenü korrekt eine andere Zahl z.b.: "Nächste Fütterung: 13:35"...
Was ist das für ne Kackmaschine?
Per Zufall gesteuerte Fütterung?
Das ist Tierquälerei!
-
Okay nochmal:
Es gibt 8 Futterfächer die man zeitlich einstellen kann!
Fach 1: 11:00
.
Fach 3: 13:30
.
Fach 8: 17:00
Uhrzeit: 13:00Um die Nächste Fütterung zu ermitteln gibt es eine If anweisung, welche die derzeitige Uhrzeit(13:00) mit den Fütterungszeiten aller Fächer vergleichen soll.
Daher:
Fach 1 ≥ Uhrzeit? Nein
Fach 2 ≥ Uhrzeit? Nein
Fach 3 ≥ Uhrzeit? Ja
so jetzt wird mir am display angezeigt "Nächste Fütterung: 13:30"
Damit die Tiere aber sich nicht 1:1 an die Fütterungszeiten gewöhnen soll nach bedarf ein "Zufallsmodus" eingeschaltet werden.
Wenn man jetzt "Zufallsmodus" aktiviert, so soll zur nächsten Fütterung "13:30" ein Randomwert addiert werden. Um hier ein Beispiel zunennen --> "13:45"
Das alles funktioniert soweit auch aber wenn ich jetzt nachträglich die Fütterungszeit ändern will auf sagen wir "13:40" so wird kein Randomwert angerechnet, sondern es bleibt weiterhin "13:45" ...
Erst wenn ich den "Zufallsmodus" deaktiviere und wieder aktiviere wird zur nächsten Fütterung "13:40" korrekt ein Randomwert addiert.
Ich würde es aber gerne so haben wollen, dass mir auch im aktivierten "Zufallsmodus" eine korrekte Randomzahl zur nächsten Fütterung addiert wird, egal ob ich diese im aktiven Modus änder.
-
Hallo pg_whoop,
schick mir mal deine Preisvorstellung und du bekommst von mir alles neugeschrieben und alle Prozesse sinngemäß als Objekte bzw. Strukturen und V-Table abgebildet. Eine gute Dokumentation gibt es natürlich auch dazu.
MfG Wally,
wl_hh[ät]yahoo.de