TC35 C+ Programmierfehler?

Gast #3775588
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
#3775865
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++?
Gast #3775917
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... :(
#3775953
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 += ";";
Gast #3775963
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?
#3775975
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...
Gast #3776120
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 :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren