ich habe einen Arduino Uno und möchte diesen so programmieren, dass ich 3 Temperatursensoren in einem Raum verteilt habe und diese die Durchschnittstemperatur ermitteln. Auf einem LCD sollte dann die gemessene Temperatur stehen und darunter eine Temperatur die ich per Tastendruck einstellen kann, um eine Heizung zu steuern. Habe schon viel gelesen wie man es programmieren könnte, nur habe ich bis jetzt in C programmiert und damit auch noch nicht sehr viel.
ich vermisse ein wenig eine konkrete Frage. Wie stellst Du Dir denn die Hilfe aus dem Forum vor?
Geht es Dir darum, welche Sensoren empfohlen werden oder welches Display? Willst Du wissen, wie diese dann vom Arduino aus angesprochen werden?
Wenn Du schon viel gelesen hast, versuch doch einfach mal einen dieser Lösungswege und wenn Du konkret zu einem Problem kommst, beschreib Dein Problem und die Hardware die Du verwendest, zeig uns den Sketch, den Du bis dahin geschrieben hast und sag uns wo und warum Du nicht weiter kommst. Sicherlich kann Dir dann jemand helfen.
Wenn Du bisher in C programmiert hast, ist das doch gut, der Arduino wird auch in C programmiert.
Also, gib uns ein paar Infos mehr, dann wird Dir sicherlich geholfen.
Also zur Hardware habe ich bis jetzt:
1 Stk. Arduino Uno
1 Stk. Saint Smart LCD Keypad Shield
3 Stk. EBM Papst Lüfter 12v 1A und 225m3/h
3 Stk. I²C Temperatur-Modul mit Analogausgang 0 - 5 V
Die 3 Lüfter werden über Transistoren geschalten die der Arduino über 3 Pins schalten soll.
Das Programm habe ich mit Atmel Studio geschrieben.
Im Internet bin ich immer auf den I2C Bus gestoßen deswegen auch dieser Sensor. Im unteren Programm habe ich den LCD und die Tasten aber über den ADC angesprochen, nur weiß ich nicht wie das mit dem I2C Bus funktioniert. Bzw. ich weiß das der I2C 2 Leitungen besitzt die SDA (Datenleitung) und die SCL (Die Taktleitung)
void SetSollWert();
void LcdAusgabe(int istWert, int sollWert);
int m_SollWert = 20; //start sollwert 20°C
int m_IstWert = 0; //start istwert 0°C wird ausgelesen
int main(void)
{
lcd_init(); //initilisiert LCD
ADC_init(); //initilisiert ADC
while(1)
{
SetSollWert(); //abfrage der knöpfe (nach bedarf wird der sollwert gesetzt und der LCD aktualisiert)
}
}
void LcdAusgabe(int istWert, int sollWert)
{
lcd_clear();
lcd_setcursor(0,0); //setzt den curser auf position null
lcd_string("IST Temp.: "); //text wird auf LCD angezeigt
lcd_string((char*)istWert); //wandelt den integer in einen string um und schreibt diesen auf den LCD
lcd_string(" °C"); //setzt die einheit nach den gemessenen wert (IST Temp.: WERT °C)
lcd_setcursor(0,1); //setzt den curser in die zweite zeile auf position null
lcd_string("SOLL Temp.: "); //text wird auf LCD angezeigt
lcd_string((char*)sollWert); //wandelt den integer in einen string um und schreibt diesen auf den LCD
lcd_string(" °C"); //setzt die einheit nach den gemessenen wert (SOLL Temp.: WERT °C)
}
void SetSollWert()
{
unsigned int eingabeTaste = 0; //variable in der der eingabewert gespeichert wird
eingabeTaste = ADC_read(0); //auslesen der eingabe
if(eingabeTaste == 40) //wenn taste "oben" gedrückt worden ist wird der sollwert um 1 erhöht und der LCD aktualisiert
{
m_SollWert = m_SollWert + 1;
LcdAusgabe(m_IstWert, m_SollWert);
}
else if(eingabeTaste == 17) //wenn taste "unten" gedrückt worden ist wird der sollwert um 1 reduziert und der LCD aktualisiert
{
m_SollWert = m_SollWert - 1;
LcdAusgabe(m_IstWert, m_SollWert);
}
}
8newbi:
3 Stk. I²C Temperatur-Modul mit Analogausgang 0 - 5 V
Hallo,
schreib bitte nochmal, was das genau für ein Modul ist, evtl. mit Link, damit ich mal ins Datenblatt sehen kann. Komme aber erst heute abend dazu, wahrscheinlich hast Du bis dahin schon Deine Antwort
Das sieht so als ob du AVR Studio verwendest und gar nicht die Arduino Software. Kann man machen, aber dann gehen die Standard Arduino Libs wohl nicht.
Wenn du AVR Studio hast kannst du hiermit aber auch bequem Arduino programmieren und musst dich nicht mehr der primitiven Arduino "IDE" herumärgern: http://www.visualmicro.com/
Allerdings scheint "I2C mit Analogausgang" was anderes zu sein. Macht aber auch nicht viel Sinn. Entweder ist etwas analog oder digital. Wenn man I2C hat braucht man keinen Analogausgang mehr
Mein LCD "ist ja nicht I2C fähig". Ist es besser wenn ich mir einen LCD besorge de I2C fähig ist und dann die Sensoren, Einstellknöpfe und den LCD mit I2C anspreche?
Ich habe eine Library gefunden für den I2C nur wie wird dieser programmiert? Bin mir sicher das es eigentlich ganz einfach ist nur habe ich gerade einen kompletten hänger.
EDIT:
Die Libs oben gehen NICHT für deinen Sensor. Du musst das per Hand machen.
Du solltest mal sagen mit was du programmierst. Weil der Code ist nicht von der Arduino Software. In Arduino gibt es für I2C die Wire Lib. Die erledigt schon den ganzen Kram mit "Start Condition" und "End Condition" für dich. RTC Libs sind da ein guter Anhaltspunkt wie man Daten liest und schreibt.
Der Sensor hat die Adresse 0x78. Dann gibt es zwei Addressen 0 und 1 auf den man die zwei Bytes lesen kann. Also Wire.beginTransmission(0x78) machen. Adresse schicken. Wire.endTransmission() machen. Wire.requestFrom() machen. Und dann Wire.read().
Ob die Adresse automatisch inkrementiert und man zweimal hintereinander read() machen kann steht nicht dabei. Muss man ausprobieren.
Wie gesagt, schau dir mal eine DS1307 Lib an. Da wird das ersichtlich. Das ist aber eben für die Arduino Software.
Der Sensor macht anscheinend I2C und analog. Braucht aber mindestens 6V Betriebsspannung. Nicht so toll. Aber du könntest 9V von einem Netzteil hinlegen und damit auch den Arduino versorgen.
Mit einem DS18B20 wärst du besser bedient gewesen. Viel einfacher zu handhaben. Gerade von der Software her. Lässt sich aber auch so machen.
Durch die feste I2C Adresse der Module kannst Du auch nur EINES davon an einem I2C betreiben. Wenn Du 3 davon einsetzen willst, geht das nicht so ohne weiteres.
@Serenifly: so weit ich das Datenblatt verstanden habe, ticken die Dinger etwas anders. Du musst die Adresse nicht inkrementieren (was auch nicht ratsam wäre ;-), sondern der Sensor liefert von sich aus 2 Bytes, die Du auslesen kannst / musst.
wenn Du den I²C-Bus vermeiden willst, kannst Du ja auch einfach Pin 5 Deines Moduls an einen analogen Input legen (hier A1). Der Pseudocode zum Abfragen der Temperatur könnte dann so aussehen:
const int temperaturSensorPin = A1;
const int maxTemperatur = 96; // evtl. ändern, je nach Modul
int gelesen = 0;
int temperatur;
/* .
.
.
. */
gelesen = analogRead(temperaturSensorPin);
temperatur = map(gelesen, 0, 1023, -32, maxTemperatur);
Auf jeden Fall hättest Du dann nicht nur eine Adresse, die Du auslesen kannst, kannst also auch mehrere Module verwenden. Statt A1 musst Du halt den verwendeten Pin angeben.
Ok, da hatte ich mich etwas falsch ausgedrückt. Ich meinte nicht die Adresse des Sensors, sondern die Adresse der Daten. Also 0 oder 1. Normalerweise schickt man bei I2C Devices mit mehreren Registern nach der Device Adresse die Adresse des Registers das man auslesen will.