Forum: Mikrocontroller und Digitale Elektronik TC35 C+ Programmierfehler?


von Hilgi (Gast)


Lesenswert?

hallo an alle :)


ich verzweifle bald

mein code steht und funktioniert so:
1
#include <SoftwareSerial.h>
2
SoftwareSerial mySerial(8, 9);
3
4
String inData = "";
5
char last;
6
#include <DHT.h>
7
#include <SD.h>
8
#define DHTPIN 2
9
#define DHTTYPE DHT22
10
DHT dht1 (DHTPIN, DHTTYPE);
11
#include <SPI.h>
12
#include <Wire.h>
13
#include "RTClib.h"
14
RTC_DS1307 RTC;
15
const int chipSelect = 4;
16
const int analogInPin = A0;
17
int sensorValue = 0;
18
19
20
21
void setup()  
22
{
23
24
  Wire.begin();
25
  RTC.begin();
26
  Serial.begin(9600);
27
  Serial.println("Starte...");
28
29
  mySerial.begin(9600);
30
  mySerial.println("AT");
31
  pinMode(10, OUTPUT);
32
33
  if (!SD.begin(chipSelect))
34
  {
35
    Serial.println("Card failed, or not present");
36
    return;
37
  }
38
39
  Serial.println("card initialized.");
40
  Serial.println("");
41
  delay(1000);
42
}
43
44
void call(String n)
45
{
46
  mySerial.print("ATD");
47
  mySerial.print(n);
48
  mySerial.println(";");
49
  Serial.println("Starte Anruf...");
50
  delay(10000);
51
  mySerial.println("ATH");
52
  Serial.print("Anruf an ");
53
  Serial.print(n);
54
  Serial.println(" beendet");
55
}
56
57
void loop()
58
{
59
60
  while (Serial.available() > 0)
61
  {
62
    char recieved = Serial.read();
63
    inData += recieved;
64
65
    if (recieved == '\n')
66
    {
67
      Serial.print("Arduino Received: ");
68
      Serial.print(inData);
69
    }
70
  }
71
72
  DateTime now = RTC.now();
73
74
  if (inData == "d")
75
  {
76
    Serial.print(now.day(), DEC);
77
    Serial.print('.');  
78
    Serial.print(now.month(), DEC);
79
    Serial.print('.');
80
    Serial.print(now.year(), DEC);
81
    Serial.print(' ');
82
    Serial.print(now.hour(), DEC);
83
    Serial.print(':');
84
    Serial.print(now.minute(), DEC);
85
    Serial.print(':');
86
    Serial.println(now.second(), DEC);
87
    Serial.println();
88
  }
89
90
  String dataString = "";
91
92
  sensorValue = analogRead(analogInPin);
93
94
  float h = dht1.readHumidity();  
95
96
  float t = dht1.readTemperature();
97
98
  if (isnan(t) || isnan(h))
99
  {
100
    Serial.println ("Fehler - Lesen von Luftfeuchte bzw. Temperatur");
101
    Serial.println("Gaswert soll: < 100");
102
    Serial.print("Gaswert ist:  < ");    
103
    Serial.println(sensorValue);
104
    Serial.println("");  
105
  }
106
107
  if (inData == "a")
108
  {
109
    Serial.print("Feuchte:        ");
110
    Serial.print(h);
111
    Serial.println(" %   ");
112
    Serial.print("Temperatur:     ");
113
    Serial.print(t);
114
    Serial.println(" C");
115
    Serial.println("Gaswert soll: < 100");
116
    Serial.print("Gaswert ist:  < ");    
117
    Serial.println(sensorValue);
118
    Serial.println("");
119
    delay(1000);                    
120
  }
121
122
  if (last != now.minute())
123
  {
124
    byte a = h;
125
    byte b = t;
126
    byte c = sensorValue;
127
    dataString += String(a);
128
    dataString += ",";
129
    dataString += String(b);
130
    dataString += ",";
131
    dataString += String(c);
132
    dataString += ",";
133
    dataString += String(now.day(), DEC);
134
    dataString += ".";
135
    dataString += String(now.month(), DEC);
136
    dataString += ".";
137
    dataString += String(now.year(), DEC);
138
    dataString += ",";
139
    dataString += String(now.hour(), DEC);
140
    dataString += ":";
141
    dataString += String(now.minute(), DEC);
142
    dataString += ";";
143
144
    File dataFile = SD.open("datalog.txt", FILE_WRITE);
145
146
    if (dataFile)
147
    {
148
      dataFile.println(dataString);
149
      dataFile.close();
150
      Serial.println(dataString);
151
      Serial.println("Gespeichert - SD: 'datalog.txt'");
152
    }
153
    else
154
    {
155
      Serial.println("Fehler - Lesen von SD: 'datalog.txt'");
156
    }
157
158
    last = now.minute();
159
160
    Serial.println("");
161
  }
162
163
  if (inData == "c")
164
  {
165
    call("x");
166
  }
167
168
  if (inData.length() > 4)
169
  {
170
    call(inData);
171
  }
172
173
  dataString="";
174
  inData = "";
175
  delay(100);
176
    
177
}

wenn ich jetzt an diesem code aber was ändere, sei es eine zeile in 
call() oder ich setzte, was ich gerne hätte folgenden code egal wohin in 
meinen sketch, sagt er fehler beim sd karte lesen...
1
if ((sensorValue > 60) || (t > 50) || h > 80))
2
  {
3
  mySerial.print("AT+CMGF=1\r");
4
  delay(100);
5
  mySerial.println("AT+CMGS=\"xxxxxx\"");
6
  delay(100);
7
  mySerial.print("Temp: ");
8
  mySerial.print(t);
9
  mySerial.println(" C");
10
  mySerial.print("Feuchte: ");
11
  mySerial.print(h);
12
  mySerial.println(" %");
13
  mySerial.print("Gas: ");
14
  mySerial.print(sensorValue);
15
  mySerial.println(" C");
16
  delay(100);
17
  mySerial.println((char)26);
18
  }

also auch wenn ich etwas unerhebliches ändere streikt er sofort, ich 
verstehe es einfach nicht, vollkommen gleichgültig ob ich den code nach 
oder vor der speicheranweisung setzte, sofort geht das speichern nicht 
mehr...


kann mir da bitte einer helfen, vlt wirke ich ja irgendwie auf den 
speicherprozess ein, allerdings reicht es auch schon nur in call() etwas 
zu verändern, eine kleinigkeit und er streikt...

hilfe

von Hilgi (Gast)


Lesenswert?

kann es sein das es ein problem mit den libraries gibt?

sd.h und myserial.h?

sowas? :((

von Klaus W. (mfgkw)


Lesenswert?

Kann sein.
Muß nicht.

Wer soll das wissen? Eine vernünftige Beschreibung des Problems wäre 
vielleicht hilfreich (bei "geht nicht" schließ eich zumindest gleich 
wieder das Fenster und mache etwas interessanteres).
Ebenso welche Umgebung du hast, wie alle deine eigenen Quelltexte 
aussehen, wo der Rest herkomt, ...

TC35 ist ein Siemens Handy? C+ eine Sparversion von C++?

von Klaus W. (mfgkw)


Lesenswert?

Dateien *.h sind übrigens keine Libraries, sondern Headerdateien.
Libraries sind das, was der Linker später nach dem Kompilieren dazufügt.
Je nach Umgebung heißen die dann .o, .so, .lib, .a, .obj ...

von Hilgi (Gast)


Lesenswert?

das problem ist das er fehler beim lesen von sd ausgibt sobald ich die 
gsm anweisung einpflege

ich arbeite mit der "Arduino 1.0.5-r2" sofware von arduino

das tc35 ist ein chip, ich habe das board erworben, hier ein link

http://www.ebay.de/itm/Neu-GSM-SIEMENS-TC35-SMS-drahtlos-Module-UART-232-Free-Voice-Adapter-/320856057878?pt=Elektromechanische_Bauelemente&hash=item4ab482e816


es geht halt nur darum das es so unlogisch ist, der code funktioniert ja 
soweit, ändere ich eine kleinigkeit, sei es nur den inhalt eines print 
befehls in call(), hat er wieder den fehler beim lesen der sd karte, 
egal wo ich den gsm befehl einpflege, fehler beim lesen

der gsm befehl alleine funktioniert, deswegen vermute ich ja das die 
sich in die quere kommen oder so, ich brauch aber beide, sonst m uss ich 
n zweites board benutzen... :(

von Hilgi (Gast)


Lesenswert?

c+ is n schreibfehler, danke

von holger (Gast)


Lesenswert?

Vieleicht ist ja nur das RAM voll.

von Rolf M. (rmagnus)


Lesenswert?

Und das Arduino läuft auf diesem TC35? Wieviel RAM hat das denn? 
Vielleicht läuft ja der Speicher über.

Sowas riecht für mich z.B. nach starker Speicherfragmentierung:

Hilgi schrieb:
>     dataString += String(a);
>     dataString += ",";
>     dataString += String(b);
>     dataString += ",";
>     dataString += String(c);
>     dataString += ",";
>     dataString += String(now.day(), DEC);
>     dataString += ".";
>     dataString += String(now.month(), DEC);
>     dataString += ".";
>     dataString += String(now.year(), DEC);
>     dataString += ",";
>     dataString += String(now.hour(), DEC);
>     dataString += ":";
>     dataString += String(now.minute(), DEC);
>     dataString += ";";

von Hilgi (Gast)


Lesenswert?

ok guter ansatz denke ich, nur warum is das nur wenn ich den gsm befehl 
einsetze? die variablen sind ja schon beschrieben und wenn ichs flashe 
sagt mein kompiler Binäre Sketchgröße: 24.426 Bytes (von einem Maximum 
von 32.256 Bytes)

ich verstehe das jetzt so das der speicher überladen sein könnte, nur 
habe ich die variablen t,h,sensorValue doch so wie so schon für die 
andren funktionen beschrieben, oder versteh ich hier grad was falsch?

von Hilgi (Gast)


Lesenswert?

ich versuche den code mal runter zu reduzieren...

von Rolf M. (rmagnus)


Lesenswert?

Hilgi schrieb:
> ok guter ansatz denke ich, nur warum is das nur wenn ich den gsm befehl
> einsetze?

Da kommen doch z.B. Strings dazu, oder nicht? Die müssen ja auch 
irgendwo gespeichert werden.

 die variablen sind ja schon beschrieben und wenn ichs flashe
> sagt mein kompiler Binäre Sketchgröße: 24.426 Bytes (von einem Maximum
> von 32.256 Bytes)

Ich weiß nicht, was bei der Android-Nomenklatur eine "Binäre 
Sketchgröße" ist, aber ich vermute, es geht um den Flash. RAM wird aber 
auch noch benötigt, und wieviel das ist, weißt du zur Compilezeit nicht.

> ich verstehe das jetzt so das der speicher überladen sein könnte, nur
> habe ich die variablen t,h,sensorValue doch so wie so schon für die
> andren funktionen beschrieben, oder versteh ich hier grad was falsch?

PS: C++ ist case-sensitiv, also solltest du dir mal eine Tastatur mit 
funktionierender Shift-Taste kaufen...

von Hilgi (Gast)


Lesenswert?

so also ich hab jetzt den code angepasst, das anrufen muss ja nicht 
sein, jetzt siehts wie folgt aus UND funktioniert, ich danke allen für 
die hinweise, das mit dem internen speicher scheint zutreffend gewesen 
zu sein..
1
#include <SoftwareSerial.h>
2
SoftwareSerial mySerial(8, 9);
3
4
String inData = "";
5
char last;
6
#include <DHT.h>
7
#include <SD.h>
8
#define DHTPIN 2 
9
#define DHTTYPE DHT22
10
DHT dht1 (DHTPIN, DHTTYPE);
11
#include <SPI.h>
12
#include <Wire.h>
13
#include "RTClib.h"
14
RTC_DS1307 RTC;
15
const int chipSelect = 4;
16
const int analogInPin = A0;
17
int sensorValue = 0;
18
int sent = 0;
19
20
void setup()  
21
{
22
23
  Wire.begin();
24
  RTC.begin();
25
  Serial.begin(9600);
26
  Serial.println("Starte...");
27
28
  mySerial.begin(9600);
29
  mySerial.println("AT");
30
  pinMode(10, OUTPUT);
31
32
  if (!SD.begin(chipSelect)) 
33
  {
34
    Serial.println("Card failed, or not present");
35
    return;
36
  }
37
38
  Serial.println("card initialized.");
39
  Serial.println("");
40
  delay(1000);
41
}
42
43
void loop()
44
{
45
 
46
  while (Serial.available() > 0)
47
  {
48
    char recieved = Serial.read();
49
    inData += recieved; 
50
51
    if (recieved == '\n')
52
    {
53
      Serial.print("Arduino Received: ");
54
      Serial.print(inData);
55
    }
56
  }
57
58
  DateTime now = RTC.now();
59
60
  String dataString = "";
61
62
  sensorValue = analogRead(analogInPin);
63
64
  float h = dht1.readHumidity();  
65
66
  float t = dht1.readTemperature();
67
68
  if (isnan(t) || isnan(h))
69
  {
70
    Serial.println ("Fehler - Lesen von Luftfeuchte bzw. Temperatur");
71
    Serial.print("Gaswert ist:    ");    
72
    Serial.print(sensorValue);
73
    Serial.println(" ppm"); 
74
    Serial.println("");  
75
  }
76
77
  if (inData == "a")
78
  {
79
    Serial.print("Feuchte:        ");
80
    Serial.print(h);
81
    Serial.println(" %   ");
82
    Serial.print("Temperatur:     ");
83
    Serial.print(t);
84
    Serial.println(" C");
85
    Serial.print("Gaswert ist:    ");    
86
    Serial.print(sensorValue);
87
    Serial.println(".00 ppm"); 
88
    Serial.println("");  
89
    delay(1000);                     
90
  }
91
92
  if (last != now.minute())
93
  {
94
    byte a = h;
95
    byte b = t;
96
    byte c = sensorValue;
97
    dataString += String(a);
98
    dataString += ",";
99
    dataString += String(b);
100
    dataString += ",";
101
    dataString += String(c);
102
    dataString += ",";
103
    dataString += String(now.day(), DEC);
104
    dataString += ".";
105
    dataString += String(now.month(), DEC);
106
    dataString += ",";
107
    dataString += String(now.hour(), DEC);
108
    dataString += ":";
109
    dataString += String(now.minute(), DEC);
110
    dataString += ";";
111
112
    File dataFile = SD.open("datalog.txt", FILE_WRITE);
113
114
    if (dataFile)
115
    {
116
      dataFile.println(dataString);
117
      dataFile.close();
118
      Serial.println(dataString);
119
      Serial.println("Gespeichert - SD: 'datalog.txt'");
120
    }
121
    else
122
    {
123
      Serial.println("Fehler - Lesen von SD: 'datalog.txt'");
124
    }
125
126
    last = now.minute();
127
128
    Serial.println("");
129
  }
130
   
131
 if (sent == 0)
132
 {
133
 if ((sensorValue > 80) || (t > 60) || (h > 80) || (inData == "t"))
134
  {
135
  mySerial.print("AT+CMGF=1\r");
136
  delay(100);
137
  mySerial.println("AT+CMGS=\"01725130975\"");
138
  delay(100);
139
  mySerial.println("ALARM!");
140
  mySerial.print("Temp:     ");
141
  mySerial.print(t);
142
  mySerial.println(" C");
143
  mySerial.print("Feuchte: ");
144
  mySerial.print(h);
145
  mySerial.println(" %");
146
  mySerial.print("Gas:        ");
147
  mySerial.print(sensorValue);
148
  mySerial.println(".00 ppm");
149
  delay(100);
150
  mySerial.println((char)26);
151
  delay(100);
152
  Serial.println("SMS an xxxxx versendet");
153
  Serial.println("");
154
  sent = 1;
155
  }
156
 }
157
  
158
  dataString="";
159
  inData = "";
160
  delay(100);
161
}

es funktioniert jetzt jedenfalls DANKE DANKE :)

von otti (Gast)


Lesenswert?

ich schaffe es auch nicht. Alles was ich mit #include <DHT.h> eingebe.
kommt:  fatal error: DHT.h: No such file or directory
compilation terminated. was muss ich machen?????

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.