Pages: [1] 2   Go Down
Author Topic: Auf SD-Karte registrierende Waage  (Read 1868 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,  
Nach dem ich in einem anderen Forum leider keine Reaktion erzielt habe,
möchte ich nichts unversucht lassen und frage auch mal hier.

Als Neuling mit dem Arduino möchte ich mein Wunschprojekt kurz beschreiben.
Mit diesen Hardware Komponenten,

http://www.play-zone.ch/de/digitale-waage-mit-hx711-adc-bis-3kg.html

http://www.play-zone.ch/de/elektronik-kit-zubehoer/avr-arduino-freeduino/arduino-sets-bundles/arduino-uno-atmega328p-pu-mit-protoshield-v5-kompat-board.html

http://www.play-zone.ch/de/snootlab-memoire-kit.html


möchte ich eine Waage realisieren, die bei einer spontanen Gewichtsänderung von plus oder minus X Gramm, (z.B. 30 Gramm)
mit Datum und Uhrzeit das aktuelle Gewicht auf der SD-Karte protokolliert.

Zu jeder Komponente gibt es schon eine Sketch-Datei. >> auf den html-Seiten der Links
Wie ich die Sketche miteinander "verheirate" ....... ist für mich leider noch ein Problem.
Wer weiß das?  
Ich hoffe hier auf Versändnis für meine Frage.

Gruß, Apus^²
« Last Edit: January 30, 2013, 06:42:03 am by Apus_Apus » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2718
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zu jeder Komponente gibt es schon eine Sketch-Datei.
Wie ich die Sketche miteinander "verheirate" ....... ist für mich leider noch ein Problem.
Wer weiß das? 
Ich hoffe hier auf Versändnis für meine Frage.

Verständnis schon, bin aber zu faul alles durchzuarbeiten.
1. alle setups in ein gemeinsames setup
2. alle loops() in ein gemeinsames loop ( oder als Unterfunktionen realisieren )
3. Pin - Doppelbelegungen klären, anpassen.
4. jetzt könnten wieder alle Teile für sich laufen : Test
5. Zusätzlich zu Serial.print() die Einzel-Ergebnisse als Eingabe für nen anderen Teil programmieren
6. Alles verstehen und neu schreiben. smiley-wink

Einen fertigen Sketch hochzuladen ist erst Stufe 0:
  - praktisch um zu sehen, dass die Hardware eigentlich in Ordnung ist, eine Anregung wie sie verwendet werden könnte, aber nicht mehr.

Konkrete Fragen kriegen auch konkretere Antworten.

Viel Spass smiley-wink
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2433
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mit diesen Hardware Komponenten,

Von den drei angegebenen Links funktioniert nur der unterste.
Die zuerst genannte Komponente kann ich raten.
Bei der mittleren habe ich keine Idee, was es sein soll.

Zu jeder Komponente gibt es schon eine Sketch-Datei. >> auf den html-Seiten der Links
Wie ich die Sketche miteinander "verheirate" ....... ist für mich leider noch ein Problem.
Wer weiß das? 

Am Ende mußt Du alles in einem Sketch zusammenführen, der die genannte Funktionalität bereitstellt.

Programmierkenntnisse in den Sprachen C oder C++ sind von großem Vorteil, wenn man so etwas machen möchte: Variablendeklaration und Gültigkeitsbereiche von Variablen, Datentypen, If-Bedingungen, Programmschleifen mit for und while, Funktionen schreiben, Funktionsparameter und Rückgabewerte.

Eben mindestens Grundkenntnisse in der zugrundeliegenden Programmiersprache.

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo jurs,

es gibt auf Deine skeptische Einschätzung etwas erfreuliches zu berichten.
Sicher habe ich als Anfänger  mit C++ etwas hoch gegriffen, aber inzwischen läuft einiges.

Ok, an eine Ampelschaltung, habe ich auch mal realisiert.  smiley-small
Der Key-Test auf mit dem LCD KeyPach Shield läuft auch.
Etwas genauer musste ich hinschauen, bis ich auch die Waage zum Wiegen gebracht habe.  smiley-grin

Beim Kauf der Komponenten, wurde ich etwas auf die falsche Spur gesetzt,
denn mir wurde versichert, dass das LCD Keypad-Shield problemlos auch für die Waage einzusetzen ist.
Meine Vermutung, dass ich mit dem normalen LCD-Display keine Probleme bekommen hätte,
war durchaus stimmig.
Hier hätte einer der erfahrenen Arduino-KENNER sich den Code "LiquidCristalScale"  genau ansehen müssen und mit der Hardware vergleichen und hätte das Wettrennen zur Lösung locker vor mir gewinnen können.
Letztendlich war es sehr einfach.

Das steht im originalen Code:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Hx711 scale(A1, A0);


Das ist nun meine Legende im Sketch

Code:
// #A1 & #A0 is shiftet, #A0 is used for the key function
// the colours of the cabel for "SCALE ONE"  = S1 are
// Hx711.SCK    -  pin #A1   >S1>  white
// Hx711.DOUT -  pin #A2   >S1>  orange   
// Hx711 Vcc       PIN 5V     >S1>  red           
// Hx711 GND      PIN GND  >S1>  brown   

// LCD.RS - pin 8
// LCD.En - pin 9
// the order of these four pins are changed too.
// LCD.D4 - pin 4
// LCD.D5 - pin 5
// LCD.D6 - pin 6
// LCD.D7 - pin 7

Mit dieser Einstellung habe ich es dann probiert und es funktioniert. smiley-wink

Code:
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Hx711 scale(A2, A1);

Die Waage ist erstaunlich genau.
Mit jedem Einschalten kalibriert sie sich auf "Null", ein Reset bewirkt eine Tara-Funktion zum Dazuwiegen. Über Nacht blieb die Anzeige von 499 Gramm stabil.

Wer mit dem vorgegebenen Max-Gewicht von 3 kg zurecht kommt, hat auch noch bis 4 kg Reserve,
ohne dass sich der Nullpunkt nach der Mehrbelastung verändert.

Als nächsten Schritt, will ich die RTC auf dem  SD - Memorial Snootlab Memoire Kit (Data Logging Shield) einstellen und auf dem Display darstellen.
Für Vorschläge wäre ich schon jetzt dankbar, mache mich aber schon mal auf den Weg.  smiley-sweat

Ich muss nicht unbedingt wieder zuerst ankommen.  smiley-wink

Gruß, Apus²



* 2005 Gramm.jpg (253.98 KB, 1440x2560 - viewed 42 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@ Alle,

inzwischen habe ich die RTC auf dem Arduino UNO R3 zum Laufen gebracht. smiley

Mit einem Sketch kann ich die Uhr am PC-Monitor über COM1 stellen und die Zeit zur Anzeige bringen.
Dann habe ich den Sketch auch noch erweitert und zeige jetzt in der zweiten Zeile auch das Datum an.

Auf dem Arduino Mega läuft der selbe Sketch leider nicht. (???)

Beim Sketch der Waage habe ich eine Abfrage hinzugefügt mit der ich bei Gewichtsüberschreitung LEDs schalte.

Solch eine Entscheidung brauche ich später ähnlich, um das Speichern der Daten zu starten.

Gibt es hier im Forum jemanden, der im Rhein-Main-Gebiet zuhause ist?
Dann würde ich auch einen direkten Kontakt zum Informationsaustausch für sinvoll halten.

Gruß, Apus²
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2433
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Auf dem Arduino Mega läuft der selbe Sketch leider nicht. (???)

Die Pins für den I2C-Bus sind auf UNO und MEGA Boards unterschiedliche.

UNO  I2C: A4 (SDA), A5 (SCL)
MEGA I2C: 20 (SDA), 21 (SCL)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Auf dem Arduino Mega läuft der selbe Sketch leider nicht. (???)

Die Pins für den I2C-Bus sind auf UNO und MEGA Boards unterschiedliche.

UNO  I2C: A4 (SDA), A5 (SCL)
MEGA I2C: 20 (SDA), 21 (SCL)


Danke für die Antwort,

nachdem ich durch die Antwort den Grund kannte, was unter der Bemerkung ... "nur nach Modifikation " ... zu verstehen ist,
habe ich auch direkt diesen Link gefunden:
http://arduino.cc/en/Reference/Wire

Deshalb DANKE für den TIPP.

Gruß, Apus²

......... zu meinem WAAGE-Thema. Ich habe seit heute die größere Waage - Schale.
Mit 500gr habe ich getestet welcher Fehler beim Wiegen entsteht, wenn das Gewicht im Bereich von +/-10 cm an verschiedenen Stellen liegt.  Der Fehler bleibt bei maximal 0,2%  smiley-grin


* Meßfehler-der Waage.jpg (43.88 KB, 757x307 - viewed 23 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es macht einen Sinn, mal die bisherigen Etappen-Ziele zu meinem Projekt aufzulisten.

O   Zu der Logik des beabsichtigten Wiegevorganges habe ich ein funktionierenden Sketch.
      Über die Monitor-Funktion, lassen sich die Meßwerte auch erfassen.  [mit C&P etwas improvisiert]

O    Mit einem Sketch kann ich die aktuelle Uhrzeit und Datum über die Monitor-Funktion ausgeben

O  Für den Test der SD-Karte habe ich einen Sketch

Code:
Initializing SD card...
Card type: SDHC

Volume type is FAT32

Volume size (bytes): 3956801536
Volume size (Kbytes): 3864064
Volume size (Mbytes): 3773

Files found on the card (name, date and size in bytes):
DATALOG.TXT   2000-01-01 01:00:00 264

O  Zum anzeigen über die Monitor-Funktion und Speichern der Werte von A0 , A1 und A2 habe ich einen Sketch.

Code:
Initializing SD card...card initialized.
1023,495,1023
1023,511,1023
1023,531,1023
1023,547,1023
1023,559,1023
1023,582,1023
144,527,1023                  // Der erste Wert [i]144 [/i]steht für die Betätigung
144,511,1023                  // der UP-Key Taste am Keypad Shield.
144,484,1023                  // für insgesamt 4 Sekunden.
144,471,1023
144,449,1023
1023,497,

Damit habe ich alle Teilfunktionen als Beispiele zusammen, jetzt muss ich nur noch Verstehen, wie ich das in EINEM - Code organisieren muss.
Noch bleiben mir weiter 4 - maximal 6 Wochen, dann sollte die erste komplette Sketch-Fassung funktionsfähig sein.
Am 28/29 Januar 2013 habe ich erst mit C++ und Arduino angefangen.  smiley

Gestern habe ich den Versuch gemacht, das Kabel zwischen Hx711 ADC und Arduino mit einem Abgeschirmten Kabel auf 1,10m zu verlängern.
Es hat zwar die Werte zuerst etwas unstabiler gemacht, aber das habe ich jetzt im Sketch erfolgreich abgeändert.

Wegen des langen (dünnen) Kabel, habe ich vorsorglich direkt am ADC die Versorgungsspannung mit 1µF gestützt.
Leider habe ich privat noch kein OSZI um die Notwendigkeit nachzuweisen. Die Messwerte schienen mir dadurch aber etwas stabiler.
Das lange Kabel wird gebraucht, weil der Abstand Waage im Kasten vor dem Fenster und Arduino im Innenraum so groß sein muß.

Für mich war es wichtig, kleine gut dokumentierte Sketche zu finden, die ich als C++  Anfänger verstehen kann.
Das war eine mühsame Arbeit. Für den Brauchbaren Tipp, möchte ich mich auch nochmal bedanken.
Damit bekomme ich eventuell alles zusammen auch auf dem Arduino Mega zum laufen.

Die Pins für den I2C-Bus sind auf UNO und MEGA Boards unterschiedliche.

UNO   I2C: A4 (SDA), A5 (SCL)
MEGA I2C: 20 (SDA), 21 (SCL)



Inzwischen bin ich sogar übermütig und versuche auch noch einen Luftdruck Sensor zu integrieren.
http://www.adafruit.com/products/391
Dort gibt es inzwischen sogar den 5V Typ.

Jetzt muss ich noch ein  verständliches Beispiel finden, in dem ich erkenne, wie die Teilfunktionen zusammenzufassen sind.

WIEGEN + Datum > Speichern.      Ich darf wohl so direkt fragen, denn mit C++ habe ich erst 1.2.2013 angefangen.  smiley-grin

Um die ALU-Waagschale  im Kasten korrekt einzubauen , habe ich auch etwas Zeit gebraucht.
Noch sehe ich meinen Zeitplan nicht gefärdet. Mit etwas Hilfe wäre ich mir da aber sicherer. smiley-wink

Gruß, Apus²

Zu der Grafik:

Für den Test zum Wiegen, habe ich eine 9V Batterie zusammen mit einer 1,5V AA Zelle reingelegt und danach nur die 9V-Batt entnommen.
Erst  bei einer spontanen Gewichtsänderung von mehr als plus oder minus 35 Gramm soll ein neuer Wert registriert werden.
Erst die AA Zelle und dann die 9V Batterie geht genau so, wenn die AA Zelle drin bleibt.












* Zweite Messreihe.jpg (60.11 KB, 815x579 - viewed 20 times.)
« Last Edit: February 24, 2013, 05:16:12 pm by Apus_Apus » Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2433
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Jetzt muss ich noch ein  verständliches Beispiel finden, in dem ich erkenne, wie die Teilfunktionen zusammenzufassen sind.

WIEGEN + Datum > Speichern.

Am besten machst Du aus den drei funktionierenden loop-Funktionen jeweils eine eigene Unterfunktion. Bei nur drei Funktionen (wiegen, datum, speichern) kannst Du die von allen drei Programmteilen benötigten Variablen als "globale Variablen" am Anfang des Programms definieren, ohne dass dadurch das Programm zu unübersichtlich wird.

Beispiel Pseudo-Code:
Code:
// globale Variablen deklarieren
long gewicht; // z.B. Gewicht in Gramm
char[11] datum; // Datum als C-String (mit max. 10 Zeichen)
char[41] logline; // Zeile für das logfile auf SD-Karte (mit max. 40 Zeichen)

void setup()
{
  blablabla // hier alle notwendigen Initialisierungen zusammenfassen
}

void wiegen()  // war: im wesentlichen der loop-Code zum Wiegen aus dem Wiegen-Testprogramm
{
  blablabla  // Gewicht ermitteln;
  gewicht=xyz; // ermitteltes Gewicht in globale Variable "gewicht" packen
}

void datum() // war: im wesentlichen der loop-Code zum Auslesen des Datums im Datums-Testprogramm
{
  blablabla
  sprintf(datum,"%02d.%02d.%04d", ...); // ermitteltes Datum in globale Variable "datum" packen
}

void speichern() // war: im wesentlichen der loop-Code zum Speichern auf SD-Karte im SD-Testprogramm
{
  sprintf(logline, "%d %s", gewicht, datum); // ermittelte Werte in globale Variable "logline" zusammenpacken
  blablubb  // Und logline auf SD-Karte wegspeichern
}

void loop()  // alles zusammen
{
  wiegen();
  datum();
  speichern();
  delay(10000);
}

Damit würdest Du eine Wiegung alle 10 sec machen und loggen.

Für die von Dir ursprünglich gewünschte Logik mit Wiegung bei Gewichtsänderung ("bei einer spontanen Gewichtsänderung von plus oder minus X Gramm, (z.B. 30 Gramm) mit Datum und Uhrzeit das aktuelle Gewicht auf der SD-Karte protokolliert") müßte das in der loop-Logik natürlich ein wenig anders aussehen.

Und falls die Logik nun doch wieder ganz anders sein soll als von Dir ursprünglich genannt, sondern jetzt auf Tasten gedrückt werden soll, damit das Gewicht auf SD-Karte mitprotokolliert wird, dann muß in der loop-Logik auch was zur Tastenabfrage hinein.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo jurs,

erst mal Danke für die "notwendige Nachhilfe". smiley-wink

Die Beschreibung werde ich versuchen umzusetzen und mit der notwendigen Logik füllen.

Inzwischen versuche ich mit beiden DS18B20 Hex Adressen nur diese beiden Dallas Sensoren auszulesen.

ROM = 28 F5 73 AA 03 00 00 F2
ROM = 28 13 50 CA 03 00 00 4F

Sketche, die das können und noch viel mehr machen habe ich.

Die roten führenden Nullen sehe ich beim Test auf dem Display, aber am Monitor nicht.
 P = 1 A2 01 4B 46 7F FF E 10 D8  CRC=D8 T = 26.12 C
 P = 1 B3 01 4B 46 7F FF D 10 9A  CRC=9A T = 27.19 C

Bei den Hexzahlen der Messwerte LB HB   ist es genau so.

Die Minimal-Lösung, die nur die beiden Temperaturen am Monitor in  xx.xx °C anzeigt, bekomme ich nicht zusammen.
Ich scheitere schon daran die Hexadresse der Sensoren in die Abfrage zu übernehemen.
Der Faktor für die Umrechnung des Hex-Messwertes ist 0,0625 °C / bit   z.B.   Hex 0200 sind 32°C

Wer weiß wie das aussehen muss?


Gruß, Apus²



Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Temperatur - Messung mit DS 18B20

inzwischen habe ich einen Sketch, der sollte eigentlich funktionieren.
Ich habe nur die HEX Adressen angepasst und   // einige Kommentare und Erweiterungsmöglichkeiten entfernt.
Die Fehlermeldungen sind danach gleich geblieben.

Code:
  #include <Wire.h>
  #include <OneWire.h>
  #include <DallasTemperature.h>
  #include <LiquidCrystal.h>
// Data wire is plugged into pin 2 on the Arduino
      #define ONE_WIRE_BUS 2
//  #define TEMPERATURE_PRECISION 10
//  Setup a oneWire instance to communicate with any OneWire devices
      OneWire oneWire(ONE_WIRE_BUS);
//  Setup lcd
     LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Pass our oneWire reference to Dallas Temperature.
     DallasTemperature sensors(&oneWire);
// Assign the addresses of your 1-Wire temp sensors.
    DeviceAddress Probe001 = { 0x28, 0xF5, 0x73, 0xAA, 0x03, 0x00, 0x00, 0xF2 }; //ROM = 28 F5 73 AA 03 00 00 F2
    DeviceAddress Probe002 = { 0x28, 0x13, 0x50, 0xCA, 0x03, 0x00, 0x00, 0x4F }; //ROM = 28 13 50 CA 03 00 00 4F

void setup(void)
{
  // start lcd
  Wire.begin();
  lcd.begin(16, 4);
  // start serial port
  Serial.begin(9600);
  // Start up the library
  sensors.begin();
  // set the resolution to 10 bit (good enough?)
  sensors.setResolution(Probe001,10);
  sensors.setResolution(Probe002,10);
}
void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
  Serial.print("Error getting temperature");
}
else
{
  lcd.print("C: ");
  lcd.print(tempC);
  //Serial.print(” F: “);
  //Serial.print(DallasTemperature::toFahrenheit(tempC));
}
}
void loop(void)
{
  delay(2000);
  Serial.println();
  Serial.println();
  Serial.print("Getting temperatures \n\r");
  sensors.requestTemperatures();
  Serial.print("Probe 01 temperature is: ");
  printTemperature(Probe001);
  Serial.print("\n\r");
  Serial.print("Probe 02 temperature is: ");
  printTemperature(Probe002);
  Serial.print("\n\r");

Ich weiß nicht, wie ich diese Fehler deuten soll.  smiley-confuse

Code:
sketch_mar17a_Dallas18B20.cpp.o: In function `__static_initialization_and_destruction_0':
C:\Users\me\Arduino\arduino-1.0.3/sketch_mar17a_Dallas18B20.ino:13: undefined reference to `DallasTemperature::DallasTemperature(OneWire*)'
sketch_mar17a_Dallas18B20.cpp.o: In function `printTemperature(unsigned char*)':
C:\Users\me\Arduino\arduino-1.0.3/sketch_mar17a_Dallas18B20.ino:33: undefined reference to `DallasTemperature::getTempC(unsigned char*)'
sketch_mar17a_Dallas18B20.cpp.o: In function `loop':
C:\Users\me\Arduino\arduino-1.0.3/sketch_mar17a_Dallas18B20.ino:51: undefined reference to `DallasTemperature::requestTemperatures()'
sketch_mar17a_Dallas18B20.cpp.o: In function `setup':
C:\Users\me\Arduino\arduino-1.0.3/sketch_mar17a_Dallas18B20.ino:26: undefined reference to `DallasTemperature::begin()'
C:\Users\me\Arduino\arduino-1.0.3/sketch_mar17a_Dallas18B20.ino:28: undefined reference to `DallasTemperature::setResolution(unsigned char*, unsigned char)'
C:\Users\me\Arduino\arduino-1.0.3/sketch_mar17a_Dallas18B20.ino:29: undefined reference to `DallasTemperature::setResolution(unsigned char*, unsigned char)'

Was habe ich falsch gemacht oder übersehen?  Wer kann mir das erklären?

Gruß, Apus²
Logged

Wien
Offline Offline
Edison Member
*
Karma: 23
Posts: 1658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

hast Du vielleicht die reihenfolge der libraries geändert?

gruß stefan
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2433
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

inzwischen habe ich einen Sketch, der sollte eigentlich funktionieren.

Von einer Webseite herauskopiert und in der Arduino-Software eingefügt, oder woher?

Ich weiß nicht, wie ich diese Fehler deuten soll.  smiley-confuse

Offenbar werden Deine Libraries nicht eingebunden, obwohl #include Zeilen vorhanden sind. Probiere als erstes mal, die Leerzeichen vor den Include-Zeilen zu löschen. Also statt
Code:
  #include <Wire.h>
  #include <OneWire.h>
  #include <DallasTemperature.h>
  #include <LiquidCrystal.h>
Setze:
Code:
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>

Beim Herauskopieren von Code aus Webseiten kann es Dir auch passieren, dass Du "unsichtbare Zeichen" aus der Webseite herauskopierst, die Du im Editor zwar nicht sehen kannst, die aber für den Compiler das Programm an der Stelle syntaktisch falsch machen, so dass er es nicht mehr kompilieren kann. Und damit meine ich andere unsichtbare Zeichen als das normale Leerzeichen.

Code, der zum Download vorgesehen ist, wird meist auch noch irgendwo speziell zum Download angeboten oder als Code-Seite bereitgestellt. Also im Zweifelsfall den Code nicht einfach von einer gestalteten HTML-Webseite herunterkopieren, sondern den Code downloaden oder von einer speziellen Codeseite oder aus einem dafür vorgesehenen Code-Fenster herauskopieren.

Oder wenn Du gut bist im Suchen und Entfernen von unsichtbaren Zeichen, die Du im Editor gar nicht sehen kannst, kannst Du Dich natürlich auch daran versuchen.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi an alle und besonders an die Skeptiker,  smiley-grin

seit heute habe ich nun auch den größeren Sketch zusammen, mit dem ich außer Datum, Zeit und WIEGEN auch zusätzlich drei Temperaturen erfasse.
Speichern auf SD geht zwar noch nicht, aber was ich mir auf dem Monitor und dem LCD - Display anzeige ist für mich erst mal OK!

Mein zusammengebastelter Sketch ist sicher noch zu verbessern, schließlich bin ich mit knapp 5 Woochen nur Anfänger auf dem C++ Gebiet.

Aber bei dem sehr schön strukturierten Beispiel, für das einlesen der Temperaturen von DS18B20 - Sensoren mit bekannten ROM- Adressen, das ich heute gefunden habe,
konnte ich zwar die Sketch-Struktur gut verstehen, aber bei der Berechnung der Temperatur aus den beiden Daten-Bytes habe ich nicht durchgeblickt.

Die damit berechneten Werte waren leider Hausnummern und hatten mit den vorhandnen Temperaturen nichts zu tun.

Dann habe ich in dem Bereich die vielen Zeilen entfernt, alles was mit der Berechnung zu tun hat und zu der neuen Variablen  float TEM; 

noch diese Zeile für die Berechnung eingefügt:      TEM = ((data[1] <<  8  ) + data[0] )*0.0625;    // 1/16 = 0.0625

Damit stimmt die Berechnung!    Schade ist nur dass die delays den Sketch etwas langsam machen.

Hier ist das Beispiel:  Wer auch DS18B20 Sensoren hat, sollte diesen Sketch  mit den entsprechenden ROM Adressen nutzen können.

Meine hinzugefügten ersetzten Zeilen  für die Byte-Umrechnung sind mit //** markiert!

Code:
#include <OneWire.h>
#include <DallasTemperature.h>
 
OneWire  ds(2); //pin für ds1820
 
//DeviceAdressen der einzelnen ds1820 Temperatursensoren. (ROM Adresse für jeden Sensor anpassen)
  DeviceAddress sensor1 = { 0x28, 0x5E, 0x91, 0xAA, 0x3, 0x0, 0x0, 0xF  };
                 // ROM =     28    5E    91    AA    3    0    0    F        C3
  DeviceAddress sensor2 = { 0x28, 0xF5, 0x73, 0xAA, 0x3, 0x0, 0x0, 0xF2 };
                 // ROM =     28    F5    73    AA    3    0    0    F2       C2
  DeviceAddress sensor3 = { 0x28, 0xCF, 0x1E, 0xCA, 0x3, 0x0, 0x0, 0xBD };
                 // ROM =     28    CF    1E    CA    3    0    0    BD       IC
 
char sensor1Name[] = "C3 : ";
char sensor2Name[] = "C2 : ";
char sensor3Name[] = "IC : ";

//..................................................................................
void setup(void)
{
  Serial.begin(9600);
}
//..............................................................aufrufen............
void writeToScratchpad(byte* address)
{
  //reset the bus
  ds.reset();
  //select sensor
  ds.select(address);
  //CONVERT T function call (44h) übernimmt Data in scratchpad
  ds.write(0x44,1);                                             // ,0 oder ,1 ?
  // 750 ms Wartezeit
  delay(750);
}
//..................................................................lesen............
void readFromScratchpad(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();                     // Bytes  lesen
  }
}
//..................................................................................
float getTemperature(byte* address)
{
  float TEM;                   //** zusätzliche Variable
 
  byte data[12];
 
  writeToScratchpad(address);                 // Funktion  aufrufen   0x44,1
 
  readFromScratchpad(address,data);           //  Funktion lesen      0XBE
 
  TEM = ((data[1] << 8) + data[0] )*0.0625; 
                                //** 12Bit = 0,0625 C per Bit  andere Berechnung
 
  return TEM;                  //**  NEUE Variable der einfacheren Berechnung
}
 
void loop(void)
{
  float temp1 = getTemperature(sensor1);
  float temp2 = getTemperature(sensor2);
  float temp3 = getTemperature(sensor3);
 
  Serial.print(sensor1Name);
  Serial.print(temp1);
  Serial.println(" C");
 
  Serial.print(sensor2Name);
  Serial.print(temp2);
  Serial.println(" C");
 
  Serial.print(sensor3Name);
  Serial.print(temp3);
  Serial.println(" C");
 
  Serial.println();
 
  delay(750);
}


Was mögliche versteckten Zeichen betrifft, bin ich schon sehr vorsichtigsmiley-grin
Wenn ich hier CODES zeige, sollten die leeren Stellen nur BLANKS sein, die ich zur besseren Lesbarkeit als Zeilen und Spaltenausgleich einfüge.

Es würde mich feuen, wenn jemand mit diesem Sketch was anfangen kann und dann die Zeit spart, die ich zum FINDEN, VERSTEHEN und ABÄNDERN aufgewendet habe.

Ebenso wären Beiträge und Antworten, die mir als Anfänger mit Beispielen zeigen wie es geht, sinnvoller.
Aber für meine Motivation und Ausdauer werde ich wohl noch eine Weile selbst sorgen müssen.  smiley-wink

Der Sketch oben, ist nur das Beispiel, das ich nach geglückter Änderung zum Teil in meinen WAAGE-Sketch eingebaut habe.

Gruß, Apus²







* Apus-Waage-Test.JPG (82.26 KB, 574x350 - viewed 16 times.)
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Zu dem oben gezeigten Beispiel habe ich eine weitere Frage.

Weil ich die drei Sensoren, nacheinander auslese, habe ich für jeden Sensor die 750ms delay.
Jetzt hat mir jemand vorgeschlagen, ich sollte sie mit Match ROM(0xBE) gemeinsam einlesen
und würde mir 2x 750ms sparen = SCHNELLER !

Code:
void Temperatur_einlesen(void) {
   Match ROM(0xBE) ---> Nr1 einlesen
   Match ROM(0xBE) ---> Nr2 einlesen
   Match ROM(0xBE) ---> Nr3 einlesen
   Skip ROM(0x44) ---> Alle Messungen neu starten
}

Mit diesem Vorschlag habe ich´mich auf die Suche nach einem Beispiel gemacht,
aus dem direkt hervorgeht, wie  das anzuwenden ist.  
Nur habe ich nichts gefunden, das ich umsetzen kann.

Vielleicht hilft mir an diesem Punkt jemand weiter?

Der Sketch in dem das geändert werden soll, steht weiter oben.

Gruß, Apus²
« Last Edit: March 24, 2013, 11:28:56 am by Apus_Apus » Logged

Pages: [1] 2   Go Up
Jump to: