# Συζήτηση Κυκλωμάτων > Ψηφιακά Κυκλώματα > Μικροελεγκτές >  >  Έλεγχος Ρελέ με Arduino και Gsm A6 Βοήθεια με τον κώδικα

## keap

Καλησπέρα σε όλη την παρέα και Χρόνια Πολλά.
Για ακόμα μία φορά χρειάζομαι την βοηθειά σας,αγόρασα ένα gsm module A6 το οποίο σύνδεσα με arduino uno και δοκίμασα τους παρακάτω κώδικες
όπως φαίνονται στις φωτογραφίες και όλα πήγανε μια χαρά.
Αυτό που θέλω να κάνω ειναι να συνδεσω 2 ρελέ και να ελέγχονται από το κινητό, θα ήθελα μία βοήθεια με τον κώδικα γιατί μπερεύομαι με τις 
εντολές at commands.Ποιές εντολές πρέπει να γράψω για να διαβάζει το μήνυμα που θα στέλνω και αν είναι εύκολο κάποιο παράδειγμα.
Ευχαριστώ πολύ για τον χρόνο σας.

----------


## keap

Κανείς βρε παιδιά,τόσο γκαντέμεις είμαι που σας πέτυχα όλους σε διακοπές....χαχαχαχχαχαχα

----------


## aktis

Δεν ειχες ασχοληθει με κατι παρόμοιο ; Αυτο το modulaki ειναι μαλλον καινούριο και δεν εχουν ασχοληθει πολλοί μαζι του . Με το sim800/900  που ειναι το standard το εχεις κάνει ; 

https://learn.adafruit.com/adafruit-...odule/overview

----------


## SProg

Δεν καταλαβα τι θελεις να κανεις.

Να τα ελεγχεις με κινητο πως;Να στελνεις για παραδειγμα μηνυμα και αναλογα με το μηνυμα να ανοιγει το ρελε που θες;

Αυτο ειναι πολυ ευκολο.Το μονο που εχεις να κανεις ειναι να δεχεσαι τη συμβολοσειρα απο το μοντεμ και να κανεις parse το μηνυμα που εστειλες.

Φιλοι σου ειναι οι συναρτησεις strstr() και strtok().

----------


## keap

> Δεν ειχες ασχοληθει με κατι παρόμοιο ; Αυτο το modulaki ειναι μαλλον καινούριο και δεν εχουν ασχοληθει πολλοί μαζι του . Με το sim800/900  που ειναι το standard το εχεις κάνει ; 
> 
> https://learn.adafruit.com/adafruit-...odule/overview



 Καλημέρα ναι είναι καινούργιο και δεν υπάρχουν πολλά παραδείγματα , το έκανα και με τα sim800l αλλά είχα θέματα με την την πλακέτα
δεν ξεκίναγε με τίποτα να μπει σε λειτουργία και να μου απαντήση

----------


## keap

> Δεν καταλαβα τι θελεις να κανεις.
> 
> Να τα ελεγχεις με κινητο πως;Να στελνεις για παραδειγμα μηνυμα και αναλογα με το μηνυμα να ανοιγει το ρελε που θες;
> 
> Αυτο ειναι πολυ ευκολο.Το μονο που εχεις να κανεις ειναι να δεχεσαι τη συμβολοσειρα απο το μοντεμ και να κανεις parse το μηνυμα που εστειλες.
> 
> Φιλοι σου ειναι οι συναρτησεις strstr() και strtok().



Καλημέρα
Σάββα ναι ακριβώς αυτό θέλω να κάνω είτε με 1 ή 3 ή 4 ή ....8 ρελέ,να στέλνω ένα sms και να ανοίγει ή να κλείνει ο αντίστοιχος ρελέ.
Σάββα όπως σου έχω πει και παλιότερα με τον προγραμματισμό δεν τα πάω καλά και είμαι νέος,μήπως έχεις κάποιο παράδειγμα?Ευχαριστώ πολύ...

----------


## nkarama

Καλημέρα,

Το GSM πρωτόκολλο περιγράφει ένα σύνολο ΑΤ εντολών (τόσο για τα SMS όσο και για το σύνολο των λειτουργιών του τηλεφώνου). Απο εκεί και πέρα, ο κάθε κατασκευαστής ορίζει και δικές του, που συνήθως κάνουν κάτι πολύ εξειδικευμένο.

Θα σου πρότεινα να παίξεις με τις ήδη υπάρχουσες βιβλιοθήκες για το SIM800. Λογικά οι ΑΤ εντολές είναι οι ίδιες. 
Εναλακτικά μπορείς να δοκιμάσεις και εσύ να στείλεις κάποιες για να δεις αν υποστηρίζονται απο το module που αγόρασες.
ΠΧ. 
AT+CMGL=4  που θα σου εμφανίσει μια λίστα με όλα τα μηνύματα που υπάρχουν αποθηκευμένα στην μνήμη (συνήθως της κάρτας, υπάρχει άλλη εντολή που καθορίζει την default μνήμη).
AT+CMGR=<index> όπου το <index> το αντικαθιστάς με τον αριθμό της θέσης μνήμης που υπάρχει το μήνυμα.

Κάνε μια δοκιμή, στείλε ένα μήνυμα στο module και δοκίμασε τις να δεις αν μπορείς να το διαβάσεις.
Αν παίζουν αυτές οι εντολές τότε πολύ πολύ πιθανό να παίζουν οι έτοιμες βιβλιοθήκες. Αν παρόλα αυτά δεν παίζουν, μπορείς να γράψεις το δικό σου πρόγραμμα για να διαβάζεις ένα μήνυμα, να το "μεταφράζεις" στο τι σημαίνει αυτό που έστειλες και μετά να ελέγχεις ότι είναι να ελέγξεις.

----------


## manolena

Υπάρχουν τόσα παραδείγματα αναφοράς στο δίκτυο που δεν ξέρω γιατί δεν σε έχουν βοηθήσει (αν έχεις κοιτάξει βέβαια...). Και χωρίς τη χρήση κάποιας ειδικής -για το modem που χρησιμοποιείς- βιβλιοθήκης. Επειδή το ρεπερτόριο εντολών AT είναι σειριακής βάσης (ας μου επιτραπεί ο όρος), σημαίνει πως μπορείς να "διατάξεις" οποιοδήποτε modem μέσω σειριακών μηνυμάτων να σου κάνει αυτό που θές (αυτό θα το κάνει το τηλέφωνό σου) και επίσης να μπορείς να ξεχωρίζεις πότε εμφανίζεται ένα συγκεκριμένο μήνυμα στο modem (αυτό που θα ελέγχεις εσύ για τα ρελέ) και ανάλογα να ενεργεί το ρελέ που θες.

Το πρώτο που βρήκα, χωρίς πολλά πολλά:

http://circuitdigest.com/microcontro...-using-arduino

Αν έχεις μικρή έστω επαφή με αυτά, θα ξεχωρίσεις πως ο κώδικας που παρατίθεται, αλλά και στην ανάλυση, ανεξάρτητα απο το ότι χρησιμοποιείται συγκεκριμένο modem της SIMCOM, μπορεί με πολύ μεγάλη ευκολία να προσαρμοστεί στις ανάγκες σου.
Ψάξε και θα βρείς πολλά. Αλλά ψάξε όμως.

----------


## keap

Εδώ είναι οι εντολές αλλά πάλι δεν μπορώ να βγάλω άκρη.

http://smart-prototyping.com/image/d...T_Commends.pdf

Δίπλα σε κάποιες εντολές πρέπει να γράψω κάποια νούμερα πως θα βρω ποιά είναι τα σωστά πχ AT+CNMI=2,2,0,0,0

----------


## keap

> Υπάρχουν τόσα παραδείγματα αναφοράς στο δίκτυο που δεν ξέρω γιατί δεν σε έχουν βοηθήσει (αν έχεις κοιτάξει βέβαια...). Και χωρίς τη χρήση κάποιας ειδικής -για το modem που χρησιμοποιείς- βιβλιοθήκης. Επειδή το ρεπερτόριο εντολών AT είναι σειριακής βάσης (ας μου επιτραπεί ο όρος), σημαίνει πως μπορείς να "διατάξεις" οποιοδήποτε modem μέσω σειριακών μηνυμάτων να σου κάνει αυτό που θές (αυτό θα το κάνει το τηλέφωνό σου) και επίσης να μπορείς να ξεχωρίζεις πότε εμφανίζεται ένα συγκεκριμένο μήνυμα στο modem (αυτό που θα ελέγχεις εσύ για τα ρελέ) και ανάλογα να ενεργεί το ρελέ που θες.
> 
> Το πρώτο που βρήκα, χωρίς πολλά πολλά:
> 
> http://circuitdigest.com/microcontro...-using-arduino
> 
> Αν έχεις μικρή έστω επαφή με αυτά, θα ξεχωρίσεις πως ο κώδικας που παρατίθεται, αλλά και στην ανάλυση, ανεξάρτητα απο το ότι χρησιμοποιείται συγκεκριμένο modem της SIMCOM, μπορεί με πολύ μεγάλη ευκολία να προσαρμοστεί στις ανάγκες σου.
> Ψάξε και θα βρείς πολλά. Αλλά ψάξε όμως.



Μάνο καλημέρα και έλεγα πότε θα στείλεις,αν και με πλήγωσαν τα λόγια σου θα το ξεπεράσω...χαχαχαχχαχ....και βεβαία έχω ψάξει Μάνο
δεν θα σας εννοχλούσα εδώ εάν δεν είχα ασχολήθει μόνος μου απλά επειδή δεν έβρισκα κάτι που να λειτουργούσε για αυτό έστειλα σε εσάς επειδή εδώ κάποια παιδιά γνωρίζουν και προγραμματισμό.
Στην σελίδα που μου έστειλες τον κώδικα (την είχα βρει κι εγώ στην αναζήτηση και μου φάνηκε και εύκολη)τον δοκίμασα πριν 3 μέρες αφαίρεσα τα πάντα από τις εντολές lcd αλλά δεν ξέρω μήπως έκανα και καμιά βλακεία και διέγραψα και κάτι που δεν έπρεπε και δοκίμασα τον κώδικα και δεν μου δούλεψε.

----------


## manolena

Λοιπόν, γράφω λίγο κώδικα τώρα βασισμένο στο SIM900. Μισό να δώ πως θα στηθεί, να στο στείλω να το δοκιμάσεις. Βάσει λογικής θα πρέπει να δουλέψει (νομίζω...)

----------


## keap

> Λοιπόν, γράφω λίγο κώδικα τώρα βασισμένο στο SIM900. Μισό να δώ πως θα στηθεί, να στο στείλω να το δοκιμάσεις. Βάσει λογικής θα πρέπει να δουλέψει (νομίζω...)



Ευχαριστώ πολύ Μάνο για τον χρόνο σου,δεν ξέρω αν θύμασαι και πριν λίγους μήνες που  πάλευα και μία sim800l αλλά δεν δούλεψε αλλά αυτη για άλλο λόγο δεν ξεκίναγε,έτσι μου ήρθε να στις φέρω στην Ελευσίνα να δεις γιατί δεν δουλεύουν χαχαχαχχαχα.
τώρα αυτή είναι η 6η πλακέτα έχω και έχω ακόμα μία sim808 με gps που δεν την έχω δοκιμάσει.

----------


## SProg

Ολη η σειρα SIM9xx και SIM8χχ εχουν ιδιες ΑΤ εντολες και η λογικη ειναι η ιδια.

----------


## keap

> Ολη η σειρα SIM9xx και SIM8χχ εχουν ιδιες ΑΤ εντολες και η λογικη ειναι η ιδια.



Σάββα δίκιο έχεις και εγώ που τις έχω κοιτάξει ίδιες είναι και της A6 ίδιες είναι.
Άλλα το sim800l ήθελε κάτι για να ξεκινήσει που μέχρι στιγμής δεν το έχω βρει όσο και να έχω ψάξει.
Ασπούμε το Α6 θέλει μόνιμη τάση 5v στον pin power key,ενώ το sim800l δεν έχω βρει ακόμα τι θέλει.
Ξέφυγα λίγο από το θέμα.

----------


## SProg

Powerkey λεγεται και πρεπει να γινει LOW καποια δευτερολεπτα.Δεν ξερω αν ειναι ιδιο σε ολα.

Συνδεσε τον Αρντουινο και στελνε ΑΤ με ενα τερμιναλ να δεις τι μηνυματα επιστρεφει.

Ειναι ευκολο αυτο που θες αλλα ειμαι απο κινητο.Εγω θα το εκανα να μου κανει και αναπαντητη μετα απο το μνμ που θα στελνω σαν επιβεβαιωση.

----------


## keap

> Powerkey λεγεται και πρεπει να γινει LOW καποια δευτερολεπτα.Δεν ξερω αν ειναι ιδιο σε ολα.
> 
> Συνδεσε τον Αρντουινο και στελνε ΑΤ με ενα τερμιναλ να δεις τι μηνυματα επιστρεφει.
> 
> Ειναι ευκολο αυτο που θες αλλα ειμαι απο κινητο.Εγω θα το εκανα να μου κανει και αναπαντητη μετα απο το μνμ που θα στελνω σαν επιβεβαιωση.



Αυτό που λες με την αναπάντητη κάλο ακούγεται αλλα επειδή δεν γνωρίζω προγραμματισμό μου φαίνονται και λίγο βουνό να σου πω την αλήθεια έτσι το πάω σιγά σιγά και πάντα με την δικιά σας βοήθεια εδώ.
Όσο αναφορά το powerkey που λες το sim800l που έχω δεν έχει,το μόνο που βρήκα εχθές είναι ένα σχηματικό που δείχνει ένα NPN τρανζίστορ το οποίο να συνδέσω 5v->αντίσταση 1k ->b τρανζιστορ το e->gnd και c->pin reset του sim800l

----------


## manolena

https://www.elecrow.com/download/SIM...sign_V1.08.pdf

...σελ. 22

----------


## keap

> https://www.elecrow.com/download/SIM...sign_V1.08.pdf
> 
> ...σελ. 22



Μάνο το powerkey που δείχνει στο σχέδιο δεν έχει pin το sim800l που έχω, μόνο το reset pin μήπως εννοούν αυτό?

sim800l-1.jpg

----------


## keap

> https://www.elecrow.com/download/SIM...sign_V1.08.pdf
> 
> ...σελ. 22



Μάνο το powerkey που δείχνει στο σχέδιο δεν έχει pin το sim800l που έχω, μόνο το reset pin μήπως εννοούν αυτό?

sim800l-1.jpg

----------


## manolena

https://forum.arduino.cc/index.php?topic=329604.0

Διάβασε αυτό το νήμα.

Δεύτερον, δοκίμασε αυτό εδώ, είναι πολύ γρήγορο χωρίς πολλή σκέψη, τουλάχιστον να δεις αν κάνει κάτι:




```
#include <Wire.h> 
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
//===========================================
#define relay_1      5//DIGITAL PIN D5
#define relay_2      6//DIGITAL PIN D6
#define relay_3      7//DIGITAL PIN D7
#define relay_4      8//DIGITAL PIN D8
#define A6_POWER_PIN 9//DIGITAL PIN D9 for power up modem
//===========================================
SMSGSM sms;              //instance for the modem
//===========================================
boolean started = false;
char telnumber_1[] = "+306999999999"; //ΕΔΩ ΤΟΝ ΑΡΙΘΜΟ ΤΗΛΕΦΩΝΟΥ ΣΟΥ


char pos;
char *p;
char phone_number[20]; // array for the phone number string
char message[250];
int i = 0;
//===========================================
void setup()
{ 
   Wire.begin();
   Serial.begin(9600);
   pinMode(relay_1, OUTPUT);
   pinMode(relay_2, OUTPUT);
   pinMode(relay_3, OUTPUT);
   pinMode(relay_4, OUTPUT);
   pinMode(A6_POWER_PIN, OUTPUT);
   digitalWrite(relay_1, LOW);
   digitalWrite(relay_2, LOW);
   digitalWrite(relay_3, LOW);
   digitalWrite(relay_4, LOW);
   digitalWrite(A6_POWER_PIN, LOW);
   
   A6Power();
   if (gsm.begin(9600)) 
   {
     started=true;
   }  
}  
//===========================================
void loop()
{ 
  if(started) 
  {
    pos = sms.IsSMSPresent(SMS_UNREAD);
    if((int)pos > 0 && (int)pos <= 20) 
    {
      sms.GetSMS(pos, phone_number, message, 100);
      if(strcmp(phone_number,telnumber_1) == 0)// ΔΕΧΕΤΑΙ ΜΟΝΟ ΑΠΟ ΤΟ ΔΙΚΟ ΣΟΥ ΝΟΥΜΕΡΟ ΤΗΛΕΦΩΝΟΥ 
      {
        chooseRelayOutput();
      }
      pos = sms.IsSMSPresent(SMS_READ);  
    }   
    delay(1000);
  }
}
//===========================================
void A6Power()
{
  digitalWrite(A6_POWER_PIN, LOW);
  delay(1000);
  digitalWrite(A6_POWER_PIN, HIGH);
  delay(2000);
  digitalWrite(A6_POWER_PIN, LOW); 
}
//===========================================
void chooseRelayOutput()
{
  if(p == strstr(message,"RE1 ON"))//Πρέπει να στείλεις μήνυμα με το περιεχόμενο "RE1 ON"
  {
    digitalWrite(relay_1, HIGH);
  }
  else if(p == strstr(message,"RE1 OFF"))
  {
    digitalWrite(relay_1, LOW);
  }
  else if(p == strstr(message,"RE2 ON"))
  {
    digitalWrite(relay_2, HIGH);
  }
  else if(p == strstr(message,"RE2 OFF"))
  {
    digitalWrite(relay_2, LOW);
  }
  else if(p == strstr(message,"RE3 ON"))
  {
    digitalWrite(relay_3, HIGH);
  }
  else if(p == strstr(message,"RE3 OFF"))
  {
    digitalWrite(relay_3, LOW);
  }
  else if(p == strstr(message,"RE4 ON"))
  {
    digitalWrite(relay_4, HIGH);
  }
  else if(p == strstr(message,"RE4 OFF"))
  {
    digitalWrite(relay_4, LOW);
  }  
  
  sms.DeleteSMS((int)pos);  
}  
//===========================================
//===========================================
//===========================================
//===========================================
```


Οι βιβλιοθήκες συνημμένες.

----------


## keap

> https://forum.arduino.cc/index.php?topic=329604.0
> 
> Διάβασε αυτό το νήμα.
> 
> Δεύτερον, δοκίμασε αυτό εδώ, είναι πολύ γρήγορο χωρίς πολλή σκέψη, τουλάχιστον να δεις αν κάνει κάτι:
> 
> 
> 
> 
> ...



Κάνω έλεγχο στον κώδικα αφού εγκατέστησα τις βιβλιοθήκες
και εκεί που γράφεις την εντολή :

A6Power(); --> αυτήν την γραμμή την κάνει ροζ και μου γράφει κάτω στο σφάλμα...'A6Power' was not declared in this scope
if(gsm,begin(9600))
{
started =true;
}

----------


## keap

Και κάτι ακόμα που παρατήρησα Μάνο,διορθωσέμε εάν κάνω λάθος,
δίνεις εντολή για το pin powerkey άνοιγμα 2 δευτερόλεπτα και μετά πάλι κλείσημο,
σωστά?Όταν εγώ δοκίμασα την μονάδα και έκανε κλήση είχα μόνιμα συνδεδεμένα 5v στο powerkey χωρίς διακοπή.

----------


## manolena

```
#include <Wire.h> 
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
//===========================================
#define relay_1      5//DIGITAL PIN D5
#define relay_2      6//DIGITAL PIN D6
#define relay_3      7//DIGITAL PIN D7
#define relay_4      8//DIGITAL PIN D8
#define A6_POWER_PIN 9//DIGITAL PIN D9 for power up modem
//===========================================
SMSGSM sms;              //instance for the modem
//===========================================
boolean started = false;
char telnumber_1[] = "+306999999999"; //ΕΔΩ ΤΟΝ ΑΡΙΘΜΟ ΤΗΛΕΦΩΝΟΥ ΣΟΥ


char pos;
char *p;
char phone_number[20]; // array for the phone number string
char message[250];
int i = 0;
//===========================================
void setup()
{ 
   Wire.begin();
   Serial.begin(9600);
   pinMode(relay_1, OUTPUT);
   pinMode(relay_2, OUTPUT);
   pinMode(relay_3, OUTPUT);
   pinMode(relay_4, OUTPUT);
   pinMode(A6_POWER_PIN, OUTPUT);
   digitalWrite(relay_1, LOW);
   digitalWrite(relay_2, LOW);
   digitalWrite(relay_3, LOW);
   digitalWrite(relay_4, LOW);
   digitalWrite(A6_POWER_PIN, LOW);
   
   A6Power();
   if (gsm.begin(9600)) 
   {
     started=true;
   }  
}  
//===========================================
void loop()
{ 
  if(started) 
  {
    pos = sms.IsSMSPresent(SMS_UNREAD);
    if((int)pos > 0 && (int)pos <= 20) 
    {
      sms.GetSMS(pos, phone_number, message, 100);
      if(strcmp(phone_number,telnumber_1) == 0)// ΔΕΧΕΤΑΙ ΜΟΝΟ ΑΠΟ ΤΟ ΔΙΚΟ ΣΟΥ ΝΟΥΜΕΡΟ ΤΗΛΕΦΩΝΟΥ 
      {
        chooseRelayOutput();
      }
      pos = sms.IsSMSPresent(SMS_READ);  
    }   
    delay(1000);
  }
}
//===========================================
void A6Power()
{
  digitalWrite(A6_POWER_PIN, LOW);
  delay(1000);
  digitalWrite(A6_POWER_PIN, HIGH);
  delay(2000);
  digitalWrite(A6_POWER_PIN, LOW); 
}
//===========================================
void chooseRelayOutput()
{
  if(p == strstr(message,"RE1 ON"))//Πρέπει να στείλεις μήνυμα με το περιεχόμενο "RE1 ON"
  {
    digitalWrite(relay_1, HIGH);
  }
  else if(p == strstr(message,"RE1 OFF"))
  {
    digitalWrite(relay_1, LOW);
  }
  else if(p == strstr(message,"RE2 ON"))
  {
    digitalWrite(relay_2, HIGH);
  }
  else if(p == strstr(message,"RE2 OFF"))
  {
    digitalWrite(relay_2, LOW);
  }
  else if(p == strstr(message,"RE3 ON"))
  {
    digitalWrite(relay_3, HIGH);
  }
  else if(p == strstr(message,"RE3 OFF"))
  {
    digitalWrite(relay_3, LOW);
  }
  else if(p == strstr(message,"RE4 ON"))
  {
    digitalWrite(relay_4, HIGH);
  }
  else if(p == strstr(message,"RE4 OFF"))
  {
    digitalWrite(relay_4, LOW);
  }  
  
  sms.DeleteSMS((int)pos);  
}  
//===========================================
//===========================================
//===========================================
//===========================================
```


Και βέβαια είναι δηλωμένη, δεν καταλαβαίνω γιατί στο λέει αυτό.





> Και κάτι ακόμα που παρατήρησα Μάνο,διορθωσέμε εάν κάνω λάθος,
> δίνεις εντολή για το pin powerkey άνοιγμα 2 δευτερόλεπτα και μετά πάλι κλείσημο,
> σωστά?Όταν εγώ δοκίμασα την μονάδα και έκανε κλήση είχα μόνιμα συνδεδεμένα 5v στο powerkey χωρίς διακοπή.



Αφού σου δούλεψε έτσι, άστο έτσι. Με αυτά τα κινέζικα modules φροντίζεις να πας με τα νερά τους, ό,τι πούνε κάνεις, δεν βγαίνει άκρη αλλιώς.

----------


## keap

> ```
> #include <Wire.h> 
> #include "SIM900.h"
> #include <SoftwareSerial.h>
> #include "sms.h"
> //===========================================
> #define relay_1      5//DIGITAL PIN D5
> #define relay_2      6//DIGITAL PIN D6
> #define relay_3      7//DIGITAL PIN D7
> ...



Εάν διαγράψω τελείως τις εντολές που έχεις με κόκκινο και συνδέσω εγώ με ένα καλώδιο το powerkey στα 5v το ίδιο δεν είναι?Ή πρέπει να διαγράψω και κάτι άλλο από τον κώδικα?

----------


## manolena

Κάνε αυτό. Είναι το HW αντίστοιχο.

----------


## keap

> Κάνε αυτό. Είναι το HW αντίστοιχο.







> #include <Wire.h> #include "SIM900.h"
> #include <SoftwareSerial.h>
> #include "sms.h"
> //===========================================
> #define relay_1      5//DIGITAL PIN D5
> #define relay_2      6//DIGITAL PIN D6
> #define relay_3      7//DIGITAL PIN D7
> #define relay_4      8//DIGITAL PIN D8
> #define A6_POWER_PIN 9//DIGITAL PIN D9 for power up modem
> ...



Το έκανα και τώρα που ξαναέκανα έλεγχο μου έβγαλε σφάλμα αυτο που σου έχω με κόκκινο.

----------


## manolena

Καλά, πλάκα μας κάνει; Αφού η συνάρτηση αυτή υπάρχει απο κάτω, δεν τη βλέπεις κι εσύ;

----------


## keap

> Καλά, πλάκα μας κάνει; Αφού η συνάρτηση αυτή υπάρχει απο κάτω, δεν τη βλέπεις κι εσύ;



Κι εγώ το βλέπω απλά στο έβαλα για να το δεις μην έχω κάνει εγώ καμιά πατάτα

----------


## manolena

Κωνσταντίνε,

Πάνω σε έναν MEGA1280 που έχω, έχω καρφώσει ένα τέτοιο

SIM900_GPRS_shield_v1.1.jpghttp://wiki.epalsite.com/index.php?title=SIM900_Quad-Band_GPRS_shield_with_Micro_SD_card_slot

...και μια σειριακή LCD για να βλέπω και τι μου γίνεται. Του έχω πεί να περιμένει μόνο απο το νούμερο του τηλεφώνου μου μήνυμα της μορφής
"RE1 ON" ή "RE1 OFF" και μόλις το δεχθεί να το γράψει στην οθόνη και να ενεργοποιήσει μια έξοδο αντίστοιχα. Δουλεύει μια χαρά με τον κώδικα
που σου παραθέτω αλλά και τις βιβλιοθήκες τις προηγούμενες. Δεν μπορώ να κάνω κάτι άλλο. Με τα μέσα που έχω και αφού δουλεύει, δεν μπορώ να κάνω κάτι άλλο, ειλικρινά.

----------


## manolena

```
#include <Wire.h>
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include <LiquidCrystal_I2C.h>
//===========================================
#define relay_1      5//DIGITAL PIN D5
#define relay_2      6//DIGITAL PIN D6
#define relay_3      9//DIGITAL PIN D9
#define relay_4      8//DIGITAL PIN D8
#define A6_POWER_PIN 7//DIGITAL PIN D7 for power up modem
#define LCD_I2C_ADDRESS     0x27
#define cols     20
#define lines    4
//===========================================
LiquidCrystal_I2C lcd(LCD_I2C_ADDRESS, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
SMSGSM sms;              //instance for the modem
//===========================================
boolean started = false;
String textForSMS = String(""); 
char telnumber_1[] = "+30694348...."; //ΕΔΩ ΤΟΝ ΑΡΙΘΜΟ ΤΗΛΕΦΩΝΟΥ ΣΟΥ


char pos;
char *p;
char phone_number[20]; // array for the phone number string
char message[250];
int i = 0;
//===========================================
void(* resetFunc) (void) = 0x00;
//===========================================
void setup()
{ 
   Wire.begin();
   lcd.begin(cols, lines);
   Serial.begin(9600);
   pinMode(relay_1, OUTPUT);
   pinMode(relay_2, OUTPUT);
   pinMode(relay_3, OUTPUT);
   pinMode(relay_4, OUTPUT);
   pinMode(A6_POWER_PIN, OUTPUT);
   digitalWrite(relay_1, LOW);
   digitalWrite(relay_2, LOW);
   digitalWrite(relay_3, LOW);
   digitalWrite(relay_4, LOW);
   digitalWrite(A6_POWER_PIN, LOW);
   lcd.setCursor(0,0);
   lcd.print("Modem power up...   ");
   
   A6Power();
   if (gsm.begin(9600)) 
   {
     started=true;
     lcd.setCursor(0,0);
     lcd.print("Modem is Ready.     ");
     lcd.setCursor(0,1);
     lcd.print("Waiting for SMS...  ");
     delay(2000);
   }
   else
   {
     lcd.setCursor(0,0);
     lcd.print("Modem fault.        ");
     lcd.setCursor(0,1);
     lcd.print("Restarting...       ");
     delay(2000);
     resetFunc(); 
   }  
   
}  
//===========================================
void loop()
{ 
  if(started) 
  {
    pos = sms.IsSMSPresent(SMS_UNREAD);
    if((int)pos > 0 && (int)pos <= 20) 
    {
      sms.GetSMS(pos, phone_number, message, 100);
      lcd.setCursor(0,0);
      lcd.print("Received SMS from:  ");
      lcd.setCursor(0,1);
      lcd.print(phone_number);
      lcd.print("      ");
      delay(3000);
      if(strcmp(phone_number,telnumber_1) == 0)// ΔΕΧΕΤΑΙ ΜΟΝΟ ΑΠΟ ΤΟ ΔΙΚΟ ΣΟΥ ΝΟΥΜΕΡΟ ΤΗΛΕΦΩΝΟΥ 
      {
        chooseRelayOutput();
      }
      pos = sms.IsSMSPresent(SMS_READ);  
    }   
    delay(1000);
  }
}
//===========================================
void A6Power()
{
  digitalWrite(A6_POWER_PIN, LOW);
  delay(1000);
  digitalWrite(A6_POWER_PIN, HIGH);
  delay(2000);
  digitalWrite(A6_POWER_PIN, LOW); 
}
//===========================================
void chooseRelayOutput()
{
  if(p == strstr(message,"RE1 ON"))
  {
    digitalWrite(relay_1, HIGH);
    lcd.setCursor(0,0);
    lcd.print("RE1 ON              ");
    lcd.setCursor(0,1);
    lcd.print("                    ");
    sms.DeleteSMS((int)pos); 
  }
  else if(p == strstr(message,"RE1 OFF"))
  {
    digitalWrite(relay_1, LOW);
    lcd.setCursor(0,0);
    lcd.print("RE1 OFF             ");
    lcd.setCursor(0,1);
    lcd.print("                    ");
    sms.DeleteSMS((int)pos); 
  }
  else if(p == strstr(message,"RE2 ON"))
  {
    digitalWrite(relay_2, HIGH);
    lcd.setCursor(0,0);
    lcd.print("RE2 ON              ");
    lcd.setCursor(0,1);
    lcd.print("                    ");
    sms.DeleteSMS((int)pos); 
  }
  else if(p == strstr(message,"RE2 OFF"))
  {
    digitalWrite(relay_2, LOW);
    lcd.setCursor(0,0);
    lcd.print("RE2 OFF             ");
    lcd.setCursor(0,1);
    lcd.print("                    ");
    sms.DeleteSMS((int)pos); 
  }
  else if(p == strstr(message,"RE3 ON"))
  {
    digitalWrite(relay_3, HIGH);
    lcd.setCursor(0,0);
    lcd.print("RE3 ON              ");
    lcd.setCursor(0,1);
    lcd.print("                    ");
    sms.DeleteSMS((int)pos); 
  }
  else if(p == strstr(message,"RE3 OFF"))
  {
    digitalWrite(relay_3, LOW);
    lcd.setCursor(0,0);
    lcd.print("RE3 OFF             ");
    lcd.setCursor(0,1);
    lcd.print("                    ");
    sms.DeleteSMS((int)pos); 
  }
  else if(p == strstr(message,"RE4 ON"))
  {
    digitalWrite(relay_4, HIGH);
    lcd.setCursor(0,0);
    lcd.print("RE4 ON              ");
    lcd.setCursor(0,1);
    lcd.print("                    ");
    sms.DeleteSMS((int)pos); 
  }
  else if(p == strstr(message,"RE4 OFF"))
  {
    digitalWrite(relay_4, LOW);
    lcd.setCursor(0,0);
    lcd.print("RE4 OFF             ");
    lcd.setCursor(0,1);
    lcd.print("                    ");
    sms.DeleteSMS((int)pos); 
  }  
   
  delay(5000);
  lcd.setCursor(0,0);
  lcd.print("Modem is Ready.     ");
  lcd.setCursor(0,1);
  lcd.print("Waiting for SMS...  "); 
}  
//===========================================
//===========================================
//===========================================
//===========================================
```


Ξαναλέω, δουλεύει κανονικά με αυτά που έχω εγώ και με τις δικές σου απαιτήσεις. Δεν ξέρω τι άλλο μπορεί να γίνεται και δεν μπορώ να κάνω κάτι παραπάνω για αυτό.
Λυπάμαι που δεν βρήκα ΜΩΒ μαρκαδόρο με glitter για να γράψω το ταμπελάκι.

----------


## nkarama

> Εδώ είναι οι εντολές αλλά πάλι δεν μπορώ να βγάλω άκρη.
> 
> http://smart-prototyping.com/image/d...T_Commends.pdf
> 
> Δίπλα σε κάποιες εντολές πρέπει να γράψω κάποια νούμερα πως θα βρω ποιά είναι τα σωστά πχ AT+CNMI=2,2,0,0,0



θα πρέπει να ξέρεις ποιες από αυτές υποστηρίζει το hardware σου και ο provider. 



Σε γενικές γραμμές η default συμπεριφορά όταν έρχεστε ένα SMS είναι να αποθηκευεί σε κάποια από τις μνήμες της sim με ένα flag που σημαίνει ότι είναι αδιάβαστο. (Αυτή την συμπεριφορά είναι που αλλάζεις με την +CNMI)
 Κάθε τόσο, ελέγχω μια μια τις μνήμες για να δω αν περιέχουν κάτι. Αν περιέχουν το διαβάζω, το αποκωδικοποιώ (βλέπω τι εντολή περιέχει και τις εκτελώ, πχ άνοιγμα Ρέλε κτλ κτλ) , και μετά το σβήνω από την μνήμη και συνεχίζω με την επόμενη. Τα σβήνω για να είμαι σίγουρος ότι αν βρω κάτι την επόμενη φορά που θα κοιτάξω αυτή τη θέση μνήμης θα είναι ένα νέο sms, όποτε δεν χρειάζεστε να βρίσκω από το response της at εντολής αν είναι διαβασμένο ή όχι. 

Προσωπικά εμένα με βολεύει έτσι. Δεν χρειάζεται να γράφω κώδικα για σύγχρονη επικοινωνία όπως θα χρειαζόταν αν είχα αλλάξει την συμπεριφορά με κάποια άλλη πχ να στέλνει το κάθε νέο εισερχόμενο μήνυμα στη σειριακή.

ΥΓ. Οι παράμετροι  σε αγκύλες ειναι προαιρετικές και μπορεί να παραληφθούν.

----------


## keap

> Κωνσταντίνε,
> 
> Πάνω σε έναν MEGA1280 που έχω, έχω καρφώσει ένα τέτοιο
> 
> Συνημμένο Αρχείο 68021http://wiki.epalsite.com/index.php?title=SIM900_Quad-Band_GPRS_shield_with_Micro_SD_card_slot
> 
> ...και μια σειριακή LCD για να βλέπω και τι μου γίνεται. Του έχω πεί να περιμένει μόνο απο το νούμερο του τηλεφώνου μου μήνυμα της μορφής
> "RE1 ON" ή "RE1 OFF" και μόλις το δεχθεί να το γράψει στην οθόνη και να ενεργοποιήσει μια έξοδο αντίστοιχα. Δουλεύει μια χαρά με τον κώδικα
> που σου παραθέτω αλλά και τις βιβλιοθήκες τις προηγούμενες. Δεν μπορώ να κάνω κάτι άλλο. Με τα μέσα που έχω και αφού δουλεύει, δεν μπορώ να κάνω κάτι άλλο, ειλικρινά.



Καλημέρα Μάνο, τώρα με πλήγωσες πραγματικά, οι φωτογραφίες σου είναι σαν μαχαίρι στην καρδιά μου....χαχαχαχχαχαχ...θα κοιτάξω γιατί μου βγάζει σφάλματα να διορθώσω αρχικά αυτό και μετά περνάω τον κώδικα,και πάλι σ'ευχαριστώ πολύ...

----------


## Kernel Panic

> Το έκανα και τώρα που ξαναέκανα έλεγχο μου έβγαλε σφάλμα αυτο που σου έχω με κόκκινο.



είναι η ώρα να δοκιμάσεις μερικά "_μαγικά_" 
1) ξαναγράψε την εντολή, όχι copy paste.
2) μετέφερε το sketch στην θέση που έχεις δηλώσει στο sketchbook
3) μετέφερε όλο το _void loop()_ στο τέλος του sketch
4) πες μας ποιο από τα  "_μαγικά_" έκανε την διαφορά.

άσχετο, αυτό με το χρώμα των μαρκαδόρων του manolena είναι κάποιο παιχνίδι που έπρεπε να το καταλάβω?
οχι τίποτε άλλο, αρχίζω και ανησυχώ αν πρέπει να δω το IQ μου, 

τα λέμε του χρόνου καλή χρονιά.

----------


## manolena

> ..άσχετο, αυτό με το χρώμα των μαρκαδόρων του manolena είναι κάποιο παιχνίδι που έπρεπε να το καταλάβω?
> οχι τίποτε άλλο, αρχίζω και ανησυχώ αν πρέπει να δω το IQ μου...



Α, είναι ολόκληρη ιστορία. Πρέπει να διαβάσεις πολλά για να καταλήξεις εδώ:

http://www.hlektronika.gr/forum/show...l=1#post794425

...μετά εδώ:

http://www.hlektronika.gr/forum/show...l=1#post794434

...και όλα τα υπόλοιπα απο εκεί και κάτω. Όσο για τα ταμπελάκια, θα καταλάβεις. Μην ανησυχείς για το IQ σου απο αυτήν εδώ την αναφορά σε μαρκαδόρους, αυτό που πρέπει να ανησυχείς είναι για την ψυχική σου γαλήνη κι εσύ και αρκετοί άλλοι (μαζί κι εγώ), είναι αν δίνουμε υπέρμετρη σημασία σε ανούσιες βλακείες.

Καλή Χρονιά σε όλους, ανεξαιρέτως.

----------


## lepouras

προβλέπω να έχουμε διαιτησίες για τα πνευματικά δικαιώματα του χρώματος του μαρκαδόρου.....  :Lol:

----------


## Fire Doger

Βάλε το sketch στο default φάκελο, Τα έγγραφά μου ->Arduino -> xxx
Έχει θέμα ο compiler και εμένα δεν μου δεχόταν συναρτήσεις σε άλλα tab και ότι ήταν ποιο κάτω. Σε εκείνη την τοποθεσία δουλεύει κομπλέ, μου είχε δουλέψει και το να τις δηλώνω στην αρχή με την μορφή "void _chooseRelayOutput_();" και μετά κάτω ξανά με τον κώδικα σε αγκύλες.

----------


## Kernel Panic

> Α, είναι ολόκληρη ιστορία. Πρέπει να διαβάσεις πολλά για να καταλήξεις εδώ:
> 
> http://www.hlektronika.gr/forum/show...l=1#post794425
> 
> ...μετά εδώ:
> 
> http://www.hlektronika.gr/forum/show...l=1#post794434
> 
> ...και όλα τα υπόλοιπα απο εκεί και κάτω. Όσο για τα ταμπελάκια, θα καταλάβεις. Μην ανησυχείς για το IQ σου απο αυτήν εδώ την αναφορά σε μαρκαδόρους, αυτό που πρέπει να ανησυχείς είναι για την ψυχική σου γαλήνη κι εσύ και αρκετοί άλλοι (μαζί κι εγώ), είναι αν δίνουμε υπέρμετρη σημασία σε ανούσιες βλακείες.
> ...



Ναι το είχα διαβάσει (διαγώνια) και δεν έδωσα σημασία, η προστασία της ψυχικής γαλήνης που λες, τώρα τ'οπιασα το θέμα.
Πάντως στο χωριό μου λένε, είτε φήμη είτε δυσφήμηση και τα δυο είναι διαφήμιση.
Και μετά την υπέρμετρη σημασία, κατά την γνώμη μου, όλα δείχνουν ότι ο τρόπος της υπογραφής με το συγκεκριμένο χρώμα μαρκαδόρου στο τέλος έχουν κατοχυρωθεί ηθικά στον Spark
Επειδή τα θέλω μου είναι πολλά, ΔΕΝ ΘΕΛΩ άλλη γκρίνια, απαισιοδοξία και επιθετικότητα..... ΚΑΛΗ ΧΡΟΝΙΑ!!!!!

----------


## manolena

Καλησπέρα και Καλή Χρονιά!

Έκανα μερικές αλλαγές στα παραπάνω, τώρα είναι ολοκληρωμένο. Για να είναι πιο εύκολο, οι έξοδοι των ρελέ είναι στα Α0-Α3, ενώ η κατάστασή τους φαίνεται πια και στην οθόνη LCD και στο σειριακό terminal όπως στις εικόνες.

----------


## keap

> Καλησπέρα και Καλή Χρονιά!
> 
> Έκανα μερικές αλλαγές στα παραπάνω, τώρα είναι ολοκληρωμένο. Για να είναι πιο εύκολο, οι έξοδοι των ρελέ είναι στα Α0-Α3, ενώ η κατάστασή τους φαίνεται πια και στην οθόνη LCD και στο σειριακό terminal όπως στις εικόνες.



Καλησπέρα Χρόνια Πολλά και Καλή Χρονιά
Ένα μεγάλο ευχαριστώ για τον χρόνο σου,τελικά τον έβαλα τον κώδικα αλλά δυστηχώς δεν δούλεψε μετά δοκίμασα πάλι τον κώδικα για να κάνω μία κλήση και λειτούργησε κανονικά,έχεις καμιά ιδέα το τι κάνω λάθος?
Εσένα βλέπω ότι λειτουργεί μια χαρά,εγώ καταραμένος είμαι....χαχχαχα....ότι εχω βρει σε βίντεο σε site το έχω δοκιμάσει σε όλους δουλεύουν μια χαρά μόνο σε μένα δεν λειτουργούν.

----------


## manolena

Αν δεν βάλεις εδώ τον κώδικα που ΔΕΝ δούλεψε αλλά και τον κώδικα ΠΟΥ δούλεψε για να συγκριθούν, δεν μπορεί κανείς να σου πεί κάτι.

----------


## keap

> Αν δεν βάλεις εδώ τον κώδικα που ΔΕΝ δούλεψε αλλά και τον κώδικα ΠΟΥ δούλεψε για να συγκριθούν, δεν μπορεί κανείς να σου πεί κάτι.



Καλημέρα Μάνο , αυτός που δεν δούλεψε είναι αυτός που μου έστειλες,αυτός δηλαδή



> ```
>   #include <Wire.h> #include "SIM900.h"
> #include <SoftwareSerial.h>
> #include "sms.h"
> //===========================================
> #define relay_1      5//DIGITAL PIN D5
> #define relay_2      6//DIGITAL PIN D6
> #define relay_3      7//DIGITAL PIN D7
> #define relay_4      8//DIGITAL PIN D8
> ...



και αυτός που δοκίμασα να κάνει μία κλήση είναι αυτός





> ```
>  
> char phone_no[]="6955108660";
> 
> 
> void setup()
> {
> Serial.begin(9600);  
> delay(200);
> ...

----------


## manolena

Αν δείς στο #20 σου έχω επισυνάψει ολόκληρη τη βιβλιοθήκη GSM για δύο configuration: με UNO και MEGA. Αυτό γιατί τα shields που καρφώνεις σε UNO πέφτουν σε άλλα πινάκια απο του MEGA. Κάνε ένα zip backup τη βιβλιοθήκη που έχεις και εγκατέστησε αυτήν για τον UNO. Χρησιμοποίησε τον πρώτο κώδικα που και καλά δεν δουλεύει και πες μας.

----------


## keap

> Αν δείς στο #20 σου έχω επισυνάψει ολόκληρη τη βιβλιοθήκη GSM για δύο configuration: με UNO και MEGA. Αυτό γιατί τα shields που καρφώνεις σε UNO πέφτουν σε άλλα πινάκια απο του MEGA. Κάνε ένα zip backup τη βιβλιοθήκη που έχεις και εγκατέστησε αυτήν για τον UNO. Χρησιμοποίησε τον πρώτο κώδικα που και καλά δεν δουλεύει και πες μας.



Καλησπέρα Μάνο έβαλα τις βιβλιοθήκες που είχες ανεβάσει εσύ.
Και σύνδεσα όπως φαίνεται παρακάτω
ARDUINO      GSM A6
 RX (0) -->   TX
 TX (1) -->   RX
 GND    -->  GND
             PWR KEY Μόνιμα στο +5v


Στον arduino έβαλα τάση από usb στον υπολογιστή
και στο gsm a6 έχει usb θύρα και το σύνδεσα σε ένα τροφοδοτικό κινητού 5v 2.1a.

----------


## manolena

Χρησιμοποίησες τη βιβλιοθήκη για τον UNO και δεν δουλεψε;

----------


## SProg

> PWR KEY Μόνιμα στο +5v




.........

----------


## keap

> Χρησιμοποίησες τη βιβλιοθήκη για τον UNO και δεν δουλεψε;



Ναι Μάνο γι αυτο σου ανέβασα πως τα σύνδεσα μήπως και έχω κάνει καμιά πατάτα εγώ,γιατί σε σένα απ'ότι είδα λειτουργεί κανονικά.
Την βιβλιοθήκη σου την έκανα εγκατάσταση μέσα από το arduino ide.

----------


## keap

> .........



Σάββα φαίνεται περίεργο το ξέρω αλλά έτσι το σύνδεσα και μόλις έβαλα τον κώδικα με at commands να μου κάνει μία κλήση στο κινητό την έκανε κανονικά,έχεισ καμιά ιδέα?

----------


## keap

Καλησπέρα στα παιδιά και πάλι,δοκίμασα με το Terminal v1.9 και ένα FTDI232 να συνδέσω το gsm a6 και δοκίμασα ότι μπορούσα για να μπορέσω να καταλάβω ότι λειτουργεί,δοκίμασα κλήση από το κινητό μου στην πλακέτα,όλα καλά δοκίμασα μήνυμα και εκεί όλα καλά μετά δοκίμασα κάτι άλλες εντολές άλλες απαντούσανε οκ και άλλες error,σας βάζω ακριβώς όλα όσα έγραψε από την ώρα που ξεκίνησα και σύνδεσα την πλακέτα στον υπολογιστή.Θα ήθελα αν μπορείτε να καταλάβετε εσείς πως μπορώ να κάνω αυτό που θέλω με τους ρελέδες και να μου πείτε την γνώμη σας.Ευχαριστώ πολύ για τον χρόνο σας.




> ^CINIT: 1, 0, 0
> 
> ^CINIT: 2, 32, 41891
> 
> 
> ^STN: 33
> 
> 
> ^CINIT: 4, 8192, 33
> ...

----------


## keap

Καλησπέρα Μάνο είναι εύκολο να ανεβάσεις τον κώδικα με την οθόνη και το σχεδιάγραμμα να τον δοκιμάσω και αν  δεν σου κάνει κόπο να δεις και αυτά που ανέβασα με το terminal.
Ευχαριστώ πολύ




> Καλησπέρα και Καλή Χρονιά!
> 
> Έκανα μερικές αλλαγές στα παραπάνω, τώρα είναι ολοκληρωμένο. Για να είναι πιο εύκολο, οι έξοδοι των ρελέ είναι στα Α0-Α3, ενώ η κατάστασή τους φαίνεται πια και στην οθόνη LCD και στο σειριακό terminal όπως στις εικόνες.

----------


## manolena

Καλημέρα Κωνσταντίνε,
Πάλι αργοπορημενος είμαι... Θα ετοιμάσω ένα πρόχειρο σχηματικό για αυτό που εστησα όπως και τον κώδικα και θα τα ανεβάσω. Σημείωση: έχω κάνει το εξής αν σε ενδιαφέρει, εκτός από μήνυμά που μπορείς να στείλεις στο modem και να αλλάξεις κατάσταση στα ρελε, μπορείς απλά να του κάνεις μία κλήση και να ελέγξεις τα ρελε με τόνους DTMF. Εκείνο θα σου απαντάει πάλι με τόνους (δύο για ΟΝ έναν για OFF). Χωρίς πλάκα, δουλεύει ωραία αλλά με το shield που έχω εγώ.

----------


## keap

> Καλημέρα Κωνσταντίνε,
> Πάλι αργοπορημενος είμαι... Θα ετοιμάσω ένα πρόχειρο σχηματικό για αυτό που εστησα όπως και τον κώδικα και θα τα ανεβάσω. Σημείωση: έχω κάνει το εξής αν σε ενδιαφέρει, εκτός από μήνυμά που μπορείς να στείλεις στο modem και να αλλάξεις κατάσταση στα ρελε, μπορείς απλά να του κάνεις μία κλήση και να ελέγξεις τα ρελε με τόνους DTMF. Εκείνο θα σου απαντάει πάλι με τόνους (δύο για ΟΝ έναν για OFF). Χωρίς πλάκα, δουλεύει ωραία αλλά με το shield που έχω εγώ.



Καλησπέρα Μάνο,από που είπαμε πήρες το δικό σου???χαχαχχα
Εγώ βασανήστηκα με τα δικά μου αλλά είπα εάν πάνε όλα καλά και δουλέψει θα κόψω και το κάπνισμα...Τώρα στο θέμα μας καλό μου ακούγεται αυτό με την κλήση και θέλω να πιστεύω οτι εάν δεν μου δουλέψει με τα sms (γιατί έφτιαξα και την εφαρμογή σε android μην παει και τσάμπα ο κόπος μου) 2 οι λύσεις πρώτον το δοκιμάζουμε με κλήσεις και δεύτερων μου λες που να στο στείλω και πόσο θα μου κοστίσει....χαχαχχα.Αυτο που ανέβασα πρόλαβες να ρίξεις καμοία ματιά να μου πεις την γνώμη σου?

Υ.Γ. Θα ζητήσω και μία χάρη ακόμα εάν φυσικά μπορείς και αν έχεις όρεξει,βέβαια είναι άσχετο με το θέμα αύτο,βρήκα ένα ποστ που έκανες για ένα σταθμό κόλλησης με arduino nano και σκέφτομαι να το φτιάξω,έχει μεγάλη δυσκολία?

Και πάλι σε ευχαριστώ πολύ για τον χρόνο σου?

----------


## manolena

Κωνσταντίνε, 

ένα μικρό μπλοκ διάγραμμα με αυτό που έχω κάνει εγώ για τις δοκιμές. Επαναλαμβάνω πως είναι στημένο πάνω σε έναν arduino MEGA1280 με τη συγκεκριμένη shield του modem και χωρίς την πλακέτα των ρελέ. Αυτό δεν σημαίνει πως δεν θα δουλέψει με έναν UNO, απλά θα πρέπει να χρησιμοποιηθούν λίγο διαφορετικές βιβλιοθήκες (αυτή που σου είχα στείλει για UNO). Παραθέτω και τον κώδικα που έχω εξελίξει λίγο για έλεγχο με DTMF. Οι τηλεφωνικοί αριθμοί που το ελέγχουν είναι μέχρι 3 αλλά μπορούν να προστεθούν ή να αφαιρεθούν όσοι θέλεις. Το έκανα έτσι για να μην ενοχλείται απο άσχετα νούμερα όταν το καλούν.

----------


## manolena

```
#include <Wire.h>
#include "SIM900.h"
#include <SoftwareSerial.h>
#include <string.h> 
#include <stdio.h> 
#include "sms.h"
#include "call.h"
#include <LiquidCrystal_I2C.h>
#include <EEPROMEx.h>
#include <DirectIO.h>
//===========================================
#define relay_1      A0//DIGITAL PIN A0//PORTF0
#define relay_2      A1//DIGITAL PIN A1//PORTF1
#define relay_3      A2//DIGITAL PIN A2//PORTF2
#define relay_4      A3//DIGITAL PIN A3//PORTF3
#define A6_POWER_PIN 7//DIGITAL PIN D7 for power up modem
#define LCD_I2C_ADDRESS         0x27
#define cols                    20
#define lines                   4
#define LEFT_BAR                1
#define RIGHT_BAR               2
#define RELAYS_STATUS_ADDRESS   0x00
#define BUZZER_PIN              13
//===========================================
LiquidCrystal_I2C lcd(LCD_I2C_ADDRESS, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
SMSGSM sms;              //instance for the modem
CallGSM call;
OutputPort<PORT_F, 0, 4> relaysPort;
//===========================================
boolean started = false;
boolean incomingCall = false;
String textForSMS = String(""); 
char telnumber_1[] = "+3069........"; //ΕΔΩ ΤΟΝ ΑΡΙΘΜΟ ΤΗΛΕΦΩΝΟΥ ΣΟΥ
char telnumber_2[] = "+3069........"; //ΕΔΩ ΤΟΝ ΑΡΙΘΜΟ ΤΗΛΕΦΩΝΟΥ ΣΟΥ
char telnumber_3[] = "+3069........"; //ΕΔΩ ΤΟΝ ΑΡΙΘΜΟ ΤΗΛΕΦΩΝΟΥ ΣΟΥ


byte stat = 0;
char pos;
char *p1on, *p1off, *p2on, *p2off, *p3on, *p3off, *p4on, *p4off, *modemResponse;
char phone_number[20]; // array for the phone number string
char message[100];
char sms_text[100];
char timeStamp[50];
char DTMF_char='_';
int i = 0;


byte relaysStatusByte = 0x00;


char dataBuffer[28] = {"Waiting for SMS or Call... "};
int g_nPosition = 0;
const int DATA_LENGTH = 27;
byte dtmfSound = 255;
//===========================================
void(* resetFunc) (void) = 0x00;
//===========================================
void setup()
{ 
  Wire.begin();
  lcd.begin(cols, lines);
  Serial.begin(9600);
  Serial1.begin(9600); 
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW); 
  beepBuzzer(6250,30);
  
  lcd.setCursor(0,0);
  lcd.print("  ARDUINO - SIM900  ");
  lcd.setCursor(0,1);
  lcd.print("REMOTE CONTROL SYS. ");
  lcd.setCursor(0,2);
  lcd.print("   v1.01 JAN2017    ");
  lcd.setCursor(0,3);
  lcd.print("   (C) MANOS MAR.   ");
  delay(3500);
  lcd.clear();
  
  Serial.println(F(" ___________________________________________"));
  Serial.println(F("|                                           |"));
  Serial.println(F("| ARDUINO-SIM900 REMOTE CONTROL SYSTEM v1.0 |"));
  Serial.println(F("|         (C) MANOS MAR 31DEC2016           |"));
  Serial.println(F("|             Modem power up...             |"));  
  Serial.println(F("|              Wait a minute...             |"));  
  Serial.println(F("|___________________________________________|"));
 
  lcd.print("Modem power up...   ");
  lcd.setCursor(0,1);
  lcd.print("Wait a minute...    "); 
  
  pinMode(A6_POWER_PIN, OUTPUT);
  digitalWrite(A6_POWER_PIN, LOW);   


  byte leftBar[8] = {
    B11000,
    B11100,
    B11110,
    B11111,
    B11111,
    B11110,
    B11100,
    B11000
  }; 
  lcd.createChar(LEFT_BAR, leftBar);


  byte rightBar[8] = {
    B00011,
    B00111,
    B01111,
    B11111,
    B11111,
    B01111,
    B00111,
    B00011
  }; 
  lcd.createChar(RIGHT_BAR, rightBar);


  //EEPROM.writeByte(RELAYS_STATUS_ADDRESS, B00001101);   


  relaysStatusByte = EEPROM.readByte(RELAYS_STATUS_ADDRESS); 
  if(relaysStatusByte == 0xFF)
  {
    EEPROM.writeByte(RELAYS_STATUS_ADDRESS, 0);
    delay(100);
    relaysStatusByte = EEPROM.readByte(RELAYS_STATUS_ADDRESS); 
  }  


  relaysPort = relaysStatusByte;     
  
  A6Power();


  if (gsm.begin(9600)) 
  {
    started=true;
    Serial.println(F(" ___________________________________________"));
    Serial.println(F("|                                           |"));
    Serial.println(F("|   Modem connection established. Ready.    |"));
    Serial.println(F("|___________________________________________|")); 
    gsm.SendATCmdWaitResp("ATA\r\n", 500, 100, "OK", 5);
    gsm.SendATCmdWaitResp("AT+CLIP=1\r\n", 500, 100, "OK", 5);
    call.SetDTMF(true);
    lcd.setCursor(0,0);
    lcd.print("Modem is ready.     ");
    delay(2000);
  }
  else
  {
    Serial.println(F(" ___________________________________________"));
    Serial.println(F("|                                           |"));
    Serial.println(F("|  Modem failed to connect to the network.  |"));
    Serial.println(F("|___________________________________________|")); 
    lcd.setCursor(0,0);
    lcd.print("Modem fault.        ");
    lcd.setCursor(0,1);
    lcd.print("Restarting...       ");
    delay(2000);
    resetFunc(); 
  }  
  Serial.println(F(" ___________________________________________"));
  Serial.println(F("|                                           |"));
  Serial.println(F("|              Setup complete!              |"));
  Serial.println(F("|___________________________________________|")); 
  beepBuzzer(6250,100);
  lcd.setCursor(0,2);
//  lcd.print("<RE1><RE2><RE3><RE4>");
  lcd.print(" RE1  RE2  RE3  RE4 ");
/*  
  lcd.setCursor(0,2); 
  lcd.write(LEFT_BAR);
  lcd.setCursor(4,2); 
  lcd.write(RIGHT_BAR); 
  lcd.write(LEFT_BAR);
  lcd.setCursor(9,2); 
  lcd.write(RIGHT_BAR); 
  lcd.write(LEFT_BAR); 
  lcd.setCursor(14,2); 
  lcd.write(RIGHT_BAR); 
  lcd.write(LEFT_BAR); 
  lcd.setCursor(19,2); 
  lcd.write(RIGHT_BAR);
*/
  checkRelaysPort(); 
}  
//===========================================
void loop()
{ 
  static byte index = 0;


  scrollDataDisplay(1, 1);
  
  stat = call.CallStatusWithAuth(phone_number, 0, 0);
  if(stat == CALL_INCOM_VOICE_AUTH)
  {
    incomingCall = true;
  }
  else
  {
    incomingCall = false;
  }  
  
  if(incomingCall)
  {
    checkForCall(); 
  }
  
  if(started) 
  {
    pos = sms.IsSMSPresent(SMS_UNREAD);
    if(pos) 
    {
      SMSBeep();     
      sms.GetSMS(pos, phone_number, message, 100); 
      Serial.print(F("\nReceived SMS from: "));  
      Serial.println(phone_number);
      Serial.println(message);
      Serial.println();      
      if((strcmp(phone_number,telnumber_1) == 0) 
        || (strcmp(phone_number,telnumber_2) == 0) 
        || (strcmp(phone_number,telnumber_3) == 0))// ΔΕΧΕΤΑΙ ΜΟΝΟ ΑΠΟ ΤΟ ΔΙΚΟ ΣΟΥ ΝΟΥΜΕΡΟ ΤΗΛΕΦΩΝΟΥ 
      {
        lcd.setCursor(0,0);
        lcd.print("Received SMS from:  ");
        lcd.setCursor(0,1);
        lcd.print(phone_number);
        lcd.print("       ");
        delay(2000); 
        chooseRelayOutput();
        sendSMS();
        deleteSMS();
      }
      pos = sms.IsSMSPresent(SMS_READ);  
    }
//    else
//    {
//      Serial.flush();
//      scrollDataDisplay(1, 1);
//    }       
  }  
}
//===========================================
void checkForCall()
{
  static boolean oneTime;
//  stat = call.CallStatusWithAuth(phone_number, 0, 0);
//  if (stat == CALL_INCOM_VOICE_AUTH)  
//  {
//    Ring();
//    call.PickUp(); 
//    gsm.SendATCmdWaitResp("ATA", 10, 10, "OK", 3);
//    gsm.SimpleWriteln("ATA");
    incomingCall = false;
    if((stat == CALL_INCOM_VOICE_AUTH) && ((strcmp(phone_number,telnumber_1) == 0) 
        || (strcmp(phone_number,telnumber_2) == 0) 
        || (strcmp(phone_number,telnumber_3) == 0)))// ΔΕΧΕΤΑΙ ΜΟΝΟ ΑΠΟ ΤΟ ΔΙΚΟ ΣΟΥ ΝΟΥΜΕΡΟ ΤΗΛΕΦΩΝΟΥ 
    {
      Ring();
//    call.PickUp(); 
      gsm.SendATCmdWaitResp("ATA", 10, 10, "OK", 3);
      gsm.SimpleWriteln("ATA");
//      Serial.print("Incoming call from: ");
//      Serial.println(phone_number); 
      lcd.setCursor(0,0);
      lcd.print("Incoming call from: ");
      lcd.setCursor(0,1);
      lcd.print(phone_number);
      lcd.print("       "); 
      call.SendDTMF("*", 4);   
  
      while(stat==CALL_INCOM_VOICE_AUTH) 
      {
        oneTime = true;
        stat = call.CallStatusWithAuth(phone_number, 0, 0);
        for (int k=0; k<20; k++) 
        {
          DTMF_char=call.DetDTMF();
          if(DTMF_char!='-')
          {
            Serial.print("Pressed: KEY No ");
            Serial.println(DTMF_char);
            
            if(DTMF_char == '1')
            {
              dtmfSound = 1;
              //p1on = "RE1 ON";
              Serial.println("RE1 ON");
              OK_DTMF(); 
              leaveDTMF();           
            }  
            else if(DTMF_char == '2')
            {
              dtmfSound = 2;
              //p2on = "RE2 ON";
              Serial.println("RE2 ON");
              OK_DTMF();
              leaveDTMF();
            }  
            else if(DTMF_char == '3')
            {
              dtmfSound = 3;
              //p3on = "RE3 ON";
              Serial.println("RE3 ON");
              OK_DTMF();
              leaveDTMF();
            }  
            else if(DTMF_char == '4') 
            {
              dtmfSound = 4;
              //p4on = "RE4 ON";
              Serial.println("RE4 ON");
              OK_DTMF();
              leaveDTMF();
            }
            else if(DTMF_char == '5') 
            {
              dtmfSound = 5;
              //p1off = "RE1 OFF";
              Serial.println("RE1 OFF");
              NOT_OK_DTMF();
              leaveDTMF();
            }  
            else if(DTMF_char == '6') 
            {
              dtmfSound = 6;
              //p2off = "RE2 OFF";
              Serial.println("RE2 OFF");
              NOT_OK_DTMF();
              leaveDTMF();
            }  
            else if(DTMF_char == '7') 
            {
              dtmfSound = 7;
              //p3off = "RE3 OFF";
              Serial.println("RE3 OFF");
              NOT_OK_DTMF();
              leaveDTMF();
            }  
            else if(DTMF_char == '8') 
            {
              dtmfSound = 8;
              //p4off = "RE4 OFF";
              Serial.println("RE4 OFF");
              NOT_OK_DTMF();
              leaveDTMF();
            }  
            else if(DTMF_char == '#') 
            {
              dtmfSound = 9;
              OK_DTMF();            
              leaveDTMF();  
            }             
          }      
        }           
      }
    }
    
    stat = call.CallStatusWithAuth(phone_number, 0, 0);
    if ((stat != CALL_INCOM_VOICE_AUTH) && (oneTime == true))
    {
      Serial.println(F("\nCall Terminated.\n"));  
      lcd.setCursor(0,0);
      lcd.print("Call Terminated.    ");
      gsm.SendATCmdWaitResp("ATH", 500, 100, "OK", 5);
//      call.HangUp();
      checkRelaysPort();
      delay(2000);
      oneTime = false;
    }    
//  }  


  lcd.setCursor(0,0);
  lcd.print("Modem is ready.     ");
}
```

----------


## manolena

```
//===========================================
void leaveDTMF()
{
  if(dtmfSound == 1)
  {
    digitalWrite(relay_1, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, HIGH);
  }
  else if(dtmfSound == 5)
  {
    digitalWrite(relay_1, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, LOW);        
  }
  else if(dtmfSound == 2)
  {
    digitalWrite(relay_2, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, HIGH);
  }
  else if(dtmfSound == 6)
  {
    digitalWrite(relay_2, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, LOW);
  }
  else if(dtmfSound == 3)
  {
    digitalWrite(relay_3, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, HIGH);
  }
  else if(dtmfSound == 7)
  {
    digitalWrite(relay_3, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, LOW);
  }
  else if(dtmfSound == 4)
  {
    digitalWrite(relay_4, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, HIGH);
  }
  else if(dtmfSound == 8)
  {
    digitalWrite(relay_4, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, LOW);
  }
  else if(dtmfSound == 9)
  {
    Serial.println("Leaving...");
  }




  if(digitalRead(relay_1) == LOW)
  {
    lcd.setCursor(1,3);
    lcd.print("OFF");
  }
  else if(digitalRead(relay_1) == HIGH)
  {
    lcd.setCursor(1,3);
    lcd.print("ON ");
  }     
  if(digitalRead(relay_2) == LOW)
  {
    lcd.setCursor(6,3);
    lcd.print("OFF");
  }
  else if(digitalRead(relay_2) == HIGH)
  {
    lcd.setCursor(6,3);
    lcd.print("ON ");
  } 


  if(digitalRead(relay_3) == LOW)
  {
    lcd.setCursor(11,3);
    lcd.print("OFF");
  }
  else if(digitalRead(relay_3) == HIGH)
  {
    lcd.setCursor(11,3);
    lcd.print("ON ");
  }    
  if(digitalRead(relay_4) == LOW)
  {
    lcd.setCursor(16,3);
    lcd.print("OFF");
  }
  else if(digitalRead(relay_4) == HIGH)
  {
    lcd.setCursor(16,3);
    lcd.print("ON ");
  }
}    
//===========================================
void checkRelaysPort()
{
  textForSMS="";
  textForSMS+="ARDUINO-SIM900 REMOTE CONTROL SYSTEM v1.0\n";  
  textForSMS+="Relays STATUS:\n";  
  Serial.println(F("\nCurrent Relays STATUS:"));


  if(digitalRead(A0) == 0)
  {
    lcd.setCursor(1,3);
    lcd.print("OFF");
    Serial.println(F("RE1 = OFF "));
    textForSMS+="RE1 = OFF\n";  
  }
  else if(digitalRead(A0) == 1)
  {
    lcd.setCursor(1,3);
    lcd.print("ON ");
    Serial.println(F("RE1 = ON  "));
    textForSMS+="RE1 = ON \n";   
  } 


  if(digitalRead(A1) == 0)
  {
    lcd.setCursor(6,3);
    lcd.print("OFF");
    Serial.println(F("RE2 = OFF "));
    textForSMS+="RE2 = OFF\n"; 
  }
  else if(digitalRead(A1) == 1)
  {
    lcd.setCursor(6,3);
    lcd.print("ON ");
    Serial.println(F("RE2 = ON  "));
    textForSMS+="RE2 = ON \n";    
  } 


  if(digitalRead(A2) == 0)
  {
    lcd.setCursor(11,3);
    lcd.print("OFF");
    Serial.println(F("RE3 = OFF ")); 
    textForSMS+="RE3 = OFF\n"; 
  }
  else if(digitalRead(A2) == 1)
  {
    lcd.setCursor(11,3);
    lcd.print("ON ");
    Serial.println(F("RE3 = ON  "));
    textForSMS+="RE3 = ON \n";    
  }


  if(digitalRead(A3) == 0)
  {
    lcd.setCursor(16,3);
    lcd.print("OFF");
    Serial.println(F("RE4 = OFF "));
    textForSMS+="RE4 = OFF\n";
    textForSMS+="\n";   
    Serial.println();
  }
  else if(digitalRead(A3) == 1)
  {
    lcd.setCursor(16,3);
    lcd.print("ON ");
    Serial.println(F("RE4 = ON  "));
    textForSMS+="RE4 = ON \n";
    textForSMS+="\n"; 
    Serial.println();
  }  
} 
//===========================================
void sendSMS()
{ 
  textForSMS.toCharArray(sms_text, sizeof(sms_text));
  if(started) 
  {
    if (sms.SendSMS(phone_number, sms_text))
    {
      lcd.setCursor(0,0);
      lcd.print("Sending Status SMS: ");
      lcd.setCursor(0,1);
      lcd.print(phone_number);
      lcd.print("       ");
      Serial.println(F("Relays Status Sent to:"));
      Serial.println(phone_number);
      Serial.println(F("OK!"));
      Serial.println();
      delay(2000);
    }
  } 
}  
//===========================================
void deleteSMS()
{
  for(i=1;i<=20;i++)
  {
    sms.DeleteSMS(i);
  }   
}
//===========================================
void A6Power()
{
  digitalWrite(A6_POWER_PIN, LOW);
  delay(1000);
  digitalWrite(A6_POWER_PIN, HIGH);
  delay(2000);
  digitalWrite(A6_POWER_PIN, LOW); 
}
//===========================================
void chooseRelayOutput()
{
  p1on = strstr(message,"RE1 ON");
  p1off = strstr(message,"RE1 OFF");
  p2on = strstr(message,"RE2 ON");
  p2off = strstr(message,"RE2 OFF");
  p3on = strstr(message,"RE3 ON");
  p3off = strstr(message,"RE3 OFF");
  p4on = strstr(message,"RE4 ON");
  p4off = strstr(message,"RE4 OFF");
  modemResponse = strstr(message," ");
  onlyRelays();


  if(modemResponse)
  {
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }  
  else
  {
    digitalWrite(relay_1, LOW);
    digitalWrite(relay_2, LOW);
    digitalWrite(relay_3, LOW);
    digitalWrite(relay_4, LOW);
    lcd.setCursor(0,0);
    lcd.print("Invalid Command     ");
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  checkRelaysPort();
  sms.DeleteSMS((int)pos); 
  delay(5000);
  lcd.setCursor(0,0);
  lcd.print("Modem is ready.     ");
  lcd.setCursor(0,1);
  lcd.print("Waiting for SMS...  ");
  //  lcd.setCursor(0,2);
  //  lcd.print("Waiting for calls...");
} 
//===========================================
void onlyRelays()
{
  if(p1on)
  {
    digitalWrite(relay_1, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, HIGH);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p1off)
  {
    digitalWrite(relay_1, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, LOW);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p2on)
  {
    digitalWrite(relay_2, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, HIGH);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p2off)
  {
    digitalWrite(relay_2, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, LOW);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p3on)
  {
    digitalWrite(relay_3, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, HIGH);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p3off)
  {
    digitalWrite(relay_3, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, LOW);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p4on)
  {
    digitalWrite(relay_4, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, HIGH);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p4off)
  {
    digitalWrite(relay_4, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, LOW);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
}  
//===========================================
void scrollDataDisplay(int line, int speed)
{
  int i;


  if(g_nPosition < DATA_LENGTH - cols)
  {
    for(i=0; i<cols; i++)
    {
      lcd.setCursor(i, line);
      lcd.print(dataBuffer[g_nPosition + i]);
    }
  }
  else
  {
    int nChars = DATA_LENGTH - g_nPosition;
    for(i=0; i<nChars; i++)
    {
      lcd.setCursor(i, line);
      lcd.print(dataBuffer[g_nPosition + i]);
    }
    for(i=0; i<(cols - nChars); i++)
    {
      lcd.setCursor(nChars + i, line);
      lcd.print(dataBuffer[i]);
    }
  }
  g_nPosition++;
  if(g_nPosition >= DATA_LENGTH)
  {
    g_nPosition = 0;
  }
  delay(speed);   
} 
//===========================================
void beepBuzzer(unsigned long hz, unsigned long ms) 
{  
  unsigned long us = (750000 / hz);  
  unsigned long rep = (ms * 500L) / us; 


  for (int i = 0; i < rep; i++) 
  {  
    digitalWrite(BUZZER_PIN, HIGH);  
    delayMicroseconds(us);  
    digitalWrite(BUZZER_PIN, LOW);  
    delayMicroseconds(us);  
  }  
}
//===========================================
void SMSBeep()
{
  beepBuzzer(6250,100);
  delay(150);
  beepBuzzer(6250,200);
  delay(750);
  beepBuzzer(6250,100);
  delay(150);
  beepBuzzer(6250,200);
}  
//===========================================
void Ring()
{
  for(int i = 10; i > 0; i--)
  {
    beepBuzzer(6250,20);
    delay(20);
  }  
  delay(500);
  for(int i = 15; i > 0; i--)
  {
    beepBuzzer(6250,20);
    delay(20);
  }
  delay(1000);  
}  
//===========================================
void OK_DTMF()
{
  call.SendDTMF("*", 2);
  delay(500);
  call.SendDTMF("*", 2);
  delay(500);
}  
//===========================================
void NOT_OK_DTMF()
{
  call.SendDTMF("*", 1);
  delay(500);
}  
//===========================================
void ShowModemData()
{
  while(Serial1.available()!=0)
    Serial.write(Serial1.read());
}
//===========================================
```

----------


## manolena

Και τέλος, να δηλώσω πως ο κώδικας είναι ελεύθερος (αφού τον ανέβασα, τι θα ήτανε;  ).... αλλά..... η αντιγραφή και εκμετάλλευση του θα ήταν κάτι που θα με έκανε να μην ξαναγράψω ποτέ κώδικα εδώ.
Για το κολλητηράκι, δεν ξέρω ποιές είναι οι απορίες σου, έχουν γραφτεί "σεντόνια" εδώ μέσα, είναι πανεύκολος και δουλεύει μια χαρά.
Όσο για το terminal window που έβαλες, να σου πω την αλήθεια το βρίσκω βουνό να κάτσω να διαβάσω μια μια τις εντολές και τις απαντήσεις για να δω τι έχεις κάνει....

----------


## keap

> Και τέλος, να δηλώσω πως ο κώδικας είναι ελεύθερος (αφού τον ανέβασα, τι θα ήτανε;  ).... αλλά..... η αντιγραφή και εκμετάλλευση του θα ήταν κάτι που θα με έκανε να μην ξαναγράψω ποτέ κώδικα εδώ.
> Για το κολλητηράκι, δεν ξέρω ποιές είναι οι απορίες σου, έχουν γραφτεί "σεντόνια" εδώ μέσα, είναι πανεύκολος και δουλεύει μια χαρά.
> Όσο για το terminal window που έβαλες, να σου πω την αλήθεια το βρίσκω βουνό να κάτσω να διαβάσω μια μια τις εντολές και τις απαντήσεις για να δω τι έχεις κάνει....



Κατάρχας να σε ευχαριστήσω πάρα πολύ για τον χρόνο σου.
Να κάνω μερικές ερωτήσεις για τον λόγο να μην κάνω καμία πατάτα εγώ και προσπαθώ άδικα να δουλέψει,
τις βιβλιοθήκες που ανέβασες πήγα και τις εγκατέστησα στο arduino ide και συνδέω (xρειάζεται κάποιες επιπλέον ρυθμίσεις?) 
ARDUINO - GSM A6
  RX - TX
  TX - RX    
  GND - GND

τον κώδικα part 1 και part 2 πρέπει να τους ενώσω?
το rx - tx τα συνδέω στο arduino κανονικά στο 0 και 1 pins 'η σε κάποια άλλα pins?
θα το συνδέσω με arduino uno. Εάν μετά βάλω arduino nano χρειάζεται μετατροπή ο κώδικας?
Το μήνυμα που θα στέλνω είναι : RE1 ON χωρίς τα '' '' ?
τι διαφορά έχει ο κώδικας DTMF από τον πρώτο?(συγνώμη για την ερώτηση αλλά δεν γνωρίζω από προγραμματισμό και επειδή το ανέφερες είπα να ρωτήσω για να μαθαίνω)
και πάλι σ'ευχαριστώ πολύ.

----------


## manolena

> τις βιβλιοθήκες που ανέβασες πήγα και τις εγκατέστησα στο arduino ide και συνδέω (xρειάζεται κάποιες επιπλέον ρυθμίσεις?) 
> ARDUINO - GSM A6
>   RX - TX
>   TX - RX    
>   GND - GND



*Σωστά.*





> τον κώδικα part 1 και part 2 πρέπει να τους ενώσω?



*Σωστά.* Ο διαχειριστής δεν επιτρέπει πάνω απο 15Μ χαρακτήρες ανα μήνυμα. Θα μπορούσα να το κάνω ξεχωριστά αρχεία .ino αλλά θεώρησα πως θα ήταν πιο περίπλοκο.





> το rx - tx τα συνδέω στο arduino κανονικά στο 0 και 1 pins 'η σε κάποια άλλα pins?
> θα το συνδέσω με arduino uno. Εάν μετά βάλω arduino nano χρειάζεται μετατροπή ο κώδικας?



Σε αυτή την περίπτωση θα συνδέσεις τα RX-TX στα 0 και 1 πινάκια του UNO και θα εγκαταστήσεις τη βιβλιοθήκη του GSM για παραλλαγή UNO. Η αντίστοιχη βιβλιοθήκη που πρέπει να εγκαταστήσεις είναι αυτή στο
*http://www.hlektronika.gr/forum/showthread.php?t=87726&p=794567&viewfull=1#post794  567
*




> Το μήνυμα που θα στέλνω είναι : RE1 ON χωρίς τα '' '' ?



Με το τηλέφωνο θα στέλνεις μόνο χαρακτήρες, χωρίς "" και με τη μορφή: RE1 ON ή RE1 OFF
Έχει σημασία να είναι κεφαλαία λατινικά, κενό μεταξύ REx και ON





> τι διαφορά έχει ο κώδικας DTMF από τον πρώτο?(συγνώμη για την ερώτηση αλλά δεν γνωρίζω από προγραμματισμό και επειδή το ανέφερες είπα να ρωτήσω για να μαθαίνω)



Στον κώδικα που σου παραθέτω, μπορείς αντί να στέλνεις κάθε φορά μήνυμα για ενεργοποίηση ή απενεργοποίηση κάποιου ρελέ, να καλείς το modem σου και ανοίγοντας το πληκτρολόγιο να πατάς τα ψηφία 1,2,3,4 για ενεργοποίηση αντίστοιχα των ρελέ RE1, RE2, RE3, RE4 ενώ αν πατάς τα ψηφία 5,6,7,8 να απενεργοποιείς πάλι τα ρελέ RE1, RE2, RE3, RE4. Κάθε φορά που ενεργοποιείς κάποιο απο τα ρελέ, το modem σου απαντάει με δύο τόνους DTMF για επιβεβαίωση ενώ κάθε φορά που απενεργοποιείς ένα ρελέ, το modem σου απαντά με έναν τόνο DTMF για επιβεβαίωση.

----------


## manolena

Πες μου ποιές απο τις παρακάτω βιβλιοθήκες *δεν* έχεις να στις στείλω:

#include <Wire.h>
#include "SIM900.h"
#include <SoftwareSerial.h>
#include <string.h> 
#include <stdio.h> 
#include "sms.h"
#include "call.h"
#include <LiquidCrystal_I2C.h>
#include <EEPROMEx.h>
#include <DirectIO.h>

----------


## keap

> Πες μου ποιές απο τις παρακάτω βιβλιοθήκες *δεν* έχεις να στις στείλω:



 
Καλημέρα Μάνο,οι βιβλιοθήκες που βγαίνουν με μαύρο χρώμα όταν τις προσθέτω στο arduino ide είναι αυτές που δεν έχω?εάν όχι με ποίο τρόπο ελέγχω εάν τις έχω?

 #include <Wire.h>                 - πορτοκαλί    
#include "SIM900.h"                - μπλέ
#include <SoftwareSerial.h>    - μαύρο
#include <string.h>                - μαύρο
#include <stdio.h>                 - μαύρο
#include "sms.h"                    - μπλέ
#include "call.h"                     - μπλέ
#include <LiquidCrystal_I2C.h> - πορτοκαλί
#include <EEPROMEx.h>          - μαύρο
#include <DirectIO.h> -μαύρο

Υπάρχει περίπτωση εάν έχω εγκατάσταση άλλη βιβλιοθήκη και έχει κι αυτή μέσα αρχείο πχ. 'sms.h' να μπερδεύονται με την δικιά σου που μου έστειλες,ή δεν έχει καμία σχέση αυτό?

----------


## manolena

Καλημέρα, 

ένα βίντεο με τη λειτουργία για να καταλάβει κανείς τι ακριβώς γίνεται:





EDIT:
Ξέχασα να βάλω ταμπελάκι με μωβ μαρκαδόρο, λές να μην αναγνωριστεί για δικό μου το βίντεο; Ή μήπως δεν πιάνεται για κατασκευή όλο αυτό; Παρ' όλα αυτά, βάζω μια εικόνα που δείχνει ποιός το έφτιαξε.

----------


## manolena

...και ένα άλλο για να φανεί τι παίζει στο σειριακό τερματικό, όπου φαίνεται όλη η πληροφορία:

----------


## manolena

> Καλημέρα Μάνο,οι βιβλιοθήκες που βγαίνουν με μαύρο χρώμα όταν τις προσθέτω στο arduino ide είναι αυτές που δεν έχω?εάν όχι με ποίο τρόπο ελέγχω εάν τις έχω?
> 
>  #include <Wire.h>                 - πορτοκαλί *================================> την έχεις εξ' ορισμού*
> #include "SIM900.h"                - μπλέ*================================> την έχεις με τη βιβλιοθήκη GSM_UNO που έχεις απο το μήνυμα #20*
> #include <SoftwareSerial.h>    - μαύρο*================================> την έχεις με τη βιβλιοθήκη GSM_UNO που έχεις απο το μήνυμα #20*
> #include <string.h>                - μαύρο*================================> την έχεις εξ' ορισμού*
> #include <stdio.h>                 - μαύρο*================================> την έχεις εξ' ορισμού*
> #include "sms.h"                    - μπλέ*================================> την έχεις με τη βιβλιοθήκη GSM_UNO που έχεις απο το μήνυμα #20*
> #include "call.h"                     - μπλέ*================================> την έχεις με τη βιβλιοθήκη GSM_UNO που έχεις απο το μήνυμα #20*
> ...



Στα συνημμένα οι βιβλιοθήκες που χρειάζεσαι.

Πηγαίνεις στο φάκελο που έχεις τις βιβλιοθήκες και ψάχνεις να βρείς τα σχετικά αρχεία. Όπου τα βρείς, κάνεις όλη τη βιβλιοθήκη zip, ξηλώνεις τα παλιά και βάζεις αυτά εδώ.
EDIT: Δεν ξέρω γιατί, αλλά τη βιβλιοθήκη NewLiquidCrystal δεν την ανεβάζει. Αναζήτησέ την εδώ:

https://drive.google.com/open?id=0B_...DlEZkhZQmlMcmM

----------


## keap

> Στα συνημμένα οι βιβλιοθήκες που χρειάζεσαι.
> 
> Πηγαίνεις στο φάκελο που έχεις τις βιβλιοθήκες και ψάχνεις να βρείς τα σχετικά αρχεία. Όπου τα βρείς, κάνεις όλη τη βιβλιοθήκη zip, ξηλώνεις τα παλιά και βάζεις αυτά εδώ.



Καλά είσαι φανταστικός ξεκινάω να βάλω τις βιβλιοθήκες και συνδέω να δούμε τι γίνεται

----------


## keap

Καλήμερα Μάνο,
δοκίμασα να βάλω τον κώδικα αλλά μου έβγαλε σφάλμα

LiquidCrystal_I2C lcd(LCD_I2C_ADDRESS, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address --> μου την έκανε κόκκινη

διέγραψα τελείως το arduino ide και το εγκατέστησα από την αρχή έβαλα τις βιβλιοθήκες που μου έστειλες μόνο
και έκανα αντιγραφή/επικόλληση το part 1 του κώδικα και μετά από κάτω στην συνέχεια αντιγραφή/επικόλληση το part 2
το αποθήκευσα πρώτα για να διμιουργήση έναν φάκελο στον arduino ide και μετά τον άνοιξα και μου βγάζει σφάλμα

OutputPort<PORT_F, 0, 4> relaysPort;--> κόκκινο αυτό

ξέρεις γιατί μπορεί να μου το κάνει αυτό?

----------


## manolena

Όπως σου είχα γράψει, είναι βασισμένο σε έναν arduino MEGA που έχει πολλές πόρτες. O UNO που χρησιμοποιείς δέν έχει πόρτα F γιατί βασίζεται στον 328. 

Διάγραψε τις παρακάτω γραμμές:

#include <DirectIO.h>
...........................
OutputPort<PORT_F, 0, 4> relaysPort;
...........................
relaysPort = relaysStatusByte;

----------


## keap

> Όπως σου είχα γράψει, είναι βασισμένο σε έναν arduino MEGA που έχει πολλές πόρτες. O UNO που χρησιμοποιείς δέν έχει πόρτα F γιατί βασίζεται στον 328. 
> 
> Διάγραψε τις παρακάτω γραμμές:
> 
> #include <DirectIO.h>
> ...........................
> OutputPort<PORT_F, 0, 4> relaysPort;
> ...........................
> relaysPort = relaysStatusByte;



Αυτή η εντολή 
relaysPort = relaysStatusByte;
είναι αυτή που βρίσκεται πάνω από την εντολή   A6Power(); ?

----------


## manolena

> Αυτή η εντολή 
> relaysPort = relaysStatusByte;
> είναι αυτή που βρίσκεται πάνω από την εντολή   A6Power(); ?



Ναι, αυτή είναι.

TIP: αντίγραψε όλη τη γραμμή, πάτα Ctrl+F και βάλε την στο πάνω πεδίο. Θα σε πάει κατ' ευθείαν εκεί. Πατάς Delete και τέλος.

----------


## keap

> Ναι, αυτή είναι.
> 
> TIP: αντίγραψε όλη τη γραμμή, πάτα Ctrl+F και βάλε την στο πάνω πεδίο. Θα σε πάει κατ' ευθείαν εκεί. Πατάς Delete και τέλος.



Όταν λες πάνω πεδίο που εννοείς?

----------


## manolena



----------


## keap

> 



Καλά λέει ο λαός όσο ζεις μαθαίνεις έμαθα και κάτι καινούργιο σήμερα....χαχαχαχ

----------


## keap

Έλα πες μου τώρα γιατί βγάζει σφάλμα το κόκκινο?θα με τρελάνει.

void ShowModemData()
{
  while(Serial1.available()!=0)
    Serial.write(Serial1.read());
}

----------


## Fire Doger

> Έλα πες μου τώρα γιατί βγάζει σφάλμα το κόκκινο?θα με τρελάνει.
> 
> void ShowModemData()
> {
>   while(Serial1.available()!=0)
>     Serial.write(Serial1.read());
> }



Γιατί το Mega έχει πολλά, 4 σειριακά περιφερειακά ενώ το uno 1, άρα δεν υπάρχει Serial1 στο uno (πάει 0, 1, 2, 3).
Σε αυτό το κομμάτι όσα δεδομένα υπάρχουν στην σειριακή 1 τότε τα εμφανίζει στο terminal του arduino στο PC. Φαντάζομαι στην σειριακή 1 προέρχονται απ' το module?

----------


## manolena

Γιατί χρησιμοποιείς UNO και ο UNO δεν έχει δεύτερο UART. Βασικά δικό μου λάθος είναι....

Βρές τις γραμμές: 

Serial1.begin(9600); 
...................................
void ShowModemData()
{
  while(Serial1.available()!=0)
    Serial.write(Serial1.read());

}

...και διάγραψέ τες

EDIT: Έλα βρε Στέφανε, μαζί τα ....γράφαμε! Να τα ....φάμε μαζί δεν μπορούσαμε...

----------


## keap

Σε έχω πρίξει Μάνο το ξέρω και σου ζητάω συγνώμη έκανα αυτο που είπες και ξαναβγάζει.

//EEPROM.writeByte(RELAYS_STATUS_ADDRESS, B00001101);   




  relaysStatusByte = EEPROM.readByte(RELAYS_STATUS_ADDRESS); 
  if(relaysStatusByte == 0xFF)
  {
    EEPROM.writeByte(RELAYS_STATUS_ADDRESS, 0);
    delay(100);
    relaysStatusByte = EEPROM.readByte(RELAYS_STATUS_ADDRESS); 
  }

----------


## SeAfasia

> Γιατί χρησιμοποιείς UNO και ο UNO δεν έχει δεύτερο UART. Βασικά δικό μου λάθος είναι....
> 
> Βρές τις γραμμές: 
> 
> Serial1.begin(9600); 
> ...................................
> void ShowModemData()
> {
>   while(Serial1.available()!=0)
> ...



Mάνο καλησπέρα,
τα πμ σου είναι γεμάτα.... :Sad:

----------


## manolena

> Mάνο καλησπέρα,
> τα πμ σου είναι γεμάτα....



Proceed...

----------


## manolena

> Σε έχω πρίξει Μάνο το ξέρω και σου ζητάω συγνώμη έκανα αυτο που είπες και ξαναβγάζει.
> 
> //EEPROM.writeByte(RELAYS_STATUS_ADDRESS, B00001101);   
> 
> 
> 
> 
>   relaysStatusByte = EEPROM.readByte(RELAYS_STATUS_ADDRESS); 
>   if(relaysStatusByte == 0xFF)
> ...



Ξαναλέω πάλι:

'Ολο αυτό που έγραψα είναι εντελώς πρόχειρο και κακογραμμένο (όπως πάντα) απλά για να δείξω οτι είναι αρκετά εύκολο να γίνει με απλά υλικά. Τώρα, επειδή δεν είναι στημένο με τα δικά σου υλικά, θα βγάζει λάθη μέχρι να το συνεφέρουμε. Υπομονή. Χωρίζω τον κώδικα σε αρχεία και τα ανεβάζω ξεχωριστά με διαγραμμένα αυτά που δεν χρειάζονται. Τα βάζεις και τα δύο σε έναν φάκελο με το ίδιο όνομα. Π.χ. keap_test_1

*keap_test_1.ino
*


```
#include <Wire.h>
#include "SIM900.h"
#include <SoftwareSerial.h>
#include <string.h> 
#include <stdio.h> 
#include "sms.h"
#include "call.h"
#include <LiquidCrystal_I2C.h>
#include <EEPROMEx.h>
//===========================================
#define relay_1      A0//DIGITAL PIN A0//
#define relay_2      A1//DIGITAL PIN A1//
#define relay_3      A2//DIGITAL PIN A2//
#define relay_4      A3//DIGITAL PIN A3//


#define A6_POWER_PIN 7//DIGITAL PIN D7 for power up modem
#define LCD_I2C_ADDRESS         0x27
#define cols                    20
#define lines                   4
#define LEFT_BAR                1
#define RIGHT_BAR               2
#define RELAYS_STATUS_ADDRESS   0x00
#define BUZZER_PIN              13


boolean started = false;
boolean incomingCall = false;
String textForSMS = String(""); 
char telnumber_1[] = "+30.........."; //ΕΔΩ ΤΟΝ ΑΡΙΘΜΟ ΤΗΛΕΦΩΝΟΥ ΣΟΥ
char telnumber_2[] = "+30.........."; //ΕΔΩ ΤΟΝ ΑΡΙΘΜΟ ΤΗΛΕΦΩΝΟΥ ΣΟΥ
char telnumber_3[] = "+30.........."; //ΕΔΩ ΤΟΝ ΑΡΙΘΜΟ ΤΗΛΕΦΩΝΟΥ ΣΟΥ


byte stat = 0;
char pos;
char *p1on, *p1off, *p2on, *p2off, *p3on, *p3off, *p4on, *p4off, *pallon, *palloff, *modemResponse;
char phone_number[20]; // array for the phone number string
char message[100];
char sms_text[100];
char timeStamp[50];
char DTMF_char='_';
int i = 0;


byte relaysStatusByte = 0x00;


char dataBuffer[28] = {"Waiting for SMS or Call... "};
int g_nPosition = 0;
const int DATA_LENGTH = 27;
byte dtmfSound = 255;
//===========================================
LiquidCrystal_I2C lcd(LCD_I2C_ADDRESS, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
SMSGSM sms;              //instance for the modem
CallGSM call;
//===========================================
void(* resetFunc) (void) = 0x00;
//===========================================
void setup()
{ 
  Wire.begin();
  lcd.begin(cols, lines);
  Serial.begin(9600);
  pinMode(BUZZER_PIN, OUTPUT);
  digitalWrite(BUZZER_PIN, LOW); 
  beepBuzzer(6250,30);


  lcd.setCursor(0,0);
  lcd.print("  ARDUINO - SIM900  ");
  lcd.setCursor(0,1);
  lcd.print("REMOTE CONTROL SYS. ");
  lcd.setCursor(0,2);
  lcd.print("  v1.01 22JAN2017   ");
  lcd.setCursor(0,3);
  lcd.print("   (C) MANOS MAR.   ");
  delay(3500);
  lcd.clear();


  Serial.println(F(" ___________________________________________"));
  Serial.println(F("|                                           |"));
  Serial.println(F("|ARDUINO-SIM900 REMOTE CONTROL SYSTEM v1.01 |"));
  Serial.println(F("|         (C) MANOS MAR 22JAN2017           |"));
  Serial.println(F("|             SIM900 power up...            |"));  
  Serial.println(F("|              Wait a minute...             |"));  
  Serial.println(F("|___________________________________________|"));


  lcd.print("SIM900 power up...  ");
  lcd.setCursor(0,1);
  lcd.print("Wait a minute...    "); 


  pinMode(A6_POWER_PIN, OUTPUT);
  digitalWrite(A6_POWER_PIN, LOW);   


  byte leftBar[8] = {
    B11000,
    B11100,
    B11110,
    B11111,
    B11111,
    B11110,
    B11100,
    B11000
  }; 
  lcd.createChar(LEFT_BAR, leftBar);


  byte rightBar[8] = {
    B00011,
    B00111,
    B01111,
    B11111,
    B11111,
    B01111,
    B00111,
    B00011
  }; 
  lcd.createChar(RIGHT_BAR, rightBar);

  pinMode(relay_1, OUTPUT);  pinMode(relay_2, OUTPUT);
  pinMode(relay_3, OUTPUT);
  pinMode(relay_4, OUTPUT);

  digitalWrite(relay_1, EEPROM.readBit(RELAYS_STATUS_ADDRESS, 0));  
  digitalWrite(relay_2, EEPROM.readBit(RELAYS_STATUS_ADDRESS, 1));
  digitalWrite(relay_3, EEPROM.readBit(RELAYS_STATUS_ADDRESS, 2));
  digitalWrite(relay_4, EEPROM.readBit(RELAYS_STATUS_ADDRESS, 3));    

  A6Power();


  if (gsm.begin(9600)) 
  {
    started=true;
    Serial.println(F(" ___________________________________________"));
    Serial.println(F("|                                           |"));
    Serial.println(F("|   SIM900 connection established. Ready.   |"));
    Serial.println(F("|___________________________________________|")); 
    gsm.SendATCmdWaitResp("ATA\r\n", 500, 100, "OK", 5);
    gsm.SendATCmdWaitResp("AT+CLIP=1\r\n", 500, 100, "OK", 5);
    call.SetDTMF(true);
    lcd.setCursor(0,0);
    lcd.print("SIM900 is ready.    ");
    delay(2000);
  }
  else
  {
    Serial.println(F(" ___________________________________________"));
    Serial.println(F("|                                           |"));
    Serial.println(F("|  SIM900 failed to connect to the network. |"));
    Serial.println(F("|___________________________________________|")); 
    lcd.setCursor(0,0);
    lcd.print("SIM900 fault.       ");
    lcd.setCursor(0,1);
    lcd.print("Restarting...       ");
    delay(2000);
    resetFunc(); 
  }  
  Serial.println(F(" ___________________________________________"));
  Serial.println(F("|                                           |"));
  Serial.println(F("|              Setup complete!              |"));
  Serial.println(F("|___________________________________________|")); 
  beepBuzzer(6250,100);
  lcd.setCursor(0,2);
  lcd.print(" RE1  RE2  RE3  RE4 ");


  checkRelaysPort(); 
}  
//===========================================
void loop()
{ 
  static byte index = 0;


  scrollDataDisplay(1, 1);


  stat = call.CallStatusWithAuth(phone_number, 0, 0);
  if(stat == CALL_INCOM_VOICE_AUTH)
  {
    incomingCall = true;
  }
  else
  {
    incomingCall = false;
  }  


  if(incomingCall)
  {
    checkForCall(); 
  }


  if(started) 
  {
    pos = sms.IsSMSPresent(SMS_UNREAD);
    if(pos) 
    {
      SMSBeep();     
      sms.GetSMS(pos, phone_number, message, 100); 
      Serial.print(F("\nReceived SMS from: "));  
      Serial.println(phone_number);
      Serial.println(message);
      Serial.println();      
      if((strcmp(phone_number,telnumber_1) == 0) 
        || (strcmp(phone_number,telnumber_2) == 0) 
        || (strcmp(phone_number,telnumber_3) == 0))// ΔΕΧΕΤΑΙ ΜΟΝΟ ΑΠΟ ΤΟ ΔΙΚΟ ΣΟΥ ΝΟΥΜΕΡΟ ΤΗΛΕΦΩΝΟΥ 
      {
        lcd.setCursor(0,0);
        lcd.print("Received SMS from:  ");
        lcd.setCursor(0,1);
        lcd.print(phone_number);
        lcd.print("       ");
        delay(2000); 
        chooseRelayOutput();
        sendSMS();
        deleteSMS();
      }
      pos = sms.IsSMSPresent(SMS_READ);  
    }
  }  
}


//===========================================
void scrollDataDisplay(int line, int speed)
{
  int i;


  if(g_nPosition < DATA_LENGTH - cols)
  {
    for(i=0; i<cols; i++)
    {
      lcd.setCursor(i, line);
      lcd.print(dataBuffer[g_nPosition + i]);
    }
  }
  else
  {
    int nChars = DATA_LENGTH - g_nPosition;
    for(i=0; i<nChars; i++)
    {
      lcd.setCursor(i, line);
      lcd.print(dataBuffer[g_nPosition + i]);
    }
    for(i=0; i<(cols - nChars); i++)
    {
      lcd.setCursor(nChars + i, line);
      lcd.print(dataBuffer[i]);
    }
  }
  g_nPosition++;
  if(g_nPosition >= DATA_LENGTH)
  {
    g_nPosition = 0;
  }
  delay(speed);   
}
```

----------


## manolena

*utils.ino
*


```
//===========================================
void checkForCall()
{
  static boolean oneTime;
  incomingCall = false;
  if((stat == CALL_INCOM_VOICE_AUTH) && ((strcmp(phone_number,telnumber_1) == 0) 
    || (strcmp(phone_number,telnumber_2) == 0) 
    || (strcmp(phone_number,telnumber_3) == 0)))// ΔΕΧΕΤΑΙ ΜΟΝΟ ΑΠΟ ΤΟ ΔΙΚΟ ΣΟΥ ΝΟΥΜΕΡΟ ΤΗΛΕΦΩΝΟΥ 
  {
    Ring();
    gsm.SendATCmdWaitResp("ATA", 10, 10, "OK", 3);
    gsm.SimpleWriteln("ATA");
    
    call.SendDTMF("*", 4);   


    while(stat==CALL_INCOM_VOICE_AUTH) 
    {
      oneTime = true;
      stat = call.CallStatusWithAuth(phone_number, 0, 0);
      for (int k=0; k<20; k++) 
      {
        DTMF_char=call.DetDTMF();
        if(DTMF_char!='-')
        {
          Serial.print("Pressed: KEY No ");
          Serial.println(DTMF_char);


          if(DTMF_char == '1')
          {
            dtmfSound = 1;
            Serial.println("RE1 ON");
            OK_DTMF(); 
            leaveDTMF();           
          }  
          else if(DTMF_char == '2')
          {
            dtmfSound = 2;
            Serial.println("RE2 ON");
            OK_DTMF();
            leaveDTMF();
          }  
          else if(DTMF_char == '3')
          {
            dtmfSound = 3;
            Serial.println("RE3 ON");
            OK_DTMF();
            leaveDTMF();
          }  
          else if(DTMF_char == '4') 
          {
            dtmfSound = 4;
            Serial.println("RE4 ON");
            OK_DTMF();
            leaveDTMF();
          }
          else if(DTMF_char == '5') 
          {
            dtmfSound = 5;
            Serial.println("RE1 OFF");
            NOT_OK_DTMF();
            leaveDTMF();
          }  
          else if(DTMF_char == '6') 
          {
            dtmfSound = 6;
            Serial.println("RE2 OFF");
            NOT_OK_DTMF();
            leaveDTMF();
          }  
          else if(DTMF_char == '7') 
          {
            dtmfSound = 7;
            Serial.println("RE3 OFF");
            NOT_OK_DTMF();
            leaveDTMF();
          }  
          else if(DTMF_char == '8') 
          {
            dtmfSound = 8;
            Serial.println("RE4 OFF");
            NOT_OK_DTMF();
            leaveDTMF();
          }  
          else if(DTMF_char == '9') 
          {
            dtmfSound = 9;
            Serial.println("ALL ON");
            OK_DTMF();
            leaveDTMF();
          }  
          else if(DTMF_char == '0') 
          {
            dtmfSound = 10;
            Serial.println("ALL OFF");
            NOT_OK_DTMF();
            leaveDTMF();
          }  
          else if(DTMF_char == '#') 
          {
            dtmfSound = 11;
            Serial.println("Leaving Programming...");
            OK_DTMF();            
            leaveDTMF();  
          }             
        }      
      }           
    }
  }


  stat = call.CallStatusWithAuth(phone_number, 0, 0);
  if ((stat != CALL_INCOM_VOICE_AUTH) && (oneTime == true))
  {
    Serial.println(F("\nCall Terminated.\n"));  
    lcd.setCursor(0,0);
    lcd.print("Call Terminated.    ");
    gsm.SendATCmdWaitResp("ATH", 500, 100, "OK", 5);
    checkRelaysPort();
    delay(2000);
    oneTime = false;
  }    
  lcd.setCursor(0,0);
  lcd.print("SIM900 is ready.    ");
}
//===========================================
void leaveDTMF()
{
  if(dtmfSound == 1)
  {
    digitalWrite(relay_1, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, HIGH);
  }
  else if(dtmfSound == 5)
  {
    digitalWrite(relay_1, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, LOW);        
  }
  else if(dtmfSound == 2)
  {
    digitalWrite(relay_2, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, HIGH);
  }
  else if(dtmfSound == 6)
  {
    digitalWrite(relay_2, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, LOW);
  }
  else if(dtmfSound == 3)
  {
    digitalWrite(relay_3, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, HIGH);
  }
  else if(dtmfSound == 7)
  {
    digitalWrite(relay_3, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, LOW);
  }
  else if(dtmfSound == 4)
  {
    digitalWrite(relay_4, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, HIGH);
  }
  else if(dtmfSound == 8)
  {
    digitalWrite(relay_4, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, LOW);
  }
  else if(dtmfSound == 9)
  {
    digitalWrite(relay_1, HIGH);
    digitalWrite(relay_2, HIGH);
    digitalWrite(relay_3, HIGH);
    digitalWrite(relay_4, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, HIGH);
  }
  else if(dtmfSound == 10)
  {
    digitalWrite(relay_1, LOW);
    digitalWrite(relay_2, LOW);
    digitalWrite(relay_3, LOW);
    digitalWrite(relay_4, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, LOW);
  }
  else if(dtmfSound == 11)
  {
    Serial.println("Leaving Programming...");
  }




  if(digitalRead(relay_1) == LOW)
  {
    lcd.setCursor(1,3);
    lcd.print("OFF");
  }
  else if(digitalRead(relay_1) == HIGH)
  {
    lcd.setCursor(1,3);
    lcd.print("ON ");
  }     
  
  if(digitalRead(relay_2) == LOW)
  {
    lcd.setCursor(6,3);
    lcd.print("OFF");
  }
  else if(digitalRead(relay_2) == HIGH)
  {
    lcd.setCursor(6,3);
    lcd.print("ON ");
  } 


  if(digitalRead(relay_3) == LOW)
  {
    lcd.setCursor(11,3);
    lcd.print("OFF");
  }
  else if(digitalRead(relay_3) == HIGH)
  {
    lcd.setCursor(11,3);
    lcd.print("ON ");
  } 
  
  if(digitalRead(relay_4) == LOW)
  {
    lcd.setCursor(16,3);
    lcd.print("OFF");
  }
  else if(digitalRead(relay_4) == HIGH)
  {
    lcd.setCursor(16,3);
    lcd.print("ON ");
  }
}    
//===========================================
void checkRelaysPort()
{
  textForSMS="";
  textForSMS+="ARDUINO-SIM900 REMOTE CONTROL SYSTEM v1.01\n";  
  textForSMS+="Relays STATUS:\n";  
  Serial.println(F("\nCurrent Relays STATUS:"));


  if(digitalRead(A0) == 0)
  {
    lcd.setCursor(1,3);
    lcd.print("OFF");
    Serial.println(F("RE1 = OFF "));
    textForSMS+="RE1 = OFF\n";  
  }
  else if(digitalRead(A0) == 1)
  {
    lcd.setCursor(1,3);
    lcd.print("ON ");
    Serial.println(F("RE1 = ON  "));
    textForSMS+="RE1 = ON \n";   
  } 


  if(digitalRead(A1) == 0)
  {
    lcd.setCursor(6,3);
    lcd.print("OFF");
    Serial.println(F("RE2 = OFF "));
    textForSMS+="RE2 = OFF\n"; 
  }
  else if(digitalRead(A1) == 1)
  {
    lcd.setCursor(6,3);
    lcd.print("ON ");
    Serial.println(F("RE2 = ON  "));
    textForSMS+="RE2 = ON \n";    
  } 


  if(digitalRead(A2) == 0)
  {
    lcd.setCursor(11,3);
    lcd.print("OFF");
    Serial.println(F("RE3 = OFF ")); 
    textForSMS+="RE3 = OFF\n"; 
  }
  else if(digitalRead(A2) == 1)
  {
    lcd.setCursor(11,3);
    lcd.print("ON ");
    Serial.println(F("RE3 = ON  "));
    textForSMS+="RE3 = ON \n";    
  }


  if(digitalRead(A3) == 0)
  {
    lcd.setCursor(16,3);
    lcd.print("OFF");
    Serial.println(F("RE4 = OFF "));
    textForSMS+="RE4 = OFF\n";
    textForSMS+="\n";   
    Serial.println();
  }
  else if(digitalRead(A3) == 1)
  {
    lcd.setCursor(16,3);
    lcd.print("ON ");
    Serial.println(F("RE4 = ON  "));
    textForSMS+="RE4 = ON \n";
    textForSMS+="\n"; 
    Serial.println();
  }  
} 
//===========================================
void sendSMS()
{ 
  textForSMS.toCharArray(sms_text, sizeof(sms_text));
  if(started) 
  {
    if (sms.SendSMS(phone_number, sms_text))
    {
      lcd.setCursor(0,0);
      lcd.print("Sending Status SMS: ");
      lcd.setCursor(0,1);
      lcd.print(phone_number);
      lcd.print("       ");
      Serial.println(F("Relays Status Sent to:"));
      Serial.println(phone_number);
      Serial.println(F("OK!"));
      Serial.println();
      delay(2000);
      lcd.setCursor(0,0);
      lcd.print("SIM900 is ready.    ");
    }
  } 
}  
//===========================================
void deleteSMS()
{
  for(i=1;i<=20;i++)
  {
    sms.DeleteSMS(i);
  }   
}
//===========================================
void A6Power()
{
  digitalWrite(A6_POWER_PIN, LOW);
  delay(1000);
  digitalWrite(A6_POWER_PIN, HIGH);
  delay(2000);
  digitalWrite(A6_POWER_PIN, LOW); 
}
//===========================================
void chooseRelayOutput()
{
  p1on = strstr(message,"RE1 ON");
  p1off = strstr(message,"RE1 OFF");
  p2on = strstr(message,"RE2 ON");
  p2off = strstr(message,"RE2 OFF");
  p3on = strstr(message,"RE3 ON");
  p3off = strstr(message,"RE3 OFF");
  p4on = strstr(message,"RE4 ON");
  p4off = strstr(message,"RE4 OFF");
  pallon = strstr(message,"ALL ON");
  palloff = strstr(message,"ALL OFF");
  modemResponse = strstr(message," ");
  
  onlyRelays();


  if(modemResponse)
  {
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }  
  else
  {
    digitalWrite(relay_1, LOW);
    digitalWrite(relay_2, LOW);
    digitalWrite(relay_3, LOW);
    digitalWrite(relay_4, LOW);
    lcd.setCursor(0,0);
    lcd.print("Invalid Command     ");
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  checkRelaysPort();
  sms.DeleteSMS((int)pos); 
  delay(5000);
  lcd.setCursor(0,0);
  lcd.print("SIM900 is ready.    ");
  lcd.setCursor(0,1);
  lcd.print("Waiting for SMS...  ");
} 
//===========================================
void onlyRelays()
{
  if(p1on)
  {
    digitalWrite(relay_1, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, HIGH);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p1off)
  {
    digitalWrite(relay_1, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, LOW);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p2on)
  {
    digitalWrite(relay_2, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, HIGH);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p2off)
  {
    digitalWrite(relay_2, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, LOW);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p3on)
  {
    digitalWrite(relay_3, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, HIGH);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p3off)
  {
    digitalWrite(relay_3, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, LOW);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p4on)
  {
    digitalWrite(relay_4, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, HIGH);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(p4off)
  {
    digitalWrite(relay_4, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, LOW);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(pallon)
  {
    digitalWrite(relay_1, HIGH);
    digitalWrite(relay_2, HIGH);
    digitalWrite(relay_3, HIGH);
    digitalWrite(relay_4, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, HIGH);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, HIGH);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
  else if(palloff)
  {
    digitalWrite(relay_1, LOW);
    digitalWrite(relay_2, LOW);
    digitalWrite(relay_3, LOW);
    digitalWrite(relay_4, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 0, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 1, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 2, LOW);
    EEPROM.writeBit(RELAYS_STATUS_ADDRESS, 3, LOW);
    lcd.setCursor(0,1);
    lcd.print(phone_number);
    lcd.print("      ");
  }
}
//===========================================
void beepBuzzer(unsigned long hz, unsigned long ms) 
{  
  unsigned long us = (750000 / hz);  
  unsigned long rep = (ms * 500L) / us; 


  for (int i = 0; i < rep; i++) 
  {  
    digitalWrite(BUZZER_PIN, HIGH);  
    delayMicroseconds(us);  
    digitalWrite(BUZZER_PIN, LOW);  
    delayMicroseconds(us);  
  }  
}
//===========================================
void SMSBeep()
{
  beepBuzzer(6250,100);
  delay(150);
  beepBuzzer(6250,200);
  delay(750);
  beepBuzzer(6250,100);
  delay(150);
  beepBuzzer(6250,200);
}  
//===========================================
void Ring()
{
  lcd.setCursor(0,0);
  lcd.print("Incoming call from: ");
  lcd.setCursor(0,1);
  lcd.print(phone_number);
  lcd.print("       "); 
  for(int i = 10; i > 0; i--)
  {
    beepBuzzer(6250,20);
    delay(20);
  }  
  delay(500);
  for(int i = 15; i > 0; i--)
  {
    beepBuzzer(6250,20);
    delay(20);
  }
  delay(1000);  
}  
//===========================================
void OK_DTMF()
{
  call.SendDTMF("*", 2);
  delay(500);
  call.SendDTMF("*", 2);
  delay(500);
}  
//===========================================
void NOT_OK_DTMF()
{
  call.SendDTMF("*", 1);
  delay(500);
} 
//===========================================
```

----------


## keap

Καλημέρα Μάνο,
άρα έχουμε έναν φάκελο keap_test_1 και 2 αρχεία μέσα keap_test_1.ino και utils.ino
Σωστά το έκανα?

----------


## manolena

O κώδικας στα *keap_test_1.ino* και *utils.ino* ανανεώθηκε με κάποιες λεπτομέρειες. Προστέθηκε εντολή DTMF (πάτημα 9) για ταυτόχρονη ενεργοποίηση ολων των ρελέ και εντολή (πάτημα 0) για ταυτόχρονη απενεργοποίηση όλων. Το ίδιο και με SMS: αποστολή ALL ON ενεργοποιεί όλα τα ρελέ μαζί και αποστολή ALL OFF τα απενεργοποιεί όλα μαζί.

----------


## keap

> O κώδικας στα *keap_test_1.ino* και *utils.ino* ανανεώθηκε με κάποιες λεπτομέρειες. Προστέθηκε εντολή DTMF (πάτημα 9) για ταυτόχρονη ενεργοποίηση ολων των ρελέ και εντολή (πάτημα 0) για ταυτόχρονη απενεργοποίηση όλων. Το ίδιο και με SMS: αποστολή ALL ON ενεργοποιεί όλα τα ρελέ μαζί και αποστολή ALL OFF τα απενεργοποιεί όλα μαζί.



Ωραία και τώρα αν ανοίξω το πρώτο προστήθετε αυτόματα και το δεύτερο ή κάνω κάποια άλλη διαδικασία?

----------


## manolena

> Ωραία και τώρα αν ανοίξω το πρώτο προστήθετε αυτόματα και το δεύτερο ή κάνω κάποια άλλη διαδικασία?



Δεν χρειάζεται τίποτα άλλο. Ανοίγεις το keap_test_1.ino και αυτόματα σε δεύτερο tab ανοίγει και το utils.ino. Κάνεις κανονικά compiling και uploading.

----------


## keap

Συγνώμη Μάνο που δεν σε ενημέρωσα με την πρόοδο αλλά είχα μπλέξει με την δουλειά.Θα ξεκινήσω πάλι και για τυχόν απορίες θα σου στείλω.

----------

