INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Brennersteuerung
06.12.2013, 10:51
Beitrag #17
RE: Brennersteuerung
Hallo Joe,

Zitat:Es bringt ja nichts, wenn ich versuchen würde, etwas an Deinem Hardwarevorschlag herunter zu handeln.
Hier gehts doch nicht ums handelnHuh
Es ist nur so, dass ich in einem anderem Projekt vor einem sehr ähnlichen Problem stehe: Wie bekomme ich soviele wie möglich Teile an ein Board?
Zitat:Wenn Du der Meinung bist, das es nicht anders geht, ist das wohl so.
Das glaube ich nicht wirklich. Bin auch erst seid ein paar Monaten der Arduino-Sucht verfallen und damit auch sicher noch Neuling.
Zur den "Einschränkungen" beid er Hardware:
Ja klar hat der Mega etliches an Anschlüssen, die Frage ist: wie komme ich rein "mechanisch" da ran wenn z.B. das Sensor- oder Ethernet-Shield drauf sind.
Die Frage
Zitat:Kann mir mal jemand bitte erklären, wieviele Shields man übereinanderpacken kann? Wo sind da die Grenzen?
spiegelt genau das wieder. Du musst erstmal feststellen welche Boards du benutzen möchtest, dann aber gucken ob die Boards nicht Pins auf dem Arduino-Board doppelt belegen oder die Nutzung bestimmter Pins verbieten.
Display: ich weiß nicht ob du mit 2 x 16 glücklich wirst. Wenn, dann würde ich gleich sowas nehmen: http://www.robotshop.com/en/dfrobot-lcd-...duino.html
Da steht dann unter "Description" auch gleich noch welche Pins belegt sind bzw. welche anderen dann nicht benutzt werden dürfen.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.12.2013, 10:58
Beitrag #18
RE: Brennersteuerung
Hallo Joe, ein umfassendes Werk über die Shields ist mir (noch) nicht bekannt, und setze:

int analogpin = A0;

Gruß, Stefan . . . . . . //Wo mein Kölbchen dampft, da bin ich unverkrampft.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.12.2013, 13:00
Beitrag #19
RE: Brennersteuerung
Da wird sich Joe wohl ein bisserl durch shieldlist.org durcharbeiten müssen!

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.12.2013, 20:07 (Dieser Beitrag wurde zuletzt bearbeitet: 06.12.2013 20:25 von JoeDorm.)
Beitrag #20
RE: Brennersteuerung
(06.12.2013 10:58)Stefan schrieb:  Hallo Joe, ein umfassendes Werk über die Shields ist mir (noch) nicht bekannt, und setze:
int analogpin = A0;

Hallo,

danke für den Tip.
War jedoch nicht die Lösung für mein Problem, da ich A0 auch ohne A bereits einlesen konnte.

Ich habe ausserhalb, also oben, sozusagen global die Variable
float a_input=1.1 getätigt.
Somit müßte ich damit rechnen können.

Witzigerweise wird im Variablenfenster der berechnete Wert korrekt berechnet, aber offensichtlich hat der Compiler/Interpreter Prbleme damit a_input automatisch für die lcd Ausgabe zu übergeben, oder ich brauche eine Konvertierungsmethode auf String.
Bei den int Werten gibts bei der Ausgabe keine Probleme.
Was dürfte es Deiner Meinung nach sein?

Gruß Joe

Hallo Ricardo,

Dank für Deine Info.

Dieses LCD benutze ich erstmal nur als alternative Ausgabe in der Simulation. Ist wahrscheinlich ähnlich dem, was später mit einem anderen Display realisiert wird.

Ich habe 4 verschiedene Displays, auch das TFT, bestellt. Dauert angeblich bis zum 15.Januar.

Habe jetzt einen 2x8 oder 2x16 LCD glaub ich im dem Mega Set dabei, was ich heute Nachmittag erhalten habe.

Mir ist aufgefallen, das im Set ein Batteriefach für 6Zellen drin ist, was bis zu 9.x Volt bereitstellen dürfte. Darf ich annehmen, das ich mit 4 oder 5 Zellen immer noch klarkomme? Muß ja nicht Batterieleistung unnötig in Wärme verbraten werden, oder?

Im Set dürfte einiges zum Austesten drin sein, z.B. Tasten für die Menüführung. Wäre gut, wenn es da bereits ein Programmmodul zum Einpassen gäbe.

Das Display mit den 6 Tasten habe ich auch geordert, aber bis dahin kann ich ja erstmal experimentieren.

Wenn ich es recht überdenke, brauche ich weder den Servoshield, noch den Sensorshield, da die Anschaltung für die paar Sachen auch auf einem Breadboard aufgebaut werden kann, und später alles auf einen Testshield draufpaßt.
Die wenigen Outputs sollten auch noch frei sein, um einen Transistortreiber für die Relais zu versorgen.

Muß nur zusehen, das ich mit für die Kommunikation genug Ports freihalte.
Das Schöne ist, das ich mit dem Simulator das Meiste zuvor testen kann. VBB wäre vielleicht noch einen TIck besser, da ich dort auch das Breadboard und weitere Komponenten mit drin hätte.

Wenns recht ist, würde ich hier auch das entstehende Programm in diesem Thread behandeln, damit alles schön beieinander ist.

Gruß Joe

Unser Projekt Rolleyes http://global-science-circle.net http://global-science-circle.org http://global-science-circle.info UND http://radio-gsc1.info
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.12.2013, 11:52
Beitrag #21
RE: Brennersteuerung
für die Kombination von Strings und numerischen Variablen auf dem LCD suche ich auch noch eine komfortablere Methode, als alle einzeln zu schreiben. Ich dachte, eine gefunden zu haben, sie funktioniert aber auch nicht.

Ricardo, kennst du vielleicht eine?Huh

Gruß, Stefan . . . . . . //Wo mein Kölbchen dampft, da bin ich unverkrampft.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.12.2013, 17:12
Beitrag #22
RE: Brennersteuerung
Hallo Stefan,

ich habe heute meine IDE nicht mit(bin auf dem Dorf Smile ). Daher kann ich deine Frage nach der kombinierten Ausgabe numerisch + string in einem Rutsch erst morgen beantworten.
Wird aber sicher über eine Extrafunktion gehen die Richtung sprintf arbeitet und einen Char-Buffer benutzt.
Die String-Klasse selbst zieht eine ganze Menge Speicher weg und ist, gerade bei Uno-Boards, eher doof.
Melde mich.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2013, 03:18 (Dieser Beitrag wurde zuletzt bearbeitet: 10.12.2013 14:52 von JoeDorm.)
Beitrag #23
RE: Brennersteuerung
Hallo mal wieder :-)

nun, habe das Stringproblem für mich gelöst, indem ich ein sogenanntes casten(Anpassung des Variablentypa und Umwandlung) gemacht habe.

String s="";
double d=1.23456;
s=String(d); //casten
lcd.print("dada "+s+" fdsfds");

Habe noch Probleme mit dem Vitronics Simulator. Das Teil ist noch voll buggy
Werde mir doch wohl noch VBB zulegen.
Frage mich auch, wie ich das Proggi in den Rechner bekomme, da ich bisher nur simuliert habe.

Versuchte mir ein Menü zu konstruieren.
Die Umsetzung ist leider sehr beschwerlich.

Gibts da Vorschläge einer komfortablen Menüführung, incl. Tastenabfrage und LCD-Ausgabe?

Das ist ja grausig.
So einfach wie auf einem PC, wo man viel Platz hat und einfach mal eine Programmnummer abfragt zum Verzweigen, is ja nich.

Ln der loop() habe ich eine Menüabfrage zum Verzweigen, die Abfrage z.B. if(menu==200) funktionX(); geht garnicht im Simulator. Der rennt einach da drüber.
Was könnte das sein? Bug im Simulator, oder syntaktischer Fehler?

Bin aber noch fleissig dran, und habe das Forum hier nicht vergessen.

Code:
//Simulate Mega

#include <LiquidCrystal.h>
#include <Servo.h>  

Servo myServo;
int servoPin = 7;   // Servo mit freiem Digital-Pin verbunden
int myAngle=90;     // Drehwinkel des Servos ca 0-180 Grad
int servoStep=5;
int center=90;      // 0 Grad
int pulseWidth;     // Variable der servoPulse-Funktion;
  
int DelayMS=1000;
int analogpin = A0;

LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
int backLight = 12;

int inp=3;
float a_input=1.1;
String s="";
int menu=0;
String version="Regomat V0.1";
double LbdCen=1.55;
double LbdSpr=0.15;
int kw=5;
int T1=0,T2=0,T3=0,T4=0,T5=0,T6=0;
byte R1=LOW, R2=LOW;

void servoPulse(int servoPin, int myAngle) {
    pulseWidth = (myAngle * 10) + 600; // bestimmt die Verzögerung
    digitalWrite(servoPin, HIGH);      // setzt den Ausgang auf HIGH
    delayMicroseconds(pulseWidth);     // Mikrosekunden Pause
    digitalWrite(servoPin, LOW);       // setzt den Ausgang auf LOW
}

void readData() {
   inp=analogRead(analogpin);
   if(a_input>LbdCen+LbdSpr/2 && myAngle>0)
       myAngle=center-servoStep;
   else if(a_input<LbdCen-LbdSpr/2 && myAngle<180)
       myAngle=center+servoStep;
   else
       myAngle=center;
   a_input=5.0/1023.0;
   a_input=a_input*(double)inp;
   s = String(a_input);
}

void printLCD() {
   lcd.setCursor(0,3);
   lcd.print("i="+inp+" ");
   lcd.print("Lbd="+s+" ");
   lcd.print("o="+myAngle+"   ");
}

void setServoLuft(int myAngle) {
   servoPulse(servoPin, myAngle);
   delay(DelayMS);
}

void setRelaisPellets(byte R1) {
    int out1=D20;
    digitalWrite(out1,R1);
}
void setRelaisAsche(byte R2) {
    int out2=D21;
    digitalWrite(out2,R2);
}

void readTasten() {
   int di1=D14;//ESC, Einstellung beenden
   int di2=D15;//Links, Ebene zurück
   int di3=D16;//Rechts, Ebene vor
   int di4=D17;//Oben, nach oben
   int di5=D18;//Unten, nach unten
   int di6=D19;//Reset
   T1=digitalRead(di1);
   T2=digitalRead(di2);
   T3=digitalRead(di3);
   T4=digitalRead(di4);
   T5=digitalRead(di5);
   T6=digitalRead(di6);
    if(T1+T2+T3+T4+T5+T6 != 0) {
       if(T1==1) { //ESC
       }
       if(T2==1) { //Links
         if(menu==200) menu=100;
         if(menu==210) menu=200;
         if(menu==211) menu=210;
         //usw...
       }
    }
   delay(DelayMS);
}

void printFree(int zeile) {
   lcd.setCursor(0,zeile);
    lcd.print("                    ");
}
void printFree3() {
   printFree(3);
}
void printFree2() {
    printFree(2);
    printFree(3);
}
void printFree1() {
    printFree(1);
    printFree(2);
    printFree(3);
}
void printFree0() {
    printFree(0);
    printFree(1);
    printFree(2);
    printFree(3);
}
void printLCDmenu000() {
   printFree0();
   lcd.setCursor(0,0);
    lcd.print(version+" M000");
   lcd.setCursor(0,1);
    lcd.print("Initialisierung");
   lcd.setCursor(0,2);
    lcd.print("Bitte warten");
   lcd.setCursor(0,3);
    lcd.print("Finish");
}

void printLCDmenu100() {
   printFree0();
   lcd.setCursor(0,0);
    lcd.print(version+" M100");
   lcd.setCursor(0,1);
    lcd.print("Betriebsart");
}

void printLCDmenu110{
   printFree0();
   lcd.setCursor(0,0);
    lcd.print(version+" M110");
   lcd.setCursor(0,1);
    lcd.print("Automatik200");
   lcd.setCursor(0,2);
    lcd.print("Manuell300");
   lcd.setCursor(0,3);
    lcd.print("Einstellung400");
}

void printLCDmenu111() {
}
void printLCDmenu112{
   printFree0();
   lcd.setCursor(0,0);
    lcd.print(version+" M111");
   lcd.setCursor(0,1);
    lcd.print("Automatik");
   lcd.setCursor(0,2);
    lcd.print("Einstellung kw");
   lcd.setCursor(0,3);
    lcd.print("Eingabe kw : ___");
}
void printLCDmenu113() {
}
void printLCDmenu120() {
   printFree0();
   lcd.setCursor(0,0);
    lcd.print(version+" M120");
   lcd.setCursor(0,1);
    lcd.print("Betriebsart Manuell");
}

void printLCDmenu200{
   printFree0();
   lcd.setCursor(0,0);
    lcd.print(version+" M200 Automatik");
   lcd.setCursor(0,1);
    lcd.print("Einstell. kw 210");
   lcd.setCursor(0,2);
    lcd.print("Einstell. LC 220");
   lcd.setCursor(0,3);
    lcd.print("Einstell. LS 230");
}
void printLCDmenu210() {//Einstellung Lambda Center
   printFree0();
   lcd.setCursor(0,0);
    lcd.print(version+" M210 Automatik");
   lcd.setCursor(0,1);
    lcd.print("Einstell. Lbd Center");
   lcd.setCursor(0,2);
    lcd.print("Alter Wert : "+LbdCen);
   lcd.setCursor(0,3);
    lcd.print("Neuer Wert : _");
}
void printLCDmenu220() {
   printFree0();
   lcd.setCursor(0,0);
    lcd.print(version+" M220 Automatik");
   lcd.setCursor(0,1);
    lcd.print("Einstell. Lbd.Spreizung");
   lcd.setCursor(0,2);
    lcd.print("Alter Wert : "+LbdSpr);
   lcd.setCursor(0,3);
    lcd.print("Neuer Wert : _");
}
void printLCDmenu230() {
   printFree0();
   lcd.setCursor(0,0);
    lcd.print(version+" M230 Automatik");
   lcd.setCursor(0,1);
    lcd.print("Einstell. Kessel kw");
   lcd.setCursor(0,2);
    lcd.print("Alter Wert : "+kw);
   lcd.setCursor(0,3);
    lcd.print("Neuer Wert : _");
}
void printLCDmenu300() {
   printFree0();
   lcd.setCursor(0,0);
    lcd.print(version+" M300 Manuell");
   lcd.setCursor(0,1);
    lcd.print("Pellets Ein 0/1");
   lcd.setCursor(0,2);
    lcd.print("Zuluft +/-");
   lcd.setCursor(0,3);
    lcd.print("Aschetransport 0/1");
}

void EinstellLbdCen() {
}
void EinstellLbdSpr() {
}
void initTimer() {
}
void setup() {
   initTimer();
   pinMode(D14,INPUT);
   pinMode(D15,INPUT);
   pinMode(D16,INPUT);
   pinMode(D17,INPUT);
   pinMode(D18,INPUT);
   pinMode(D19,INPUT);
   pinMode(D20,OUTPUT);
   pinMode(D21,OUTPUT);
   pinMode(backLight, OUTPUT);
   digitalWrite(backLight, HIGH);
   lcd.begin(20,4);                    // 4 zeilen a 20 Zeichen
   lcd.clear();
   if(menu==0) printLCDmenu000();
    myServo.attach(servoPin);
   myAngle=center;
   setServoLuft(myAngle);
   setRelaisPellets(LOW);
   setRelaisAsche(LOW);
}  

int loop() {
    if(menu==  0) menu=200;
    if(menu==000) printLCDmenu000(); //Initiale Ausgabe
    if(menu==100) printLCDmenu100(); //Betriebsart
    if(menu==110) printLCDmenu110(); // Betrieb,Automatik
    if(menu==111) printLCDmenu111(); //  Betrieb,Automatik,kw
    if(menu==112) printLCDmenu112(); //  Betrieb,Automatik,LCenter
    if(menu==113) printLCDmenu113(); //  Betrieb,Automatik,LSpreiz
    if(menu==120) printLCDmenu120(); // Betrieb,Manuell
    if(menu==200) printLCDmenu200(); //Einstellung
    if(menu==210) printLCDmenu210(); // Einstellung,LambdaCenter
    if(menu==211) EinstellLbdCen();  //Justierung,LambdaCenter
    if(menu==220) printLCDmenu220(); // Einstellung,LambdaSpreizung
    if(menu==221) EinstellLbdSpr();  //Justierung,LambdaSpreizung
    if(menu==230) printLCDmenu230(); // Einstellung,kw
    if(menu==300) printLCDmenu300(); // Manueller Betrieb
    if(menu==400) printLCDmenu400(); // Nur Einstellungen
    
   readData();
   printLCD();
   setServo();
   setRelaisPellets();
   setRelaisAsche();
    
   readTasten();
}
Hier mein letzter Programmstand.
Ausgabe geht, Menü ist Käse.
Proggi kommt aus dem Simulator!!!
Bitte nicht ins Brett reintüten.

Gruß Joe

Unser Projekt Rolleyes http://global-science-circle.net http://global-science-circle.org http://global-science-circle.info UND http://radio-gsc1.info
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.12.2013, 22:29
Beitrag #24
RE: Brennersteuerung
Hallo Stefan,

so wie folgt sollte zumindest die Ausgabe von Text + Integer in einem Aufruf funktionieren:
Code:
const int intzahl = 10;
const char inttext[] = "Das ist ein Integer:";
char rwert[]="*";
void setup()
{
  Serial.begin(9600);
  Serial.print(int_char_num(inttext,intzahl));
}
void loop()
{
}
char* int_char_num(const char* inttext,int intzahl)
{
  sprintf(rwert,"%s%d\n",inttext,intzahl);
  return rwert;
}
Geht zwar auf den Monitor sollte über LCD aber auch laufen.
Leider ist in der AVR-Lib die Unterstützung für sprintf auf float-Variablen nicht drin.
Daher muss man diese dann erst zerlegen. Schaue ich mir in den nächsten Tagen an.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste