Не работает термопара вместе с GSM модулем
- Войдите на сайт для отправки комментариев
Вс, 09/02/2020 - 16:59
Здравствуйте! Подскажите пожалуйста, я к сожалению в ардуино не силен, но сумел сообрать вот такой вот код:
#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.
А нефиг задалбывать микросхему своими беспрерывными приставаниями.
Что ты пинаешь её своим thermocouple.readCelsius() через несколько микросекунд?
Измерь один раз температуру с присвоением значения какой-то переменной и эту переменную теребунькай своими if'ами и print'ами как угодно.
Я исправил код вот так: #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. Если использовать пример для измерения температуры, то все работает хорошо.
угадали
интересно, а вы никаких других типов переменных, кроме String - не знаете?
Зачем переводить числовое значение температуры в текстовой формат, чтобы через строчку сранивать его с числом 80? - как вы думаете, получится из такого сравнения толк?
Я знаю об этой ошибке, исправлял в торопях. На работе завал... Однако в начале где скетч еще выполняется и выводит в монитор порта температуру: все равно отправляются не верные значения. Значит я делаю вывод что теребуньканья микросхемы тут не причем.
Комментируй всё, что не связано с термопарой, так уменьшишь круг подозреваемых.
vccPin - для MAX6675 что ли?
Изначально да vccPin был для MAX6675. Сейчас оно не используется.
if (gsm.begin(2400)) { started=true; } else Serial.println("\nstatus=IDLE"); }Температура начинает работать после закоменчивания вот этого куска кода.
f (gsm.begin(2400)) { started=true; } else Serial.println("\nstatus=IDLE"); }Температура начинает работать после закоменчивания вот этого куска кода.
не вижу в коде, где описано gsm и где задаюься его пины
GSM описан в библиотеке, пины заданы там же.
Ну, поди, GSM просаживает питание, когда работать начинает.
Мой GSM модуль от USB и вообще от Arduino работать отказался. Поэтому он питается от ЛБП, так что просад по питанию исключен. Да и если бы проблема была в этом, то при отключении модуля GSM оно бы работало нормально, но нет. Не работает.
Проблема скорее всего с программным портом Serial, или согласовании их скоростей или прерываний каких-нибудь. Я тут совсем нуб, увы.
Ну, MAX хреново себя ведёт при частом опросе. Его тут нет. Остальные симптомы непонятны.
GSM описан в библиотеке, пины заданы там же.
если в GSM, так она не подключена.
Вот тут. Библиотека вот:
https://yadi.sk/d/qADcoDLJDTMFzQ