kippenstalalarm geheugen vol

Is er iemand die mij kan helpen?

Ik ben nog maar net begonnen met arduino en ik zit met een probleempje.

Ik probeer een alarm te maken voor in mijn vader, als er iets verkeerd gaat in de stal moet de arduino hem bellen en daarna een sms sturen met de melding van het probleem.

Alles werkt tot nu toe maar ik zou graag nog een waterteller op de arduino willen aansluiten. Om het water verbruik na te gaan en eventueel nog 2 alarmen willen bijvoegen.

Maar het probleem is dat het voor de globale variabelen geheugen van mijn arduino uno vol zit, kan iemand mij helpen.

Hieronder vind u de schets.

#include <GSM.h>

#define PINNUMBER ""

// initialize the library instance
GSM gsmAccess; // include a 'true' parameter for debug enabled
GSM_SMS sms;
GSMVoiceCall vcs;

// char array of the telephone number to send SMS
// change the number 1-212-555-1212 to a number
// you have access to
char remoteNumber[20] = "1-212-555-1212";
int temp = 6;
int vent = 5;
int elek = 4;

// char array of the message
char txtMsg[200] = "Temperatuur ALARM!!!";
char txtMsg2[200] = "Ventilator ALARM!!!";
char txtMsg3[200] = "Elektriciteit ALARM!!!";

void setup()
{

  pinMode (temp, INPUT);
  pinMode (vent, INPUT);
  pinMode (elek, INPUT);
  // initialize serial communications
  Serial.begin(9600);

  Serial.println("Kippenstal alarm");

  // connection state
  boolean notConnected = true;

  // Start GSM shield
  // If your SIM has PIN, pass it as a parameter of begin() in quotes
  while (notConnected)
  {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }
  Serial.println("GSM initialized");

}

void loop()
{
  int tempStatus;
  tempStatus = digitalRead(temp);

  int ventStatus;
  ventStatus = digitalRead(vent);

  int elekStatus;
  elekStatus = digitalRead(elek);

  if (tempStatus == HIGH || ventStatus == HIGH || elekStatus == HIGH) {
    Serial.print("Alarm belt naar: ");
    Serial.println(remoteNumber);
    vcs.voiceCall(remoteNumber);
    delay(10000);
    vcs.hangCall();
    Serial.println("Oproep volbracht.");
  }
  delay (5000);



  if ( tempStatus == HIGH) {
    Serial.print("Message to mobile number: ");
    Serial.println(remoteNumber);

    // sms text
    Serial.println("SENDING");
    Serial.println();
    Serial.println("Message:");
    Serial.println(txtMsg);

    // send the message
    sms.beginSMS(remoteNumber);
    sms.print(txtMsg);
    sms.endSMS();
    Serial.println("\nCOMPLETE!\n");
    delay(300000);
  }



  if ( ventStatus == HIGH) {
    Serial.print("Message to mobile number: ");
    Serial.println(remoteNumber);

    // sms text
    Serial.println("SENDING");
    Serial.println();
    Serial.println("Message:");
    Serial.println(txtMsg2);

    // send the message
    sms.beginSMS(remoteNumber);
    sms.print(txtMsg2);
    sms.endSMS();
    Serial.println("\nCOMPLETE!\n");
    delay(300000);
  }




  if ( elekStatus == HIGH) {
    Serial.print("Message to mobile number: ");
    Serial.println(remoteNumber);

    // sms text
    Serial.println("SENDING");
    Serial.println();
    Serial.println("Message:");
    Serial.println(txtMsg3);

    // send the message
    sms.beginSMS(remoteNumber);
    sms.print(txtMsg3);
    sms.endSMS();
    Serial.println("\nCOMPLETE!\n");
    delay(300000);
  }


}  //einde void loop

Als je al die letterlijke strings "..." vervangt door F("...") heb je behoorlijk wat bytes meer beschikbaar voor je code.

vriendelijke groet,

Jos

Er zijn nog weel meer mogelijkheden ik had een heel verhaal ingeklopt op het andere forum:
Dus hier nogmaals:

Je hebt een aantal mogelijkheden waardoor je werkgeheugen grotendeels vrijkomt:
a) Gebruikmaken van Progmem. Hier kun je constantes in flash zetten (zo ongeveer al je berichten) en die pas uit het flash halen als je ze nodig hebt
b) Je messages zijn nu 200 bytes lang terwijl ze in werkelijkheid maar iets van 30 bytes lang zijn.
Als je die 2 punten opneemt, dan is er nog een fractie over van wat je gebruikte. Behoudens interne zaken van de GSM library.

Uitleg
Als jouw sketch opstart, dan zal de processor eerst ALLE constantes kopiëren vanuit Flash naar het RAM gebied. Dus dat stuk geheugen ben je gelijk al kwijt. Dat geldt dus ook voor constantes binnen de functies. Het kan ook niet anders, want als de processor opstart is het RAM geheugen leeg. Dus moeten eerst al die constantes uit het flash geheugen gehaald worden. Maar je kan ze er ook daar laten staan door de functie PROGMEN (zie: PROGMEM - Arduino Reference). In feite kun je zelfs tabellen met bit patronen (7 segment displays) ook in flash laten zitten. Daar betaal je wel een prijs voor (TIJD). Maar die paar micro seconden gaat het niet uitmaken.

voorbeeld
dit is een stukje code waarin print() en println() gebruikt worden

Serial.println();
Serial.print(F([color=blue]"pinMode ("[/color]));
Serial.print(pin);
Serial.print([color=blue]","[/color]);
Serial.print(mode);
Serial.println(F([color=blue]") invalid pin"[/color]));

Dank alvast voor de reacties.
Nu heb ik een van de dingen geprobeerd die jullie voorstelden maar ik krijg nu een fout bij compileren.
Dit is wat ik geprobeerd heb maar ik vermoed dat ik iets fout doe.

 // sms text
    Serial.println(F("SENDING"));
    Serial.println(F());
    Serial.println(F("Message:"));
    Serial.println(F(txtMsg3));

Welke fout krijg je bij het compileren?

  Serial.println(F());

Das een stap te ver

Arduino: 1.6.6 (Windows 10), Board:"Arduino/Genuino Uno"

In file included from C:\Users\detan\Desktop\arduino\arduino-1.6.6\libraries\GSM\src/GSM.h:46:0,

from C:\Users\detan\AppData\Local\Temp\arduino_b0ff530d570fb3fddc7485c17f44229a\sketch_mar05b.ino:1:

C:\Users\detan\Desktop\arduino\arduino-1.6.6\libraries\GSM\src/GSM3ShieldV1BandManagement.h:49:125: warning: 'typedef' was ignored in this declaration [enabled by default]

typedef enum GSM3GSMBand {UNDEFINED, EGSM_MODE, DCS_MODE, PCS_MODE, EGSM_DCS_MODE, GSM850_PCS_MODE, GSM850_EGSM_DCS_PCS_MODE};

^

C:\Users\detan\AppData\Local\Temp\arduino_b0ff530d570fb3fddc7485c17f44229a\sketch_mar05b.ino: In function 'void setup()':

C:\Users\detan\AppData\Local\Temp\arduino_b0ff530d570fb3fddc7485c17f44229a\sketch_mar05b.ino:41:34: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

if (gsmAccess.begin(PINNUMBER) == GSM_READY)

^

In file included from C:\Users\detan\Desktop\arduino\arduino-1.6.6\hardware\arduino\avr\cores\arduino/Arduino.h:28:0,

from sketch\sketch_mar05b.ino.cpp:1:

C:\Users\detan\AppData\Local\Temp\arduino_b0ff530d570fb3fddc7485c17f44229a\sketch_mar05b.ino: In function 'void loop()':

C:\Users\detan\Desktop\arduino\arduino-1.6.6\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: expected primary-expression before ')' token

#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

^

C:\Users\detan\AppData\Local\Temp\arduino_b0ff530d570fb3fddc7485c17f44229a\sketch_mar05b.ino:123:20: note: in expansion of macro 'F'

Serial.println(F());

^

C:\Users\detan\Desktop\arduino\arduino-1.6.6\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: initializer fails to determine size of '__c'

#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

^

C:\Users\detan\AppData\Local\Temp\arduino_b0ff530d570fb3fddc7485c17f44229a\sketch_mar05b.ino:125:20: note: in expansion of macro 'F'

Serial.println(F(txtMsg3));

^

C:\Users\detan\Desktop\arduino\arduino-1.6.6\hardware\arduino\avr\cores\arduino/WString.h:38:74: error: array must be initialized with a brace-enclosed initializer

#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

^

C:\Users\detan\AppData\Local\Temp\arduino_b0ff530d570fb3fddc7485c17f44229a\sketch_mar05b.ino:125:20: note: in expansion of macro 'F'

Serial.println(F(txtMsg3));

^

exit status 1
Fout bij het compileren.

Dit rapport zou meer informatie hebben met
"Tijdens de compilatie uitgebreide uitvoer weergeven"
ingeschakeld in Bestand > Voorkeuren.

Als je hier naar kijkt, moet je verder kunnen:

Dit programma gebruikt 34 bytes data. Als het op jouw oude manier had gedaan (dus zonder alle flash constantes) is het 72 bytes.

const char PROGMEM txtMsg3[] = "Dit is een test regel";

void setup()
{
Serial.println(F("SENDING"));
Serial.println();
Serial.println(F("Message:"));
Serial.println(txtMsg3);
}

// The loop function is called in an endless loop
void loop()
{
//Add your repeated code here
}

Dank voor de antwoorden. Dit scheelt al een hele hoop.