Hallo!
Ich versuche mich gerade an diverse Teilprojekte heranzuarbeiten. Am Anfang steht ein Wasserstandssensor, der die Daten auf SD Karte speichert und im LCD anzeigt.
Später soll das ganze per ESP8266/12 gehen, um dann irgendwann (wahrscheinlich existiere ich dann nicht mehr ) erst ein semiautomatisches Bewässerungssystem, dann in ein automatisches Bewässerungssystem und dann in ein Kontrollsystem für ein Gewächshaus (en miniature) werden.
Naja, aber im Moment stockt es schon am Anfang. Ich habe erst den Wasserstandsensor getestet, dann die SD Karte ohne irgendwas, dann den Sensor mit LCD - bis hierhin funktionierte alles so, wie erwartet.
Dann war ich so "tollkühn" SD Karten und LCD zu kombinieren. Die SD Karte und die serielle Ausgabe funktionieren - nur die LCD Anzeige gibt kryptische Zeichen aus.
Ich hatte auch versucht, die LCD Ausgabe in eine separate Funktion auszulagern, die die x, y Koordinate übergibt, eine Bool.Wert und den auszugebenden Text.
Ich habe für dieses Vorhaben diverse Vorlagen kombiniert.
Meine Fragen:
-
warum kommt da was kryptisches aufm LCD raus? - Primäre FRAGE
-
wie kann ich das String Objekt umgehen und mit einem Text aus 16 chars arbeiten? (Hab's versucht, aber immer Fehlermeldungen bekommen, vor allem bei der Umwandlung von int -> char
-
warum bekomme ich eine Warnmeldung "In function 'void loop()': 84:6: note: initializing argument 4 of 'void write_LCD(int, int, bool, String)'"?
Danke.
Der Code:
//www.elegoo.com
//2016.12.9
//Modified by ak
/*
LiquidCrystal Library - Hello World
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/
// include the library code:
#include <LiquidCrystal.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
const int chipSelect = 10; //10 is default by shield, but normally on Pin 4
int interval = 20; //Log to SD Card every 5 seconds
long timer;
String timestring;
String mvalue;
RTC_DS1307 rtc;
int adc_id = 0;
int HistoryValue = 0;
char printBuffer[128];
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup() {
Serial.begin(9600);
delay(1000);
lcd.begin(16, 2);
Serial.println("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("SD Card error");
return;
}
write_LCD(0,0, true, "card initialized");
Serial.println("card initialized");
delay(1000);
if (! rtc.begin()) {
Serial.println("No RTC found");
write_LCD(0,0, true, "No RTC found");
} else {
Serial.println("RTC clock found");
write_LCD(0,0, true, "RTC found");
}
if (! rtc.isrunning()) {
Serial.println("RTC is not configured");
write_LCD(0,0, true, "RTC not config");
}
// set up the LCD's number of columns and rows:
delay(1000);
// Print a message to the LCD.
lcd.print("Hello, World!");
Serial.println("Hello World");
}
void loop() {
int value = analogRead(adc_id); // get adc value
if(((HistoryValue>=value) && ((HistoryValue - value) > 4)) || ((HistoryValue<value) && ((value - HistoryValue) > 10)))
{
sprintf(printBuffer,"ADC%d level is %d\n",adc_id, value);
Serial.print(printBuffer);
mvalue = String(value);
write_LCD(0,0,true, "Feuchte");
write_LCD(0,1,false, value);
HistoryValue = value;
get_time();
write_data();
}
}
void write_LCD(int x, int y, bool clearIt, String text) {
if (clearIt) {
lcd.clear();
}
lcd.setCursor(x,y);
lcd.print(text);
}
void get_time(){ //Read Time from RTC
DateTime now = rtc.now();
timestring = now.day();
timestring += "-";
timestring += now.month();
timestring += "-";
timestring += now.year();
timestring += " ";
timestring += now.hour();
timestring += ":";
timestring += now.minute();
timestring += ":";
timestring += now.second();
Serial.println(timestring);
}
void write_data() { //Write to SD card
String dataString = mvalue + "," + timestring;
File dataFile = SD.open("datalog.txt", FILE_WRITE);
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
Serial.println(dataString);
}
else {
Serial.println("error writing datalog.txt");
}
}