Pages: 1 [2] 3   Go Down
Author Topic: Telecontrollo GSM caldaia Baxi  (Read 1946 times)
0 Members and 1 Guest are viewing this topic.
Milano
Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ci siamo ... questo codice funziona egregiamente, migliorabile come consigliava giustamente gpb01, ma direi che come prima release è buona.

qui sotto il codice, se dovesse servire a qualcuno:
Code:
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <math.h>
#include <GSM.h>
#include <string.h>
#include <stdlib.h>


// Variabili Dichiarazione
// Display
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 6, 5, 4, 9);
// Temperatura Desiderata
float     SetPoint = 20.5;
boolean   Manuale = false;
int       Btn;
boolean   Caldaia = false;
float     TempAmb;



int RELEPin = 12; 
// PIN Number for the SIM
#define PINNUMBER ""

// initialize the library instances
GSM         gsmAccess;
GSM_SMS     sms;
// Array to hold the number a SMS is retreived from
char   senderNumber[14]; 
char   sms_ok1[14] = {"+3939399"};



// Funzione traduzione Temp Locale
float Thermister(int RawADC) {
 float Temp;
 Temp = log(((10240000/RawADC) - 10000));
 Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
 Temp = Temp - 273.15;            // Convert Kelvin to Celcius
 // Temp = (Temp * 9.0)/ 5.0 + 32.0; // Convert Celcius to Fahrenheit
 return Temp;
}

/*
// RAM libera
int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
*/

void InviaSMS(byte Type) {
  char msg_sms[70] = "";
  char buffer[20] = "";
 
  dtostrf(TempAmb, 3, 1, buffer);
 
  switch (Type) {
    case 1:
      strcpy(msg_sms, "TempAtt: ");
      strcat(msg_sms, buffer);
      strcat(msg_sms, " - ACCENSIONE caldaia a: ");
      dtostrf(SetPoint, 3, 1, buffer);
      strcat(msg_sms, buffer);
      break;
    case 2:
      strcpy(msg_sms, "TempAtt: ");
      strcat(msg_sms, buffer);
      strcat(msg_sms, "- SPEGNIMENTO caldaia");
      break;
  }
 
  sms.beginSMS(senderNumber);
  sms.print(msg_sms);
  sms.endSMS();
}


void DisegnaLCD(float TempAmb){
  display.clearDisplay();
  display.setTextSize(1);
  // Scrivo la temperatura rilevata dal sensore
  display.setCursor(0,0);
  display.print("TempAmb:");
  display.setCursor(54,0);
  display.print(TempAmb);
 
  // Scrivo la temperatura impostata da pulsanti
  display.setCursor(0,10);
  display.print("TempOtt:");
  display.setCursor(54,10);
  display.print(SetPoint);
 
  // Scrivo lo stato del Termostato Interno
  display.setCursor(0,20);
  display.print("Manuale:");
  display.setCursor(65,20);
  if (Manuale) {
    display.print("ON");
  } else {
    display.print("OFF");
  }
 
  //Scrivo lo stato della Caldaia
  display.setCursor(0,30);
  display.print("Caldaia:");
  display.setCursor(65,30);
  if (Caldaia) {
    display.print("ON");
  } else {
    display.print("OFF");
  }
  /*
  // Scrivo lo stato del GSM
  display.setCursor(0,40);
  display.print("GSM: " + scannerNetworks.getCurrentCarrier() + "  " + scannerNetworks.getSignalStrength() + " [0-31]");
  */
  display.setCursor(0,40);
  display.print("GSM: ");
  display.setCursor(65,40);
  display.print("ON");
 
  // Mando tutto al display
  display.display();
}

void AccendiCaldaia() {
   // Devo eccitare il rele
  digitalWrite(RELEPin, LOW);
  // Mostro a schermo lo stato caldaia
  Caldaia = 1;
}

void SpegniCaldaia() {
  // Spengo il rele
  digitalWrite(RELEPin, HIGH);
  Caldaia = 0; 
}




void setup() {
  pinMode(RELEPin, OUTPUT);
  //Spengo la caldaia
  digitalWrite(RELEPin, HIGH);
 
  display.begin();
  display.setContrast(60);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.setCursor(0,0);
  display.print("TERMOSTATO GSM");
  display.setCursor(10,30);
  display.print("GSM  On ...");
  display.display();
 
  // initialize serial communications and wait for port to open:
  Serial.begin(9600);
   
  // connection state
  boolean notConnected = true;
 
  // scannerNetworks.begin();
 
  // Start GSM connection
  while(notConnected) {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else delay(1000);
  }
  /*
  Serial.print("RAM: ");
  Serial.println(freeRam());
  */
}

void loop() {
  // Varibili
  char c;
  // variabili per il controllo del mittente
  boolean   equal_1, equal_2;
  byte      i;
  // String messaggio;
  char      cmd[5];
  char      msg[60] = "";
  boolean   accendo, spengo;
  char      accendo_cmd[11] = {"Caldaia ON"};
  char      spengo_cmd[12] = {"Caldaia OFF"};
  byte      TypeOp;
 
 
  // Controllo L'INPUT dei pulsanti
  Btn = analogRead(1);
  if (Btn < 1000) {
    // Cambio stato Controllo Manuale
    if ( (Btn >650) && (Btn <700) ) {
      Manuale = !Manuale;
    }
    // ---
    if (Btn < 20 ) {
       SetPoint -= 0.5;
    }
    // +++
    if ( (Btn >500) && (Btn <520) ) {
      SetPoint += 0.5;
    }
  }
 
  TempAmb = Thermister(analogRead(0));
  // Controllo se devo accendere la caldaia manualmente
  if (Manuale) {
    if (TempAmb < SetPoint) {
      AccendiCaldaia();
    } else {
      SpegniCaldaia();
    }
  } else {
    SpegniCaldaia();
  }
 
  DisegnaLCD(TempAmb);
 
  // Verifico il segnale e l'operatore
  // Signal = scannerNetworks.getSignalStrength();
 
  // If there are any SMSs available() 
  if (sms.available())  {
     /*
    Serial.print("RAM: ");
    Serial.println(freeRam());
    */
    // Get remote number
    sms.remoteNumber(senderNumber, 14);
   
    equal_1 = true;
    i = 0;
    while ( (equal_1) && (i<13) )  {
      if (senderNumber[i] != sms_ok1[i]) equal_1=false;
      i++;
    }
   
    if ( (equal_1) ) {
      // An example of message disposal   
      // Any messages starting with # should be discarded
      if(sms.peek()=='#') {
        sms.flush();
      }
     
      // Read message bytes and print them
      i = 0;
      while(c=sms.read()) {
        msg[i] = c;
        i++;
      } 
     
      i = 0;
      accendo = true;
      while ( (accendo) && (i<10) )  {
        if (msg[i] != accendo_cmd[i]) accendo=false;
        i++;
      }
     
      if (accendo) {
        SpegniCaldaia();
        for (i=0; i<=4; i++) {
          cmd[i] = msg[i+10];
        }
        SetPoint = atof(cmd);
        Manuale = true;
        AccendiCaldaia();
        TypeOp = 1;
      }
     
     
      i = 0;
      spengo = true;
      while ( (spengo) && (i<12) )  {
        if (msg[i] != spengo_cmd[i]) spengo=false;
        i++;
      }
   
      if (spengo) {
        Manuale = false;
        SpegniCaldaia();
        TypeOp = 2;
      }
      // Delete message from modem memory
      sms.flush();
      delay(500);
      InviaSMS(TypeOp);
    } else {
      Serial.println("Messaggio scartato");
      // Delete message from modem memory
      sms.flush();
    }
  }
  delay(500);
}


Mi sarebbe piaciuto aggiungere i riferimenti alla qualità del segnale, ma il troppo uso della memoria rende instabile il software già al primo sms.

Il prossimo step sarà quello di sostituire il sensore di temperatura con un TMP36 evitando quindi l'uso di quella funzione non propriamente ottimizzata e quindi anche , spero, con un risparmio di memoria

grazie gpb
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5952
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

.....
grazie gpb

Figurati, ci siamo divertiti smiley

Ma mi raccomando, sistemalo ed ottimizzalo, vedrai che alla fine ... la memoria ti avanza  smiley-lol smiley-lol smiley-lol

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Milano
Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, vorrei sostituire Arduino con uno standalone: sapete se i 3.3v sono necessari alla shield per funzionare o posso risparmiarsi questa parte di circuito ??

Notte smiley
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7112
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nel datasheet della shield cosa c'è scritto?
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Milano
Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Paolo...

leggendo nel testo l'unico riferimento alla sorgente è questo:
Operating voltage 5V (supplied from the Arduino Board)

però guardando il 
http://arduino.cc/en/uploads/Main/arduino-gsm-shield-schematic.pdf
sembrerebbe che anche il 3.3 è collegato.. come del resto è collegato il pin di reset ma nella parte descrittiva non trovo nessun riferimento al reset ...

non vorrei lanciarmi nella ricostruzione della board e poi dover realizzare questa parte di circuito (pensavo ad uno zener ma non ho idea di quanta corrente richiede la shield su quel voltaggio per calcolare la resistenza)
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7112
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Al posto di uno standalone puoi pensare di prendere una vecchia Arduino 2009. Vecchia per modo di dire.  smiley-mr-green
Alcuni siti, tipo Robot-Italy, le danno in offerta.

Sul datasheet c'è il 3V3, ma sono si capisce dove vada a finire.

Alla fine lo sbattimento per uno stand-alone non credo che valga la candela, per poi cosa... risparmiare qualche milliampere quando in confronto il modem GSM sembra una stufetta elettrica? (come consumo)  smiley-sweat
« Last Edit: October 25, 2013, 02:31:40 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5952
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il 3.3v sembrerebbe usato per alimentare U4 ed U5 (credo usati come adattatori di livello 5v <-> 3.3v) ... almeno guardando lo schema, quindi direi che è necessario smiley-wink

Guglielmo


* schema.jpg (167.45 KB, 989x615 - viewed 28 times.)
Logged

Search is Your friend ... or I am Your enemy !

Milano
Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi trovi perfettamente d'accordo su tutto...

Più che un discorso di economia (corrente, euro) era per un discorso "libidine" ..

Guardando la schedina e seguendo la pista, il pin 3.3 e il reset non sono connessi ad un bel niente ...

O vedo male io ??


* 2013-10-25 09.44.42.jpg (2497.19 KB, 2448x3264 - viewed 26 times.)
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5952
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

....
O vedo male io ??

Hai letto il mio post qua sopra ???  smiley-twist

Guglielmo
Logged

Search is Your friend ... or I am Your enemy !

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7112
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E sull'altro lato?
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Milano
Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il 3.3v sembrerebbe usato per alimentare U4 ed U5 (credo usati come adattatori di livello 5v <-> 3.3v) ... almeno guardando lo schema, quindi direi che è necessario smiley-wink

Guglielmo

Grazie gpb, mi sa che fantastico meno sull'hardware smiley-wink

(sei stato più veloce a digitare di me e non avevo fatto in tempo a leggere il tuo post) smiley
« Last Edit: October 25, 2013, 03:25:52 am by ghennet » Logged

Milano
Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

E sull'altro lato?


* 2013-10-25 09.50.10.jpg (2418.86 KB, 3264x2448 - viewed 30 times.)
Logged

Milano
Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho fatto un test collegandola come da foto ...

quindi +5, GND, pin 7-2-3 e funziona tutto alla grande ...

riassumendo i 3.3 non servono e giusto per curiosità ho misurato la tensione sul suo piedino... 3.28v



* 2013-10-25 19.28.57.jpg (2037.9 KB, 3264x2448 - viewed 32 times.)
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 113
Posts: 5952
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...
riassumendo i 3.3 non servono e giusto per curiosità ho misurato la tensione sul suo piedino... 3.28v

NO, i 3.3v SERVONO ...
... se li hai misurati sul suo piedino e non glie li hai portati tu ... ovviamente ha un regolatore sulla scheda che li genera non ti pare ?  smiley-twist
Logged

Search is Your friend ... or I am Your enemy !

Milano
Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi pare proprio di si...

il mio "non gli servono" era riferito al fondevo darglieli io, ma se li riduce lui dai +5
Logged

Pages: 1 [2] 3   Go Up
Jump to: