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
reset-switch abfragen
12.12.2020, 22:47
Beitrag #17
RE: reset-switch abfragen
(12.12.2020 21:53)wonk schrieb:  ....
wenn mir nichts anderes einfällt, werde ich Euch das Prog. mit dem Problem noch zumuten ;-).
Ich fand die Idee mit dem Interrupt eigentlich gut, war aber wohl wieder viel zu einfach gedacht....

...was hast du gegen eine Tasterabfrage... das habe ich bei meinem MEGALOGGER auch schon mal gemacht. Schau mal in der Loop unter Tastaturabfragen. Mit dem Flag
Code:
SDpresent = 0;
wird dann eben nicht mehr weiter auf die SD geschrieben.... Allerdings hatte die verwendete Lib keinen Wiedereinstieg zugelassen so das ich beim weiter aufzeichnen einen Warmstart per Assemblercode generiert habe.

lgbk


An alle Neuankömmlinge hier, wenn ihr Code(Sketch) hier posten wollt dann liest euch bitte diese Anleitung durch.

Ich spreche fließend Schwäbisch, Deutsch das Notwendigste und für die Begriffsstutzigen erprobtes Tacheles mit direkten Hinweisen ohne Schnörkel...

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.12.2020, 21:09 (Dieser Beitrag wurde zuletzt bearbeitet: 13.12.2020 21:34 von wonk.)
Beitrag #18
RE: reset-switch abfragen
(12.12.2020 22:10)MicroBahner schrieb:  Wenn Du was auf der serielle Schnittstelle sehen willst, solltest Du auch ein 'Serial.begin' in deinem Sketch haben.
Und Serial Ausgaben haben in einem Interrupt schonmal gar nichts zu tun - die brauchen nämlich selbst einen. Deshalb wirst Du von der Ausgabe in der FUnktion 'error' nie etwas sehen.
Die Verwendung von Interrupts erfordert ein tieferes Verständnis für die Vorgänge, die da im Prozessor ablaufen.
Hallo,
"Serial.begin()" hatte ich natürlich vergessen. Damit funktioniert der Interrupt, als Ausgabe sehe ich aber nur "En". Bei dem vollständigen Prog. mit den Sensorabfragen ist es aber dann wieder unzuverlässig. Also zurück zur Tasterabfrage. Das folgende läuft jetzt so wie ich dachte:
Code:
#include <SPI.h>
#include <SD.h>      
const int chipSelect = 10;              //Chip Pin für die SD Karte bei UNO ohne Ethernet
File dataFile;
#include <Wire.h>
#include <RTClib.h>  
RTC_DS1307 RTC;                         //Instanziiert Variablenobjekt vom Typ RTC_DS1307
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 9                  //Pin9 OneWire-Bus
OneWire oneWire(ONE_WIRE_BUS);          //Instanziiert Variablenobjekt vom Typ OneWire
DallasTemperature sensors(&oneWire);
const int AnzahlSensoren = 1;           // Reihenfolge entspricht nicht Steckreihenfolge Stecker
struct Korrekturtyp {                  
          String Kennung;               //letzte beiden HEX-Buchstaben Adresse in Kleinschrift!!!
          float Summand;                //Temperatur Korrektursummand für jeweiligen Sensor
          String Name;
          };
const Korrekturtyp Korrektur[5]= {{"60",-0.28,"RL RH"},{"57",0.46,"VL FH"},{"a0",-0.85,"VL RH"},{"26",0.38,"RL FH"},{"d2",0,"IT"}};
// Achtung!!  Die Reihenfolge der Elemente im array darf nicht verändert werden!
// Sie muss der Reihenfolge der gefundenen Devices entsprechen
const boolean korrigieren = true;       //gibt an, ob die Korrekturen durchgeführt werden sollen  
byte numberOfDevices;                    // Number of temperature devices found
DeviceAddress tempDeviceAddress;        // We'll use this variable to store a found device address
const byte StopPin = 2;                  // Anschluss Prg. +Pol Stop-Taste
const byte LED = 3;                      // zeigt Schreibaktivitäten und Error an, +Pol
const byte zeitspanne = 1;               // Messen alle x Minuten, Werte 2,3,4,5,6,10,15, 20,30,60
String Dateiname;
const boolean test = true;             // bei true Messen jede Sekunde

void setup() {
  pinMode(StopPin, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
  Serial.begin(9600);
  // für RTC
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
    error("RTC läuft nicht!");
    }
    else {
    Serial.println("RTC ok!");
    };
  RTC.adjust(DateTime(__DATE__, __TIME__)); //sets RTC to the date, time of compiling, date, time from PC
  DateTime jetzt = RTC.now();
  Dateiname = String(jetzt.day()) + "-m";
  Dateiname = Dateiname + String(jetzt.month()) + ".csv";
  Serial.println(Dateiname);
  
  //für Temperatursensoren
  sensors.begin();
  numberOfDevices = sensors.getDeviceCount();
  if (AnzahlSensoren != numberOfDevices) {
     Serial.print ("Anzahl Sensoren: ");
     Serial.println(numberOfDevices, DEC);
     error ("falsche Sensoranzahl!");
     };
  for(byte i=0;i<numberOfDevices; i++) {
    if(sensors.getAddress(tempDeviceAddress, i)) {
      Serial.print("Sensor ");
      Serial.print(i, DEC);
      Serial.print(" gefunden mit Kennung ");
      Serial.println(tempDeviceAddress[7], HEX);
      }
    };
  
  // für SD-Karte
  pinMode(chipSelect, OUTPUT);
  if (SD.begin(chipSelect)) { // Durch den Rückgriff auf den Programmblock "startSDCard" wird die SD-Karte geprüft.
    Serial.println("SD-Karte ok!");
    }
    else {
    error ("Problem mit SD-Karte!");
    };
  if (SD.exists(Dateiname)){
    SD.remove(Dateiname);
    };
  dataFile = SD.open(Dateiname, FILE_WRITE); //*.csv-Datei anlegen 8.3 Dateinamen
                // Falls vorhanden: wird gelöscht
  dataFile.print ("Datum");
  dataFile.print(";");
  dataFile.print ("Uhrzeit");
  dataFile.print(";");
  for (byte i=0; i < AnzahlSensoren; i++){
      String text = "Temperatur " + Korrektur[i].Name;
      dataFile.print (text);
      dataFile.print(";");
      };
  dataFile.print("\n");
  dataFile.close();
  Serial.println("Datei angelegt! - Ende Setup!");
};

void error (String text) {
  Serial.println(text);
  Serial.println("Endlosschleife!");
  digitalWrite(LED,HIGH);
  while (true);  
};

float Messwert(int deviceNr) {
  float temp;
  if(sensors.getAddress(tempDeviceAddress, deviceNr)){    //deviceNr aus Array-Reihenfolge, tempDeviceAddress zugehörige Adresse
      temp = sensors.getTempC(tempDeviceAddress);         // getTempC
      Serial.println(temp);
      if (korrigieren){
         for (int k = 0; k < AnzahlSensoren; k++){
            if (Korrektur[k].Kennung == String(tempDeviceAddress[7], HEX)) {
               Serial.print(Korrektur[k].Kennung);
               Serial.print ("   ");
               temp = temp +  Korrektur[k].Summand;
               Serial.println(temp);
               };
           };
      };    
  };
  return temp;
};

void Messen () {
DateTime jetzt = RTC.now();
int rest = jetzt.minute()% zeitspanne;
if (rest == 0){
  digitalWrite(LED,HIGH);  
  dataFile = SD.open(Dateiname, FILE_WRITE);
  dataFile.print(jetzt.day(), DEC);
  dataFile.print(".");
  dataFile.print(jetzt.month(), DEC);
  dataFile.print(".");
  dataFile.print(jetzt.year(), DEC);
  dataFile.print(";");
  dataFile.print(jetzt.hour(), DEC);
  dataFile.print(":");
  dataFile.print(jetzt.minute(), DEC);
  dataFile.print(";");
  sensors.requestTemperatures(); // Send the command to get temperatures
  for(int i=0;i<numberOfDevices; i++) {  // Search the wire for address
      dataFile.print(Messwert(i),2);
      dataFile.print(";");
      };  
  dataFile.print("\n");
  dataFile.close(); // Die Datei wird vorrübergehend geschlossen.
  digitalWrite(LED,LOW);
  };  
};

void Tasterabfrage() {
   if (!digitalRead(StopPin)) {
      error ("Programmende!");  
      };
};

void loop() {
   Messen();
   Tasterabfrage();
   if (!test) {
      for(int i=0;i<120; i++) {  // 1 Minute delay mit Abfrage Stop-Taster
         Tasterabfrage();
         delay (500);      
         };
      };
}
Die Tasterabrage im Loop erscheint mir zwar etwas umständlich, aber besser bekomme ich es nicht hin.
Danke für Eure Hilfen.
Gruss, wonk
Edit: hab jetzt noch was anderes übersehn, schreibt nicht auf SD-Karte!
Edit2: So, jetzt ok.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino DUE: Fehler auf der Platine: Serial, PowerOn-Reset GuaAck 0 476 09.06.2021 15:02
Letzter Beitrag: GuaAck
  Taster abfragen wonk 19 2.536 24.05.2021 17:09
Letzter Beitrag: wonk
  RX-LED am Nano abfragen Fiete11 19 4.441 20.08.2020 20:40
Letzter Beitrag: hotsystems
  Power-up-Reset DUE GuaAck 5 3.072 15.10.2019 00:21
Letzter Beitrag: Bitklopfer
  Nano CH340 - Software Reset Lite 16 7.090 17.03.2019 20:07
Letzter Beitrag: Tommy56
  Mega2560 und Mini-Ethernet Reset-pin problem sepp01 60 18.952 09.10.2018 17:25
Letzter Beitrag: sepp01
  PCF8574 im Interrupt abfragen daneie 4 3.319 06.07.2018 17:30
Letzter Beitrag: MicroBahner
  RESET für zwei Pegel & Pegel wandeln Wampo 20 9.937 25.10.2017 17:04
Letzter Beitrag: ardu_arne
  Reset direkt auf VCC legen BennIY 2 2.845 23.05.2017 21:49
Letzter Beitrag: Bitklopfer
  8Fach DIP Switch auf einen Port??! Wampo 14 5.134 09.01.2017 23:17
Letzter Beitrag: renid55

Gehe zu:


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