Show Posts
Pages: [1] 2 3
1  International / Deutsch / Re: Temperaturmessung mit mehreren DS18S20 on: June 02, 2013, 04:51:27 pm
Hallo Marko,
es sind genau diese Temperaturfühler, die maverick1509 verlinkt hat.

Gruß Jens
2  International / Deutsch / Re: Temperaturmessung mit mehreren DS18S20 on: May 14, 2013, 02:38:25 pm
Hallo Kalli,
hat funktioniert. smiley
Vielen Dank dafür.
Der Tipp von MaFu funktioniert nicht. Es wird ein Sensor angezeigt und der andere Zeigt immer den Wert 0 an.

Gruß Jens
3  International / Deutsch / Re: Temperaturmessung mit mehreren DS18S20 on: May 11, 2013, 07:26:32 am
Hallo an alle,

hat jemand eine Idee und kann mir helfen?

Bei meinem Code wird immer der gleiche Wert für beide Temp.-Fühler angezeigt.

Gruß Jens
4  International / Deutsch / Re: Temperaturmessung mit mehreren DS18S20 on: May 06, 2013, 04:04:09 pm
Hallo rudirabbit,

danke für die Hilfe, aber wie bekomme ich denn nun die 2 Temp.-Fühler angezeigt?
Bei mir wird immer der gleiche Wert für beide Temp.-Fühler angezeigt.
Hier der Sketch dazu:

Code:
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 28

//DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben. (loop anpassen)
DeviceAddress sensor1 = {
  0x28, 0x36, 0x2F, 0x99, 0x4, 0x0, 0x0, 0x3A };
DeviceAddress sensor2 = {
  0x28, 0xB1, 0xB7, 0xBD, 0x4, 0x0, 0x0, 0xA2 };

const int MaxSensors=4;


float temp[MaxSensors];

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

char sensor1Name[] = "Unterschrank: ";
char sensor2Name[] = "W.-Temp: ";


void setup(void)
{
  Serial.begin(9600);
}

void loop(void)
{

  //sensors.setWaitForConversion(false);
  sensors.requestTemperatures();
  temp[1]=sensors.getTempCByIndex(1);
  temp[2]=sensors.getTempCByIndex(2);


  Serial.print(sensor1Name);
  Serial.print(temp[1]);
  Serial.println(" Celsius");

  Serial.print(sensor2Name);
  Serial.print(temp[2]);
  Serial.println(" Celsius");
}

Gruß Jens
5  International / Deutsch / Re: Temperaturmessung mit mehreren DS18S20 on: April 28, 2013, 04:43:06 pm
Hallo maverick1509,

meinst du so:

Code:
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire  ds(28); //pin für ds1820

//DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben. (loop anpassen)
DeviceAddress sensor1 = { 0x28, 0x36, 0x2F, 0x99, 0x4, 0x0, 0x0, 0x3A };
DeviceAddress sensor2 = { 0x28, 0xB1, 0xB7, 0xBD, 0x4, 0x0, 0x0, 0xA2 };


char sensor1Name[] = "Unterschrank: ";
char sensor2Name[] = "W.-Temp: ";


void setup(void)
{
  Serial.begin(9600);
}

void writeTimeToScratchpad(byte* address)
{
  //reset the bus
  ds.reset();
  //select our sensor
  ds.select(address);
  //CONVERT T function call (44h) which puts the temperature into the scratchpad
  ds.write(0x44,1);
  //sleep a second for the write to take place
  delay(1000);
}

void readTimeFromScratchpad(byte* address, byte* data)
{
  //reset the bus
  ds.reset();
  //select our sensor
  ds.select(address);
  //read the scratchpad (BEh)
  ds.write(0xBE);
  for (byte i=0;i<9;i++){
    data[i] = ds.read();
  }
}

float [color=orange]getTempC[/color](byte* address)
{
  int tr;
  byte data[12];

  writeTimeToScratchpad(address);

  readTimeFromScratchpad(address,data);

  //put in temp all the 8 bits of LSB (least significant byte)
  tr = data[0];

  //check for negative temperature
  if (data[1] > 0x80)
  {
    tr = !tr + 1; //two's complement adjustment
    tr = tr * -1; //flip value negative.
  }

  //COUNT PER Celsius degree (10h)
  int cpc = data[7];
  //COUNT REMAIN (0Ch)
  int cr = data[6];

  //drop bit 0
  tr = tr >> 1;

  return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}

void loop(void)
{
 
  float temp1 =getTempC(sensor1);
  float temp2 =getTempC(sensor2);
 


  Serial.print(sensor1Name);
  Serial.print(temp1);
  Serial.println(" Celsius");

  Serial.print(sensor2Name);
  Serial.print(temp2);
  Serial.println(" Celsius");


  Serial.println();
  delay(1000);
}

zeigt aber leider immer noch die Temperatur in Fahrenheit an.

Gruß Jens
6  International / Deutsch / Re: Temperaturmessung mit mehreren DS18S20 on: April 26, 2013, 06:26:38 pm
Hallo,

danke für die "Wegbereitung".
Ich habe die Fühler nun parallel geschaltet und den von uwfed vorgeschlagenen Sketch mit den zuvor ausgelesenen Adressen der beiden DS18S20 umgesetzt.
Leider bekomme ich die Werte der beiden Fühler in Fahrenheit anstatt in °Celsius.
Muss man hier noch so etwas wie eine Umrechnungsformel mit einsetzen?
Anbei der Sketch:
Code:
#include <OneWire.h>
#include <DallasTemperature.h>

OneWire  ds(28); //pin für ds1820

//DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben. (loop anpassen)
DeviceAddress sensor1 = { 0x28, 0x36, 0x2F, 0x99, 0x4, 0x0, 0x0, 0x3A };
DeviceAddress sensor2 = { 0x28, 0xB1, 0xB7, 0xBD, 0x4, 0x0, 0x0, 0xA2 };


char sensor1Name[] = "Unterschrank: ";
char sensor2Name[] = "W.-Temp: ";


void setup(void)
{
  Serial.begin(9600);
}

void writeTimeToScratchpad(byte* address)
{
  //reset the bus
  ds.reset();
  //select our sensor
  ds.select(address);
  //CONVERT T function call (44h) which puts the temperature into the scratchpad
  ds.write(0x44,1);
  //sleep a second for the write to take place
  delay(1000);
}

void readTimeFromScratchpad(byte* address, byte* data)
{
  //reset the bus
  ds.reset();
  //select our sensor
  ds.select(address);
  //read the scratchpad (BEh)
  ds.write(0xBE);
  for (byte i=0;i<9;i++){
    data[i] = ds.read();
  }
}

float getTemperature(byte* address)
{
  int tr;
  byte data[12];

  writeTimeToScratchpad(address);

  readTimeFromScratchpad(address,data);

  //put in temp all the 8 bits of LSB (least significant byte)
  tr = data[0];

  //check for negative temperature
  if (data[1] > 0x80)
  {
    tr = !tr + 1; //two's complement adjustment
    tr = tr * -1; //flip value negative.
  }

  //COUNT PER Celsius degree (10h)
  int cpc = data[7];
  //COUNT REMAIN (0Ch)
  int cr = data[6];

  //drop bit 0
  tr = tr >> 1;

  return tr - (float)0.25 + (cpc - cr)/(float)cpc;
}

void loop(void)
{
  float temp1 = getTemperature(sensor1);
  float temp2 = getTemperature(sensor2);


  Serial.print(sensor1Name);
  Serial.print(temp1);
  Serial.println(" Celsius");

  Serial.print(sensor2Name);
  Serial.print(temp2);
  Serial.println(" Celsius");


  Serial.println();
  delay(1000);
}


Gruß Jens
7  International / Deutsch / Temperaturmessung mit mehreren DS18S20 on: April 24, 2013, 08:47:21 pm
Hallo,
ich möchte gerne mit meinem Mega 2560 + 16x2 Display und zwei DS18S20 zwei Temperaturen messen. Ein DS18S20 soll die Temperatur in meinem Aquarium messen und der andere die Temperatur im Unterschrank.
Die Temperatur im Aquarium messe ich bereits mit nachfolgenden Sketch. Nun soll ein weiterer DS18S20 mit eingebunden werden und zur Anzeige gebracht werden. So wie in etwa ein Innen- und Außenthermometer.
Z.Z. habe ich den einen DS18S20 wie im Bild dargestellt angeschlossen.

Code:
#include <LiquidCrystal.h>
#include "Wire.h"
#include <OneWire.h>
#define DS1307_I2C_ADDRESS 0x68  // This is the I2C address
// Arduino version compatibility Pre-Compiler Directives
#if defined(ARDUINO) && ARDUINO >= 100   // Arduino v1.0 and newer
  #define I2C_WRITE Wire.write
  #define I2C_READ Wire.read
#else                                   
  #define I2C_WRITE Wire.send
  #define I2C_READ Wire.receive
#endif

// Initialisierung des LCD
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);
OneWire  ds(28);

// Globale Variablen
byte i;
byte present = 0;
byte data[12];
byte addr[8];
float Temp;
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
int u, j, k = 0;
//float temp_in, temp_out;
byte zero;
char  *Day[] = {"","So","Mo","Di","Mi","Do","Fr","Sa"};
char  *Mon[] = {"","Jan.","Feb.","Mar.","Apr.","Mai.","Jun.","Jul.","Aug.","Sep.","Okt.","Nov.","Dez."};
 
// Wandelt BCD-Werte in Dezimalwerte um
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}
 
// Daten von RTC erhalten
void getDateDs1307()
{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  I2C_WRITE(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
}
 
void setup()
{
 
// Start des IIC-Modi
  Wire.begin();


};
 
void loop()
{
// Ausgabe von Datum und Uhrzeit inkl. Abfrageroutine der IIC-RTC
while(u <= 10)//die Zeit für der Anzeigendauer

  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  I2C_WRITE(zero);
  Wire.endTransmission();
 
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
 
// Maskierung der Bits vom RTC-Modul
  second     = bcdToDec(I2C_READ() & 0x7f);
  minute     = bcdToDec(I2C_READ());
  hour       = bcdToDec(I2C_READ() & 0x3f);  // Need to change this if 12 hour am/pm
  dayOfWeek  = bcdToDec(I2C_READ());
  dayOfMonth = bcdToDec(I2C_READ());
  month      = bcdToDec(I2C_READ());
  year       = bcdToDec(I2C_READ());

// Ausgabe des Datums im Format DD,_dd._mmm._'yy
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(Day[dayOfWeek]);
  lcd.print(", ");
  if (dayOfMonth < 10)
    lcd.print("0");
  lcd.print(dayOfMonth, DEC);
  lcd.print(".");
  lcd.print(" ");
  lcd.print(Mon[month]);
  lcd.print(" '");
  lcd.println(year, DEC);


// Ausgabe der Uhrzeit im Format hh:mm:ss
  lcd.setCursor(4, 1);
  if (hour < 10)
     lcd.print("0");
  lcd.print(hour, DEC);
  lcd.print(":");
  if (minute < 10)
    lcd.print("0");
  lcd.print(minute, DEC);
  lcd.print(":");
  if (second < 10)
    lcd.print("0");
  lcd.print(second, DEC);
  lcd.print("  ");
  lcd.noCursor();
  u++;
  delay(500);
  j = 0;
  k = 0;
};

while(j <= 10)
{



  // display Sensor data on LCD:
  if ( !ds.search(addr)) {
    // No more Dallas chips present:
    Serial.print("No more addresses.\n");
    ds.reset_search();
    //delay(250);
    //return;
     // Check for family code which is not DS18B20:
  if ( addr[0] != 0x28) {
    Serial.print("Device is not a DS18B20 family device.\n");
    return;
   
  }
  // The DallasTemperature library can do all this work for you!
  ds.reset();
  ds.select(addr);
  ds.write(0x44,0);          // start conversion, with parasite power off
   present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);             // Read Scratchpad 
  // Check whether chip is present:
  present = ds.reset();
  ds.select(addr);   
  ds.write(0xBE);             // Read Scratchpad
 
   Serial.print("P=");         // Present = 1
  Serial.print(present,HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {   // we need 9 bytes of data
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
   Serial.print(" CRC=");
  Serial.print( OneWire::crc8( data, 8), HEX);
  // Calculate temperature. data[1] High Byte, data[0] Low Byte.
  Temp =  ((data[1] << 8) + data[0] ) * 0.0625;  // 12Bit = 0,0625 C per Bit
  Serial.print( " T=");
  Serial.print( Temp, 2);
  Serial.print( " C");
  Serial.println();
  }
  char line[17];
lcd.clear();
  lcd.setCursor(0,0);
  //sprintf(line, "T=%f C", Temp); funktioniert nicht, Fehler in Compiler?
  dtostrf(Temp, 5, 2, line);
  lcd.print("T=");
  lcd.print(line);
  lcd.print(" C");
j++;
delay(500);
  u = 0;
  };
}

Meine Frage wäre nun, wie binde ich einen zweiten DS18S20 in die Schaltung und in den Sketch ein?

Danke.
Gruß Jens

8  International / Deutsch / Re: Dosierpumpensteuerung on: February 07, 2013, 05:16:24 pm
Hallo Uwe,

Quote
Wenn Du die Schaltzeiten bereits in Sekunden umrechnest dann ist der Sketch schneller.

Was macht das in etwa aus oder ist es vernachlässigbar?

Gruß Jens
9  International / Deutsch / Re: Dosierpumpensteuerung on: February 07, 2013, 05:11:14 pm
Danke, nicht der Uwe  smiley-cool
Funktioniert.
Gruß Jens
10  International / Deutsch / Re: Dosierpumpensteuerung on: February 07, 2013, 04:38:06 pm
Hallo Uwe,

das sieht nicht nur gut aus, sondern funktioniert bestens. Danke dafür.
Ich hatte ehrlich gesagt nicht darüber nachgedacht, einfach den Wert in Sekunden einzusetzen anstelle der Uhrzeit.
Ich wollte es mir nur einfacher machen, indem ich anstelle der Rechnerei von Sekunden zur Uhrzeit einfach die Uhrzeit selbst eingebe.
Kann man trotzdem den Sketch so anpassen, dass ich die Uhrzeit mit Sekunden als Schaltzeit einsetzen kann?
In etwa so:

Code:
// Schaltzeiten-----------------
  if ((time >= 10*HOUR+30*MINUTE+00SECOND)&&(time < 10*HOUR+30*MINUTE+05SECOND))    //Schaltet die LED-Stripe weiß ein
digitalWrite(LEDst, HIGH);
  else digitalWrite(LEDst, LOW);

Gruß Jens
11  International / Deutsch / Dosierpumpensteuerung on: February 06, 2013, 04:17:48 pm
Hallo,
ich arbeite an einem Projekt, welches die digitalen Ausgänge meines Arduino Mega 2560 per Uhrzeit schaltet. Ich habe den Sketch so weit umgesetzt, vielleicht aber nicht ganz so elegant gelöst.
Es werden mit den Ausgängen per Optokoppler Relais angesteuert, die dann die einzelnen Steckdosen einer Steckdosenleiste und Dosierpumpen ein-und ausschalten.
Ich habe so etwas schon einmal für meinen Aquaristik-Computer gebaut und diese schon seit 1 1/2 Jahre ohne Probleme im Einsatz.

Das Problem sind nicht die Steckdosenleisten, sondern die Dosierpumpen der Dosieranlage.
Um eine bestimmte Flüssigkeitsmenge dosieren zu können, benötige ich eine Laufzeit im Sekundenbereich. Die Pumpen geben z.B. bei einer Laufzeit von 5 Sekunden eine Flüssigkeitsmenge von ca. 5ml ab.
Leider sind die Ein- und Ausschaltzeiten im Minutenbereich begrenzt. Ich kann also nur z.B. eine Steckdose um 10:30 Uhr ein- und um 18:15 Uhr wieder ausschalten. Ich brauche aber für die Dosierpumpen eine Ein- und Ausschaltzeit wie z.B. (10:30:00 Uhr ein+10:30:05 aus), so dass mit der Laufzeit von 5 Sekunden ab 10:30 Uhr eine Flüssigkeitsmenge von 5ml abgegeben wird.
Ich versuche seit ca. einer Woche, allabendlich eine Lösung zu finden und komme einfach nicht weiter.
Vielleicht hat jemand eine Idee oder so etwas ähnliches schon mal gelöst.
Anbei der Sketch:

Code:
#include "Wire.h"
#define DS1307_ADDRESS 0x68  // Die I2C-Adresse
#include <RTClib.h>

//Beleuchtung---------------
const int LEDst = 37;  //LED-Stripe weiß
const int LEDrgb = 39; //LED-Stripe RGB

 //Mini-USB-Ausgang 1 ---------------
const int MUA1 = 53;     //Strömungspumpe 1
const int MUA2 = 52;     //Strömungspumpe 2
const int MUA3 = 51;     //Heizung
const int MUA4 = 50;     //Abschäumer

//Mini-USB-Ausgang 2 ---------------
const int MUA5 = 49;     //Licht Technikbecken
const int MUA6 = 48;     //Licht Kranzbeleuchtung
const int MUA7 = 47;     //Pumpe für Hydor Flo Kreisel
const int MUA8 = 38;     //Frei

//Mini-USB-Ausgang 3 ---------------
const int DA1 = 40;     //Dosieranlage 1
const int DA2 = 41;     //Dosieranlage 2
const int DA3 = 42;     //Dosieranlage 3
const int DA4 = 43;     //Dosieranlage 4

const unsigned long HOUR = 60 * 60;
const unsigned long MINUTE = 60;
const unsigned long SECOND = 60;.
RTC_DS1307 RTC;
DateTime now;

const char LOGFORMAT[] = "%02u.%02u.%04u     %02u:%02u:%02u";
char RTCpuffer[16];     // der Wert des RTCpuffer muss gross genug sein, dass alle Zeichen reinpassen!!

void setup()
{
  pinMode(LEDrgb, OUTPUT);
  pinMode(LEDst, OUTPUT);
  pinMode(MUA1, OUTPUT);
  pinMode(MUA2, OUTPUT);
  pinMode(MUA3, OUTPUT);
  pinMode(MUA4, OUTPUT);
  pinMode(MUA5, OUTPUT);
  pinMode(MUA6, OUTPUT);
  pinMode(MUA7, OUTPUT);
  pinMode(MUA8, OUTPUT);
  pinMode(DA1, OUTPUT);
  pinMode(DA2, OUTPUT);
  pinMode(DA3, OUTPUT);
  pinMode(DA4, OUTPUT);
 
  Serial.begin(9600); //Einschalter Übertragung zum Serial-Monitor
  Wire.begin();
 
 RTC.begin();

}

byte bcdToDec(byte val)  {
// Konvertieren des binär Code zu Dezimalzahlen
  return ( (val/16*10) + (val%16) );
}

void loop()
{

   now=RTC.now();
  /////  Bekommt die Zeit vom RTC in RTCHour, RTCMinute, RTCSecond

   // Stellt den Register Pointer auf 0 (Sekunden)
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write((byte)0);
  Wire.endTransmission();

  //  Liest Sekunde, Minute und Stunde aus
  Wire.requestFrom(DS1307_ADDRESS, 3);

  int RTCSecond = bcdToDec(Wire.read());
  int RTCMinute = bcdToDec(Wire.read());
  int RTCHour = bcdToDec(Wire.read() & 0b111111); //24 Stunden Zeit
 
// Schreibt die Zeit zum LCD XX: XX: XX
  if(RTCHour < 10) {
    Serial.print("0");
  }
Serial.print(RTCHour);
Serial.print(":");
  if(RTCMinute < 10) {
    Serial.print("0");
  }
Serial.print(RTCMinute);
Serial.print(":");
  if(RTCSecond < 10) {
    Serial.print("0");
  }
Serial.print(RTCSecond);

Serial.print("_UHR");

  unsigned long time = RTCHour * HOUR + RTCMinute * MINUTE + RTCSecond  ;  // Zeit in Sekunden
  Serial.println(RTCpuffer);

 //----------------------------------------BELEUCHTUNG---------------------------------------
 
 // Schaltzeiten-----------------
  if (time >= 10*HOUR+30*MINUTE)//Schaltet die LED-Stripe weiß ein
digitalWrite(LEDst, HIGH);
  if (time >= 21*HOUR+30*MINUTE)//Schaltet die LED-Stripe weiß aus
digitalWrite(LEDst, LOW);

if (time >= 10*HOUR+15*MINUTE)//Schaltet die LED-Stripe RGB ein
digitalWrite(LEDrgb, HIGH);
  if (time >= 23*HOUR+00*MINUTE)//Schaltet die LED-Stripe RGB aus
digitalWrite(LEDrgb, LOW);
}
   

Danke schon mal.

Gruß Jens
12  International / Deutsch / Re: Tochscreen-Display mit Menue-Steuerung on: August 26, 2012, 02:52:46 pm
Hallo 2curious,
danke für deinen Beitrag. Es hilft Einsteigern wie uns durch die Erklärungen und die direkten praktischen Lösungen zu unseren Problemen, nach und nach das ganze zu Verstehen und zu Erlernen. Ich für meinen Teil habe an diesem Projekt eine ganze Menge gelernt.
Die Hilfestellung von pylon war super und die Menue-Steuerung auf meinem Touchscreen funktioniert. Nur leider kann man mit diesem Sketch nur nacheinander folgende Seiten/Menuepunkte abarbeiten. D.h. man startet mit der 1. Seite und bei einem "Touch" auf dem Display springt diese auf die nächste Seite/Auswahlseite(Menue), bis es dann je nach dem wie viel Seiten im Sketch eingestellt wurden, irgendwann wieder auf die 1. Seite zurück springt und alles beginnt von vorn.
Ich benötige aber die Möglichkeit, von der 1. Seite auf die nächste Seite zu springen, um von dort aus auf einen bestimmte Seite zu springen und wieder zurück zur vorherigen Seite oder zu der Auswahlseite nach der 1. Seite. Es ist also wie eine Baumstruktur oder auch Verzeichnisstruktur.
Ich habe das in dem Beitrag #14 mal als Zeichnung mit angehängt.
Leider bekomme ich von pylon z.Z. kein Reply mehr vielleicht ist er im Urlaub oder hat z.Z. keine Zeit.
Ich hoffe, es gibt hier im Forum noch andere die dazu noch etwas beitragen können.
Vielleicht gab es ja schon ein ähnliches Projekt. Nur ist es dann  immer so eine Sache in dem Projekt als Neuling einzusteigen, ohne Hilfestellung.
Quote
@Knippi für mein erstes Menue half mir dieser Link : http://sobisource.com/?p=143
Ich hoffe er kann auch dich inspirieren.
Das von dir gelinkte Projekt, ist eigentlich genau das richtige. Nur leider ist in dem Sketch noch soviel anderer "Schnickschnack", den ich wieder als Neuling nicht verstehe. Auch bin ich nicht so gut im Englischen.
Vielleicht gibt es hier ja jemand im Forum der nur diesen von mir beschriebenen Teil rausfiltern kann und mir dann noch ein wenig Hilfestellung geben kann. Auch wäre ich dankbar, wenn ich dann noch die ein oder andere Frage beantwortet bekomme um das ganze dann wieder zu verstehen.
Quote
ich bin selber Newbie hier und versuche mich gerade an einer ähnlichen Aufgabe wie du.
Nun aber nicht nur über mein Problem mit meinem Projekt gequatscht, was für ein ähnliches Projekt bis du am Basteln?

Gruß Jens
13  International / Deutsch / Re: Tochscreen-Display mit Menue-Steuerung on: August 19, 2012, 07:41:14 am
Hallo pylon,
das hat leider nicht funktioniert. Es startete zwar mit der Startseite, diese startete aber immer wieder neu und wiederholte sich ununterbrochen.
Ich habe nun ein paar Nächte herumprobiert und habe ein Ergebnis gefunden, dass so aussieht:
Code:
uint16_t buttonRect[MODE_COUNT][5] = {
  {
    0, 0, 239, 320       }
  ,
  {
    209, 80, 229, 100       }
  ,
  {
    140, 30, 200, 40       }
  ,
  {
    100, 30, 160, 40       }
};

void loop ()
{
  startseite();
  while (true)

    if (myTouch.dataAvailable()) {
      myTouch.read();
      x = myTouch.getX();
      y = myTouch.getY();
      if (x >= buttonRect[mode][0] && y >= buttonRect[mode][1] &&
        x <= buttonRect[mode][2] && y <= buttonRect[mode][3]) {
        mode = (mode + 1) % MODE_COUNT;
        //waitForIt(30, 80, 20); //Größe des roten Umrandung
      }


      if (mode == 0) {
        startseite();
      }
      else if (mode == 1) {
        menue();
      }
      else if (mode == 2) {
        setting();
      }
      else if (mode == 3) {
        testseite(); 

        delay(10);

      }
    }
}
Dieser Ablauf funktioniert auch, aber ich bin auf ein Problem gestoßen. Es sollte eine Menueführung  mit weiteren Untermenues geben, so das diese nicht alle nacheinander aufgerufen werden sollen. Bei dieser Version kann ich so wie ich es erkenne nur eine Seite nach der anderen Aufrufen. Quasi wie eine Kette, richtig?
Ich brauche aber einen teilweise direkten Aufruf einer Seite, die dann auch meinetwegen aufeinanderfolgende Untermenues(z.B. Timer 1-12) hat. Des halb habe ich in meinen anfänglichen Sketch versucht alle Seiten direkt über verschiedene Button zu Starten.  Ich habe mal die Struktur skizziert und als Bild mit angehängt.
Gruß Jens
14  International / Deutsch / Re: Tochscreen-Display mit Menue-Steuerung on: August 16, 2012, 02:46:10 pm
Nun habe ich noch ein wenig experimentiert und es gibt einen kleinen Fortschritt.
Mit dem nachfolgenden Sketch ergibt sich folgendes Ergebnis:
Als erstes startet ein leerer Bildschirm>drücke ich links/oben auf die angegeben Position dann springt das Display auf die "menue" Seite(schon mal gut smiley)>drücke ich dann wieder  links/oben, dann springt das Display auf die "setting" Seite(noch besser smiley-grin)>>drücke ich dann wieder  links/oben, dann springt das Display auf die "startseite" Seite zurück(juhu:smiley-mr-green:)>>drücke ich dann wieder  links/oben, dann springt das Display wieder auf die "menue" Seite(geschafft smiley-surprise)...
Alles soweit ganz gut, nur wird die Startseite nicht als erstes Angezeigt sondern eine leere Seite. smiley-twist
Code:
#include <ITDB02_Graph16.h>
#include <ITDB02_Touch.h>
#include <avr/pgmspace.h>
#define MODE_COUNT 3

// Schriftarten in Benutzung
extern uint8_t SmallFont[];
extern uint8_t Sinclair_S[];
extern uint8_t Sinclair_M[];
extern uint8_t BigFont[];


//Pinbelegung für das Display+Touchscreen
//myGLCD(RS,WR,CS,RST,ALE,mode);
ITDB02 myGLCD(A1,A2,A0,A3,A5,ITDB32S);
//myTouch(TCLK,TCS,DIN,DOUT,IRQ);
ITDB02_Touch  myTouch(13,10,11,12,A4);


int x, y;
int mode = 0;

void setup()
{
  myGLCD.InitLCD();
  myGLCD.clrScr();
  myGLCD.setFont(Sinclair_S);

  myTouch.InitTouch();
  myTouch.setPrecision(PREC_LOW);
}

 
  //zeichnet eine rote Umrandung, wenn der Button gedrückt wird
void waitForIt(int x1, int y1, int x2, int y2)
{
  myGLCD.setColor(255, 0, 0);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
  while (myTouch.dataAvailable())
    myTouch.read();
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
}
 
//Aufbau der Startseite
void startseite()

{
  myGLCD.setColor( 0, 0, 0);  //setzt die Farbe im Hintergrund
  myGLCD.fillRect(0, 0, 239, 320);  //setzt die Größe und Position des Hintergrundes
  myGLCD.setColor(255, 255, 255);  //setzt die Schriftfarbe
  myGLCD.setBackColor(0, 0, 237);  //setzt die hinterleget Farbe des Textes
  myGLCD.drawLine(0, 14, 239, 14); //setzt die Position und Länge der Linie
  myGLCD.setColor( 0, 0, 237);
 myGLCD.fillRect(0, 0, 239, 12);  //setzt die Größe und Position des Hintergrundes
  myGLCD.setColor(255, 255, 255);
  myGLCD.print("Startseite by Knippi", CENTER, 3);
  myGLCD.setBackColor(0, 0, 0);
   myGLCD.setFont(Sinclair_M);
  myGLCD.print("Startseite", CENTER, 30);
   myGLCD.setFont(Sinclair_S);
    myGLCD.setBackColor(0, 0, 237);  //setzt die hinterleget Farbe des Textes
  myGLCD.print("Touch screen to continue", CENTER, 305);
   myGLCD.setBackColor(0, 0, 0);  //setzt die hinterleget Farbe des Textes
   myGLCD.print("jens.knipphals@gmx.de", CENTER, 290);
 
}
   
   //Aufbau der Menueseite
void menue()
{
  myGLCD.setColor( 0, 0, 0);  //setzt die Farbe im Hintergrund
  myGLCD.fillRect(0, 0, 239, 320);  //setzt die Größe und Position des Hintergrundes
  //myGLCD.setColor(255, 255, 255);  //setzt die Schriftfarbe
  myGLCD.setBackColor(255, 255, 0);  //setzt die hinterleget Farbe des Textes
  myGLCD.drawLine(0, 14, 239, 14); //setzt die Position und Länge der Linie
  myGLCD.setColor( 255, 255, 0);     //setzt die Farbe des Farbbalkens oben
 myGLCD.fillRect(0, 0, 239, 13);  //setzt die Größe und Position des Hintergrundes des Balkens oben
  myGLCD.setColor(0, 0, 0);       //setzt die Schriftfarbe für den nachfolgenden Text
  myGLCD.print("Menue", CENTER, 3);
  myGLCD.setBackColor(0, 0, 0);   //setzt die Schriftfarbe für den nachfolgenden Texte
   myGLCD.setFont(Sinclair_M);
    myGLCD.setColor(255, 255, 255);
  myGLCD.print("Menue", CENTER, 30);
   myGLCD.setFont(Sinclair_S);
   /* myGLCD.setBackColor(0, 0, 237);  //setzt die hinterleget Farbe des Textes
  myGLCD.print("Touch screen to continue", CENTER, 305);*/
   myGLCD.setBackColor(0, 0, 0);  //setzt die hinterleget Farbe des Textes
   myGLCD.print("jens.knipphals@gmx.de", CENTER, 290);
   //waitForTouch();
      myGLCD.setColor(0, 0, 255);
    myGLCD.fillRoundRect (10, 60, 60, 10);
    myGLCD.setColor(255, 255, 255);
    myGLCD.drawRoundRect (10, 60, 60, 10);
     myGLCD.setColor(0, 0, 255);
    myGLCD.fillRoundRect (60, 130, 10, 80);
    myGLCD.setColor(255, 255, 255);
    myGLCD.drawRoundRect (60, 130, 10, 80);
}
   
    //Aufbau der Settingseite
void setting()

{
  myGLCD.setColor( 0, 0, 0);  //setzt die Farbe im Hintergrund
  myGLCD.fillRect(0, 0, 239, 320);  //setzt die Größe und Position des Hintergrundes
  myGLCD.setColor(255, 255, 255);  //setzt die Schriftfarbe
  myGLCD.setBackColor(255, 0, 0);  //setzt die hinterleget Farbe des Textes
  myGLCD.drawLine(0, 14, 239, 14); //setzt die Position und Länge der Linie
  myGLCD.setColor( 255, 0, 0);     //setzt die Farbe des Farbbalkens oben
 myGLCD.fillRect(0, 0, 239, 12);  //setzt die Größe und Position des Hintergrundes des Balkens oben
  myGLCD.setColor(255, 255, 255);
  myGLCD.print("Einstellungen", CENTER, 3);
  myGLCD.setBackColor(0, 0, 0);
   myGLCD.setFont(Sinclair_M);
  myGLCD.print("Einstellungen", CENTER, 30);
   myGLCD.setFont(Sinclair_S);
  /*  myGLCD.setBackColor(0, 0, 237);  //setzt die hinterleget Farbe des Textes
  myGLCD.print("Touch screen to continue", CENTER, 305);*/
   myGLCD.setBackColor(0, 0, 0);  //setzt die hinterleget Farbe des Textes
   myGLCD.print("jens.knipphals@gmx.de", CENTER, 290);
   //waitForTouch();
     myGLCD.setColor(0, 0, 255);
    myGLCD.fillRoundRect (10, 60, 60, 10);
    myGLCD.setColor(255, 255, 255);
    myGLCD.drawRoundRect (10, 60, 60, 10);
}
   
    void loop ()
{
 
 if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
     
      if ((y>=10) && (y<=60))  // vertikaler Abstand (von oben)
      {        if ((x>=179) && (x<=239))  // horizontaler Abstand (von rechts)
       
          waitForIt(10, 10, 60, 60); //Größe des roten Umrandung
 
   mode = (mode + 1) % MODE_COUNT;
 }
 
 
  if (mode == 0) {
  startseite();
} else if (mode == 1) {
  menue();
} else if (mode == 2) {
  setting();


}}}
Gruß Jens
15  International / Deutsch / Re: Tochscreen-Display mit Menue-Steuerung on: August 16, 2012, 01:46:02 pm
Hallo pylon,
es will einfach nicht. Ich habe beides ausprobiert. Ich beschreibe es einmal:
Die Startseite wird angezeigt>drücke ich auf das Display>springt das Display wieder auf die Startseite.
Gruß Jens
Pages: [1] 2 3