Go Down

Topic: Wemos d1 mini pro mit SD-Shield und RTC (Read 1 time) previous topic - next topic

Luggi

Hallo zusammen!

Ich bin gerade dabei meinen Datenlogger neu aufzubauen.

Habe einen Wemos d1 mini pro und ein Wemos D1 Micro SD Mini Data Logger Shield+RTC DS1307.
Die beiden Module lassen sich zusammenstecken bzw. aufstecken.

Mein alter Code vom Arduino Logger funzt nicht am Wemos . Darum wollte ich mit den neuen Librarys vom Wemos einen Code neuen schreiben.

Seit Stunden versuche ich die RTC Lib + die SD Lib zusammenzufügen.
Jedesmal wenn ich die SD Karte in die Time Lib einfüge, wird die Speicherkarte
"Initializing SD card...card initialized", danach aber die Zeit in einem wirren Format dargestellt.

Wo habe ich da einen Fehler eingebaut. So sieht die Ausgabe im Seriell aus.

2165/165/165 (Monday) 165:165:85
2165/165/165 (Monday) 165:165:85
2165/165/165 (Monday) 165:165:85
2165/165/165 (Monday) 165:165:85

Ich habe die Original lib DS1307 und die SD Datalogger lib verwendet.

Hier der Beispiel Code:

Code: [Select]

#include <Wire.h>
#include "RTClib.h"
#include <SPI.h>
#include <SD.h>

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const int chipSelect = 4;
void setup () {

#ifndef ESP8266
  while (!Serial); // for Leonardo/Micro/Zero
#endif

  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
    Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
}

void loop () {
    DateTime now = rtc.now();
   
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
   
    Serial.println();
    delay(3000);
}


Wo liegt hier der Fehler?
sobald ich die Zeile mit "if (!SD.begin(chipSelect))

Luggi

Wo liegt hier der Fehler?
sobald ich die Zeile mit    "if (!SD.begin(chipSelect))"  ändert sich das Format von der Uhrzeit und vom Datum.

Luggi

Hallo zusammen!

Zur Info, ich konnte den Fehler finden.

Verwendet man die Codes einzeln funktionieren sie wunderbar.

Kombiniert man die RTC und den Datalogger dann geht nichts mehr bzw. bekommt man
das Datum und die Uhrzeit in einem anderen Format bzw. blockiert die Zeile
"const int chipSelect = 4;" die korrekte Ausgabe der Daten.

Mit anderen Worten, es werden dieselben Pins verwendet. Ich hab anstelle der 4 nach Stunden
die 3 gewählt und seither funktioniert alles wie es soll, im Seriell und auch auf SD.

Schade dass das nirgends zu lesen war bzw. wusste ich das als Anfänger einfach nicht.

Ich werde jetzt noch um LCD erweitern und dann mache ich mich an die Datenübertragung.
Das kann ja noch spannend werden.   


postmaster-ino

Hi

Soll heißen, Du hast zwei per SPI angeschlossene Geräte am gleichen CS-Pin gehabt?
Hmm, eigentlich ist die RTC doch I²C, oder?
Benutzt I²C dann zufällig den Pin 4?
Wie Dem auch sei - Du hattest eine Mehrfachnutzung eines Pin, Das will erst Mal gefunden werden.


Super, daß Du den Fehler finden konntest und noch toller, daß Du Diesen der Nachwelt präsentierst!

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

uwefed

#4
Aug 11, 2018, 05:05 pm Last Edit: Aug 11, 2018, 05:20 pm by uwefed
0) der DS1307 abeitet nicht mit 3,3V. Die Versorgungsspannung MUß mindestens 1,25 * der Batteriespannung sein da er ansonsten nicht auf Normalbetrieb umschaltet.
1) Hast Du die Zeit gesetzt?
2) Hast Du Pullupwiderstände auf I2C?

Meine Antworten sind überholt.
zB Pinbelegung des Wemos Di mini:
https://escapequotes.net/esp8266-wemos-d1-mini-pins-and-diagram/

Grüße Uwe

Luggi

Hi

Ich bin ja eigentlich davon ausgegangen, dass wenn ich einheitliche Platinen eines Herstellers zusammenfüge, diese ohne weiteres auf anhieb funktionieren. Das da eventuell eine doppelte Pinbelegung vorliegt, damit habe ich eigentlich nicht gerechnet.

Aber es wird ja schon wieder Spannend für mich.
Ich habe jetzt die nächsten Code Segmente eingefügt und muss nun wieder feststellen das ich mich um die Pinbelegung noch viel intensiver bemühen muss.

Erst mal noch was ich genau machen will.

Ich möchte Weg- und Zeitabhängig Druckdaten auf SD speichern und wenn es mir geling natürlich mit dem Wemos gleich ins Netz übertragen. Ich habe zwei Analoge Drucksensoren, deren Daten ich über ein ADS1115 auf den Wemos übertragen will. Als Wegsensoren habe ich zwei kontaktlose Näherungsschalter verwendet.

Darum wird es jetzt mit der Pinbelegung spannend.
Ich habe zwei digitale Eingangssignale die mir die Wegsignale liefern und die zwei Analogen Drucksensoren. Des weiteren soll ich noch auf einem LCD Display die aktuellen Daten darstellen.

Ich Poste jetzt mal meinen Code:

In den Zeilen 20 + 21 definiere ich
outputA 1 + outputB 2, diese werden dann in
Zeile 65 +66 als als INPUT definiert.
Da sollte mir noch was besseres einfallen.

Die Zeilen 35 - 37; 63 - 66; 70 - 82; 86 - 102; habe ich in meinem Code noch ausgegrenzt,
da weiß ich noch nicht wie ich das integrieren soll.
Ich muss erst noch mal die Pinbelegung studieren und mittels learning by doing schauen ob ich eine Lösung finde.

Wenn jemand einen Ansatz für mich hat wäre ich sehr Dankbar.

Ansonsten halte ich euch auf dem Laufenden, wie ich mit meinem Projekt vorankomme.

Danke für eure Unterstützung!

Schöne Grüße Luggi.

Code: [Select]
#include <Wire.h>
#include "RTClib.h"
#include <SPI.h>
#include <SD.h>

int n = 1;
int var3 = 0;         // counter
int var1 = 0;         // Druckgeber 1 Presszylinder
int var2 = 0;         // Druckgeber 2 Getriebedruck
int Pressensensor = 0;     // Potipin fuer Demo
int Getriebesensor = 1;     // Potipin fuer Demo
float counter = 0;    // float fuer Kommastellen int fuer ganze Zahlen
float Vortriebsstrecke = 0;

RTC_DS1307 rtc;

//Definiere Prototypen
void speichernAufSD(void);

#define outputA 1
#define outputB 2


int aState;
int aLastState;


unsigned long timer;
const unsigned int speicherZyklus = 10000; //Speichern alle 10,0 Sekunden

char daysOfTheWeek[7][12] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
const int chipSelect = 3;
void setup () {

//#ifndef ESP8266
  //while (!Serial); // for Leonardo/Micro/Zero
//#endif

  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
    Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
 
  //pinMode(Pressensensor, INPUT);
  //pinMode(Getriebesensor, INPUT);
  //pinMode(outputA, INPUT);
  //pinMode(outputB, INPUT);

  timer = millis(); //Startwert von timer
     
 /*    lcd.begin (20,4);
 
// Switch on the backlight
  lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.setCursor ( 0, 0 );                 
  lcd.print("  BOHRDATENLOGGER   ");
  lcd.setCursor ( 0, 1 );        // go to the next line         
  lcd.print("Vortrieb m/t:");
  lcd.setCursor ( 0, 2 );        // go to the next line
  lcd.print("Vortrieb bar:"); 
  lcd.setCursor ( 0, 3 );        // go to the next line
  lcd.print("Getriebe bar:");*/
}

void loop () {
 /*   {
  lcd.setCursor ( 15, 1 );
  Vortriebsstrecke = counter * 0.05;
  var1 = analogRead(Pressensensor);
  var1 = map(var1, 0, 1000, 0, 400);
  var2 = analogRead(Getriebesensor);
  var2 = map(var2, 0, 1000, 0, 400);
 
  lcd.print(Vortriebsstrecke);
  lcd.setCursor ( 15, 2 );        // go to the next line
  lcd.print(var1);
  lcd.print(' ');
  lcd.setCursor ( 15, 3 );
  lcd.print(var2);
  lcd.print(' ');
 
}*/
 
  aState = digitalRead(outputA); // Reads the "current" state of the outputA
  // If the previous and the current state of the outputA are different, that means a Pulse has occured
  if (aState != aLastState)
  {
    // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
    if (digitalRead(outputB) != aState)
    {
      counter ++;
    }// else       
    {
      //counter --;
    }
    speichernAufSD();
    aLastState = aState; // Updates the previous state of the outputA with the current state
  }

  //Hier wird nun im Zyklus von "speicherZyklus" das Unterprogramm "speichernAufSD()" aufgerufen
  if (millis() >= timer + speicherZyklus)
  {
    timer = millis();
    speichernAufSD();
   
  }
}



void speichernAufSD()
{
    DateTime now = rtc.now();
   
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(",  ");
   
    if (now.day() < 10)    {Serial.print('0');}
    Serial.print(now.day(), DEC);
    Serial.print('.');
    if (now.month() < 10)  {Serial.print('0');}
    Serial.print(now.month(), DEC);
    Serial.print('.');
    Serial.print(now.year(), DEC);
    Serial.print(",  ");
   
    if (now.hour() < 10)   {Serial.print('0');}
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    if (now.minute() < 10) {Serial.print('0');}
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    if (now.second() < 10) {Serial.print('0');}
    Serial.print(now.second(), DEC);
    Serial.print(",  ");
    Serial.println();


    File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {



    dataFile.print(daysOfTheWeek[now.dayOfTheWeek()]);
    dataFile.print(",  ");
   
    if (now.day() < 10)    {dataFile.print('0');}
    dataFile.print(now.day(), DEC);
    dataFile.print('.');
    if (now.month() < 10)  {dataFile.print('0');}
    dataFile.print(now.month(), DEC);
    dataFile.print('.');
    dataFile.print(now.year(), DEC);
    dataFile.print(",  ");
   
    if (now.hour() < 10)   {dataFile.print('0');}
    dataFile.print(now.hour(), DEC);
    dataFile.print(':');
    if (now.minute() < 10) {dataFile.print('0');}
    dataFile.print(now.minute(), DEC);
    dataFile.print(':');
    if (now.second() < 10) {dataFile.print('0');}
    dataFile.print(now.second(), DEC);
    dataFile.print(",  ");
    dataFile.println();
    dataFile.close();
   
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
}

Go Up