Не работает термопара вместе с GSM модулем

strannik20
Offline
Зарегистрирован: 09.02.2020

Здравствуйте! Подскажите пожалуйста, я к сожалению в ардуино не силен, но сумел сообрать вот такой вот код:

#include "max6675.h"
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include "call.h"

//Термопара
int thermoDO = 8;  //он же SO
int thermoCS = 9;
int thermoCLK = 4;  //он же SCK

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

int vccPin = 5;  //пин для питания
int gndPin = 6;  //пин для земли

//=================Пины 2 и 3 для Подключения GSM модуля
SMSGSM sms;

int flag1=0;
boolean started=false;
char smsbuffer[160];
char n[20];
char nn[20];
char v[10];
//String n1 = "";   
String n1 = "";                                 // Номер 1
//String n2 = "";                               // Номер Жены
String n2 = "";                                 // Test
String v1 = "";
String s1 = "";
String input_string = "";
String smsContent = "";
char trevoga[] = "Vnimanie! Kriticheskaya temperatura! C = ";
char pos;
char sendsms[160];



void setup() {
   Serial.begin(9600);
  //активируем питание и землю
  pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);
  Serial.println("MAX6675 test");
  
  delay(1800);                                            //ждем стабилизации чипа MAX

if (gsm.begin(2400)) 
{
 started=true;
 } 
 else Serial.println("\nstatus=IDLE");
}


void loop() {
  delay(1800);                                              //ждем стабилизации чипа MAX
  
// ===========================СМС
if (thermocouple.readCelsius() >= 80 &&  flag1 <= 0) {
  
  Serial.print("Превышен температурный предел! С = ");
  Serial.println(thermocouple.readCelsius());

    String s1 = String(thermocouple.readCelsius(), 1);
    String v1 = String(trevoga + s1);
    v1.toCharArray(v,20);
    
    n1.toCharArray(n,20);
    sms.SendSMS(n, v);                                       // Посылаем СМС о том, что привышена температура
    sms.DeleteSMS(1);memset(n,0,20);
    
    n2.toCharArray(nn,20);
    sms.SendSMS(nn, v);                                       // Посылаем СМС о том, что привышена температура
    sms.DeleteSMS(1);memset(nn,0,20);
    
    char smsbuffer[160]="";
    flag1++;
    delay(10000); }

else if (thermocouple.readCelsius() >= 80 && flag1 > 0 && flag1 < 30000) {            // 5 минут на чтение смс

      
  pos = sms.IsSMSPresent(SMS_UNREAD);                                   // смотрим непрочитанные СМС
       if (pos) {                                                     // Если непрочитанные СМС есть, то...     
  getsms();                                                           // получаем непрочитанную СМС
  if (input_string=="0"){                                             // Команда "0" - отправить СМС 
       Serial.print("Prislo SMS!");
       n1.toCharArray(n,20);                                          //  Номер телефона


       String s1 = String(thermocouple.readCelsius(), 1);
       String v1 = String(s1 + " Gradusov");
       v1.toCharArray(v,20);

       
       sms.SendSMS(n, v);
       sms.DeleteSMS(1); 
       memset(n,0,20); 
       input_string="";
       char smsbuffer[160]="";}
//     flag1=0;
       sms.DeleteSMS(pos);                                           // удаляем СМС  из симки
      }
    flag1++;  
    delay(10000);}  

else if (thermocouple.readCelsius() >= 80 && flag1 >= 30000) {
  
  Serial.print("Превышен температурный предел! С = ");
  Serial.println(thermocouple.readCelsius());

    String s1 = String(thermocouple.readCelsius(), 1);
    String v1 = String(trevoga + s1);
    v1.toCharArray(v,20);

    n1.toCharArray(n,20);
    sms.SendSMS(n, v);                                       // Посылаем СМС о том, что привышена температура
    sms.DeleteSMS(1);memset(n,0,20);
    
    n2.toCharArray(nn,20);
    sms.SendSMS(nn, v);                                       // Посылаем СМС о том, что привышена температура
    sms.DeleteSMS(1);memset(nn,0,20);
    
    char smsbuffer[160]="";
    flag1++;
    delay(180000000); }                                             //Задержка 3 минуты
  
else if (thermocouple.readCelsius() < 80) {
    Serial.print("Температура в норме! С =  ");
    Serial.println(thermocouple.readCelsius());
    flag1=0;
    delay(10000);}  


  pos = sms.IsSMSPresent(SMS_UNREAD);                                // смотрим непрочитанные СМС
    if (pos) {                                                       // Если непрочитанные СМС есть, то...     
  getsms();                                                          // получаем непрочитанную СМС
    if (input_string=="0"){                                          // Команда "0" - отправить СМС 
       Serial.println("Prislo SMS!");
       n1.toCharArray(n,20);                                          //  Номер телефона

       String s1 = String(thermocouple.readCelsius(), 1);
       String v1 = String(s1 + " Gradusov");

       v1.toCharArray(v,20);
       sms.SendSMS(n, v);
       sms.DeleteSMS(1); 
       memset(n,0,20); 
       input_string="";
       char smsbuffer[160]="";}
//     flag1=0;
       sms.DeleteSMS(pos);                                           // удаляем СМС  из симки
      }

}
void getsms()
{
   sms.GetSMS(1,n,20,smsbuffer,160);
   input_string =String(smsbuffer);
          }

К сожалению не выходит нормально работать с термопарой. Отдельно от моего скетча все работает.  Также если не подавать питание на SIM модуль термопара начинает отвечать, но с разбросом температуры. Думаю что проблема в настройках скорости, но как исправить уразуметь не выходит. Модуль термопары: MAX6675K. Модуль SIM: SIM800L.

SLKH
Offline
Зарегистрирован: 17.08.2015

А нефиг задалбывать микросхему своими беспрерывными приставаниями.

Что ты пинаешь её своим thermocouple.readCelsius() через несколько микросекунд?

Измерь один раз температуру с присвоением значения какой-то переменной и эту переменную теребунькай своими if'ами  и print'ами как угодно.

 

 

 

strannik20
Offline
Зарегистрирован: 09.02.2020
Я исправил код вот так: 

#include "max6675.h"
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include "call.h"

//Термопара
int thermoDO = 8;  //он же SO
int thermoCS = 9;
int thermoCLK = 4;  //он же SCK

MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);

int vccPin = 5;  //пин для питания
int gndPin = 6;  //пин для земли

//=================Пины 2 и 3 для Подключения GSM модуля
SMSGSM sms;

int flag1=0;
boolean started=false;
char smsbuffer[160];
char n[20];
char nn[20];
char v[10];
//String n1 = "+79506381005";   
String n1 = "+79506333493";                                 // Номер Злобина АВ
//String n2 = "+79041642822";                                 // Номер Жены
String n2 = "+79506381005";                                 // Test
String v1 = "";
String s1 = "";
String input_string = "";
String smsContent = "";
char trevoga[] = "Vnimanie! Kriticheskaya temperatura! C = ";
char pos;
char sendsms[160];



void setup() {
   Serial.begin(9600);
  //активируем питание и землю
  pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
  pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);
  Serial.println("MAX6675 test");
 
  delay(1800);                                            //ждем стабилизации чипа MAX

if (gsm.begin(2400))
{
 started=true;
 }
 else Serial.println("\nstatus=IDLE");
}


void loop() {
  delay(1800);                                            //ждем стабилизации чипа MAX
  String s1 = String(thermocouple.readCelsius(), 1);
    Serial.print("С = ");
  Serial.println(s1);
 
// ===========================СМС
if (s1 >= 80 &&  flag1 <= 0) {
 
  Serial.print("Превышен температурный предел! С = ");
  Serial.println(thermocouple.readCelsius());

//   String s1 = String(thermocouple.readCelsius(), 1);
    String v1 = String(trevoga + s1);
    v1.toCharArray(v,20);
    
    n1.toCharArray(n,20);
    sms.SendSMS(n, v);                                       // Посылаем СМС о том, что привышена температура
    sms.DeleteSMS(1);memset(n,0,20);
    
    n2.toCharArray(nn,20);
    sms.SendSMS(nn, v);                                       // Посылаем СМС о том, что привышена температура
    sms.DeleteSMS(1);memset(nn,0,20);
    
    char smsbuffer[160]="";
    flag1++;
    delay(10000); }

else if (s1 >= 80 && flag1 > 0 && flag1 < 30000) {            // 5 минут на чтение смс

      
  pos = sms.IsSMSPresent(SMS_UNREAD);                                   // смотрим непрочитанные СМС
       if (pos) {                                                     // Если непрочитанные СМС есть, то...     
  getsms();                                                           // получаем непрочитанную СМС
  if (input_string=="0"){                                             // Команда "0" - отправить СМС
       Serial.print("Prislo SMS!");
       n1.toCharArray(n,20);                                          //  Номер телефона


//       String s1 = String(thermocouple.readCelsius(), 1);
       String v1 = String(s1 + " Gradusov");
       v1.toCharArray(v,20);

       
       sms.SendSMS(n, v);
       sms.DeleteSMS(1);
       memset(n,0,20);
       input_string="";
       char smsbuffer[160]="";}
//     flag1=0;
       sms.DeleteSMS(pos);                                           // удаляем СМС  из симки
      }
    flag1++;  
    delay(10000);}  

else if (s1 >= 80 && flag1 >= 30000) {
 
  Serial.print("Превышен температурный предел! С = ");
  Serial.println(s1);

 //   String s1 = String(thermocouple.readCelsius(), 1);
    String v1 = String(trevoga + s1);
    v1.toCharArray(v,20);

    n1.toCharArray(n,20);
    sms.SendSMS(n, v);                                       // Посылаем СМС о том, что привышена температура
    sms.DeleteSMS(1);memset(n,0,20);
    
    n2.toCharArray(nn,20);
    sms.SendSMS(nn, v);                                       // Посылаем СМС о том, что привышена температура
    sms.DeleteSMS(1);memset(nn,0,20);
    
    char smsbuffer[160]="";
    flag1++;
    delay(180000000); }                                             //Задержка 3 минуты
 
else if (s1 < 80) {
    Serial.print("Температура в норме! С =  ");
    Serial.println(s1);
    flag1=0;
    delay(10000);}  


  pos = sms.IsSMSPresent(SMS_UNREAD);                                // смотрим непрочитанные СМС
    if (pos) {                                                       // Если непрочитанные СМС есть, то...     
  getsms();                                                          // получаем непрочитанную СМС
    if (input_string=="0"){                                          // Команда "0" - отправить СМС
       Serial.println("Prislo SMS!");
       n1.toCharArray(n,20);                                          //  Номер телефона

//      String s1 = String(thermocouple.readCelsius(), 1);
       String v1 = String(s1 + " Gradusov");

       v1.toCharArray(v,20);
       sms.SendSMS(n, v);
       sms.DeleteSMS(1);
       memset(n,0,20);
       input_string="";
       char smsbuffer[160]="";}
//     flag1=0;
       sms.DeleteSMS(pos);                                           // удаляем СМС  из симки
      }

}
void getsms()
{
   sms.GetSMS(1,n,20,smsbuffer,160);
   input_string =String(smsbuffer);
          }

Вероятнее всего что это не правильно. Но и результат все равно не правильный. Температура все равно плавает от 0 до 25. Если использовать пример для измерения температуры, то все работает хорошо.

b707
Offline
Зарегистрирован: 26.05.2017

strannik20 пишет:
Вероятнее всего что это не правильно.

угадали

интересно, а вы никаких других типов переменных, кроме String - не знаете?

Зачем переводить числовое значение температуры в текстовой формат, чтобы через строчку сранивать его с числом 80? - как вы думаете, получится из такого сравнения толк?

strannik20
Offline
Зарегистрирован: 09.02.2020

Я знаю об этой ошибке, исправлял в торопях. На работе завал... Однако в начале где скетч еще выполняется и выводит в монитор порта температуру: все равно отправляются не верные значения. Значит я делаю вывод что теребуньканья микросхемы тут не причем.

sadman41
Offline
Зарегистрирован: 19.10.2016

Комментируй всё, что не связано с термопарой, так уменьшишь круг подозреваемых.

vccPin - для MAX6675 что ли?

strannik20
Offline
Зарегистрирован: 09.02.2020

Изначально да vccPin был для MAX6675. Сейчас оно не используется.

if (gsm.begin(2400)) 
{
 started=true;
 } 
 else Serial.println("\nstatus=IDLE");
}

Температура начинает работать после закоменчивания вот этого куска кода.

b707
Offline
Зарегистрирован: 26.05.2017

strannik20 пишет:

f (gsm.begin(2400))

{
 started=true;
 } 
 else Serial.println("\nstatus=IDLE");
}

Температура начинает работать после закоменчивания вот этого куска кода.

не вижу в коде, где описано gsm и где задаюься его пины

strannik20
Offline
Зарегистрирован: 09.02.2020

GSM описан в библиотеке, пины заданы там же.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, поди, GSM просаживает питание, когда работать начинает.

strannik20
Offline
Зарегистрирован: 09.02.2020

Мой GSM модуль от USB и вообще от Arduino работать отказался. Поэтому он питается от ЛБП, так что просад  по питанию исключен. Да и если бы проблема была в этом, то при отключении модуля GSM оно бы работало нормально, но нет. Не работает.

Проблема скорее всего с программным портом Serial, или согласовании их скоростей или прерываний каких-нибудь. Я тут совсем нуб, увы.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, MAX хреново себя ведёт при частом опросе. Его тут нет. Остальные симптомы непонятны. 

SLKH
Offline
Зарегистрирован: 17.08.2015

strannik20 пишет:

GSM описан в библиотеке, пины заданы там же.

В какой библиотеке?

если в GSM, так она не подключена.

strannik20
Offline
Зарегистрирован: 09.02.2020
#include "SIM900.h"

Вот тут. Библиотека вот:

https://yadi.sk/d/qADcoDLJDTMFzQ