Go Down

Topic: Telecontrollo GSM caldaia Baxi (Read 2 times) previous topic - next topic

ghennet

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: [Select]
#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

gpb01


.....
grazie gpb


Figurati, ci siamo divertiti :)

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

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

ghennet

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 :)

PaoloP

Nel datasheet della shield cosa c'è scritto?

ghennet

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)

PaoloP

#20
Oct 25, 2013, 09:29 am Last Edit: Oct 25, 2013, 09:31 am by PaoloP Reason: 1
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:

gpb01

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 ;)

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

ghennet

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 ??

gpb01


....
O vedo male io ??


Hai letto il mio post qua sopra ???  ]:D

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

PaoloP


ghennet

#25
Oct 25, 2013, 09:44 am Last Edit: Oct 25, 2013, 10:25 am by ghennet Reason: 1

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 ;)

Guglielmo


Grazie gpb, mi sa che fantastico meno sull'hardware ;)

(sei stato più veloce a digitare di me e non avevo fatto in tempo a leggere il tuo post) :)

ghennet


ghennet

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


gpb01


...
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 ?  ]:D
Search is Your friend ... or I am Your enemy !

ghennet

Mi pare proprio di si...

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

Go Up