Re: Управление внешними устройствами с Arduino при помощи СМС
Посмотри вот в этом скетче это работает(String)...я сейчас уже с трудом понимаю что здесь насочинял :D:D:D да потом мне помогли в этом месте.
Там надо было вытащить из переменной в конце кусок и вывести в другом месте на экране
Или проблемы в другом ???
PHP код:
#include <LiquidCrystalRus.h> //БИБЛИОТЕКА lcd экрана
#include <OneWire.h> //БИБЛИОТЕКА цифровой датчик
volatile unsigned long t0; //обороты
volatile unsigned long t1; //обороты
volatile unsigned long dt; //обороты
OneWire ds(7); //ЦИФРОВОЙ ДАТЧИК температуры на цифровом 7 пине
LiquidCrystalRus lcd(12, 11, 10, 5, 4, 3, 1); // вместо 2 поставил 1 пин
int rpm; //переменная оборотов
int volt; // ++++++++переделать переменная напряжения
String volt_str; // для разделения числа на составные числа
int temp; //переменная температуры аналогового датчика температуры
String temp_str; // ????? отладка ?????????????????????????
int obog; //просто переменная
int x = 0; //переменная ключ, для вывода времени в пути и температуры на улице
boolean pitanie = LOW; // переменная габаритов
boolean gabarit = LOW; // ключ переменная габаритов
int Temp2; //!!!!!!!!!!!!!!??????????????????1!!!!!!!!!!!!!!!???????????????
int times2 = 1; // для моргания подсветкой при предельных значениях
int cur_millis , lastTick = 0; // переменные времени в пути
int mins, hour = 0; // время в пути
//==============================================================================================================
void setup()
{
millis(); // Время пошло
lcd.begin(16, 2); // Инициализация экрана 16 х 2
attachInterrupt(0, blink, FALLING); //прерывания обороты
t1 = 0; //
dt = 0; //
pinMode(8, OUTPUT); // 8 пин определяем как выход
digitalWrite(8, LOW); // на 8 пине земля
obog = 1; //
pinMode (6, INPUT); // пин для ГАБАРИТОВ
pinMode(9, OUTPUT); // пин для управления подсветкой экрана
digitalWrite(9, LOW); // подсветка выключена
pinMode(13, OUTPUT); // пин для мигания подсветкой экрана при предельных значениях.
digitalWrite(13, LOW); // подсветка не мигает-выключена
//------------------------вывод начальной инфы
lcd.setCursor(0, 0);
lcd.print("Хозяин Т");
lcd.setCursor(0, 1);
lcd.print("ЕЛ");
delay (1000);
lcd.clear(); //очистка экрана
lcd.setCursor(0, 0);
lcd.print("91672345");
lcd.setCursor(0, 1);
lcd.print("67");
delay (3000);
lcd.clear(); //очистка экрана
}
//==========================================================================================================
void loop() {
//------------------------------- определение времени мин. в пути----------------------------------------
cur_millis = millis() / 1000 / 60;
if (cur_millis - lastTick >= 1) {
lastTick = cur_millis;
mins++;
}
//--------------------------------определение состояния габаритов------------------------------------
if (digitalRead(6) == HIGH && pitanie == LOW) { // ВОЗМОЖНО ПРОЩЕ
gabarit = !gabarit; //
pitanie = HIGH;
}
else { pitanie = digitalRead(6); }
//-----------------------------------включение подсветки-----------------
if (digitalRead(6) == HIGH) {
digitalWrite(9, HIGH);
digitalWrite(13, HIGH);
}
else { digitalWrite(9, LOW); }
//-----------------------------------цифровой датчик начало-----------
{
byte data[2];
ds.reset();
ds.write(0xCC);
ds.write(0x44);
delay(750);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read();
data[1] = ds.read();
Temp2 = (data[1]<<8)+data[0];
Temp2 = Temp2>>4;
lcd.setCursor(14,1);
lcd.print(Temp2); // вывод цифрового датчика температуры
lcd.print(" "); // стераем старое лишнее
}
// -------------------------------цифровой датчик конец--------------
if (dt == 0) //
rpm = 0; //
else //
rpm = 60000000 / dt /50 * 50; // обороты
//----------------------------------------
volt = analogRead(4); //считывание вольт
volt = volt * 1.925; //вольты в нормальный вид, без запятой
volt_str = String(volt); //
if (volt_str.length() < 4) { volt_str = " " + volt_str; } //
//------------------------------------------
temp = analogRead(5); // считывание температуры
temp = temp * 0.48189 - 273; // температура в градусах цельсия
temp_str = String(temp); //
if (temp_str.length() < 2) { temp_str = " " + temp_str; } //
if (temp_str.length() < 3) { temp_str = " " + temp_str; } //
//------------------------------------------
if (temp < 40) // ЗАДАНИЕ ТЕМПЕРАТУРЫ ВКЛЮЧЕНИЯ...доп. оборудования
if (obog == 1) // !!!!!!!!!!!!!!!возможно упростить как с подсветкой lcd!!!!!!!!!!!!
{ //
digitalWrite(8, LOW); //
obog = 1 - obog; //
}
if (temp > 40) //ЗАДАНИЕ ТЕМПЕРАТУРЫ ВКЛЮЧЕНИЯ...
if (obog == 0) //
{
digitalWrite(8, HIGH); //
obog = 1 - obog; //
}
//++++++++++++++++++++++++ВЫВОД НА ЭКРАН++++++++++++++++++++++++++++++++++++++
if (rpm < 1000) { // мотор не заведен
lcd.setCursor(0,0);
lcd.print(temp);
lcd.print("c");
lcd.print(" ");
lcd.setCursor(5,0);
lcd.print(volt_str[0]);
lcd.print(volt_str[1]);
lcd.print(".");
lcd.setCursor(0,1);
lcd.print(volt_str[2]);
lcd.print(volt_str[3]);
// 1 3 9 c _ 1 2 . 3 4 пример, температура _ напряжение
delay(500);
}
// --------------------------------
if (gabarit == LOW && rpm > 1000) { // вкл...выкл и мотор работает
if(x == 0) {
lcd.clear(); //очистка экрана
if (mins >=60) { hour++; mins = 0; }
lcd.setCursor(0, 0);
lcd.print(hour); //вывод часов в пути
lcd.print(":");
if (mins < 10) {lcd.print("0");}
lcd.print(mins); // вывод минут в пути
lcd.print(" ");
lcd.print(Temp2); // вывод температуры на улице
lcd.print("c");
lcd.print(" ");
delay(2000);
lcd.clear(); //очистка экрана
x = 1; // изменяем ключ, чтоб только один раз использовался цикл
}
else
{
lcd.setCursor(0, 0);
lcd.print(rpm);
if (rpm <= 9999) { lcd.print(" "); }
lcd.setCursor(5, 0);
lcd.print(volt_str[0]);
lcd.print(volt_str[1]);
lcd.print(".");
lcd.setCursor(0,1);
lcd.print(volt_str[2]);
lcd.print(volt_str[3]);
// 9 9 9 9 _ 1 2 . 3 4 пример, обороты _ напряжение
delay(500);
}
}
//-------------------------------------------------
if (gabarit == HIGH && rpm > 1000) { // вкл...выкл мотор работает
if(x == 1) {
lcd.clear(); //очистка экрана
if (mins >=60) { hour++; mins = 0; }
lcd.setCursor(0, 0);
lcd.print(hour); //вывод часов в пути
lcd.print(":");
if (mins < 10) {lcd.print("0");}
lcd.print(mins); // вывод минут в пути
lcd.print(" ");
lcd.print(Temp2); // вывод температуры на улице
lcd.print("c");
lcd.print(" ");
delay(2000); // жде 2сек
lcd.clear(); //очистка экрана
x = 0; // изменяем ключ, чтоб только один раз использовался цикл
}
else
{
lcd.setCursor(0,0); //
lcd.print(rpm); //
lcd.print(" ");
if (rpm <= 9999) { lcd.print(" "); } // стераем лишнее
lcd.setCursor(6,0); //
lcd.print(temp_str[0]);
lcd.print(temp_str[1]);
lcd.setCursor(0,1);
lcd.print(temp_str[2]);
lcd.print("c");
// 9 9 9 9 _ _ 1 3 9 c пример, обороты _ температура
delay(500);
}
}
//--------------маргание подсветкой экрана при предельных значениях-------------
if (volt < 1150 || volt > 1450 || temp > 125) { // УСЛОВИЯ
if (millis() / 1000 >= times2 + 30) { // ИНТЕРВАЛ!!!!!!!!!!!
lcd.clear(); //очистка экрана
lcd.setCursor(0, 0);
//-------------------
float volt2; //переменная с запятой
volt2 = volt;
volt2 = volt2 / 100; // вольты в нормальном виде
if (volt < 1150) {lcd.print(volt2); lcd.print("v!");} //вывод предельных значений
if (volt > 1450) {lcd.print(volt2); lcd.print("v!");} //вывод предельных значений
if (temp > 125) {lcd.print(temp); lcd.print("c!!!"); } //вывод предельных значений
if (temp > 125 && (volt < 1150 || volt > 1450)) {lcd.setCursor(0, 0);
lcd.print(temp); lcd.print("c"); lcd.print(volt2);} //вывод предельных значений
//-------------------
digitalWrite(13, LOW); // цикл моргания подсветки
delay(200);
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH); //2
delay(100);
digitalWrite(13, LOW);
delay(200);
digitalWrite(13, HIGH); //3
delay(100);
digitalWrite(13, LOW);
delay(300);
digitalWrite(13, HIGH); //3
delay(100);
lcd.clear(); //очистка экрана
times2 = millis() / 1000; // переменная для цикла
}
}
}
//++++++++++++++++++++++++++++++ПРЕРЫВАНИЯ. ОБОРОТЫ ДВИЖКА+++++++++++++++++++++
void blink()
{
noInterrupts();
t0 = t1;
t1 = micros();
if (t0 > 0)
if (t0 < t1)
if (t1 - t0 > 5000)
{
dt = t1 - t0;
if (dt > 500000) dt = 0;
}
else
t1 = 0;
interrupts();
}
А может и TX и RX оба через делитель пустить???
Re: Управление внешними устройствами с Arduino при помощи СМС
Re: Управление внешними устройствами с Arduino при помощи СМС
:D Хрен редьки не слаще... я не разберусь.
Вот этот твой код(с мелким изменением) отработал 10 раз без ошибок. походу у меня только с терминалом телефон не дружит!!!
PHP код:
#include <NewSoftSerial.h>
char inchar[40];
//NewSoftSerial gsm(2,3);
NewSoftSerial gsm(9,8);
int ledpin = 13;
long previousMillis = 0;
long interval = 30000;
void setup()
{
pinMode(ledpin, OUTPUT);
gsm.begin(19200); // эксперементируй со скоростью
Serial.begin(19200);
gsm.flush();
delay(5000);
gsm.println("AT+CPMS =MT" ); // тут тоже эксперементы, или SM или МТ
delay(2000);
gsm.println("AT+CNMI=1,1\r");
delay(2000);
}
void loop()
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
gsm.println("AT+CMGL=4\r");
delay(1000);
}
if(gsm.read()=='0'&&gsm.read()=='7'&&gsm.read()=='9'&&gsm.read()=='1'&&gsm.read()=='9'&&gsm.read()== '7'&&gsm.read()=='6'&&gsm.read()=='1')
{
digitalWrite(ledpin,HIGH);
delay(60000);
gsm.println("AT+CMGD=1\r");
delay(2000);
digitalWrite(ledpin,LOW);
delay(1000);
}
}
Re: Управление внешними устройствами с Arduino при помощи СМС
В терминале:
1- выставь скорость, которая в скетче в Serial
2- выставь Both NL & CR
Re: Управление внешними устройствами с Arduino при помощи СМС
Цитата:
Сообщение от
metaforos
В терминале:
1- выставь скорость, которая в скетче в Serial
2- выставь Both NL & CR
1 скетч пока этот пользую с терминалом putty
//http://www.compcar.ru
uint8_t TX_Pin=9; // 2
uint8_t RX_Pin=8; //3
void setup()
{
pinMode(0, INPUT); //RX
pinMode(1, OUTPUT);//TX
pinMode(RX_Pin, OUTPUT);
pinMode(TX_Pin, INPUT);
}
void loop()
{
PORTB = PIND;
PORTD = PINB;
}
2 Извини, а что это, где копать, в putty(на русском) не нашел такого! а ардуиновский в ответ пишет то что я шлю.
Re: Управление внешними устройствами с Arduino при помощи СМС
В Ардуиновском Serial Мониторе. Если используещь NewSoftSerial, для тестов попробуй вот что:
Tx телефона подключи к 2 пину, а Rx к 3 пину
PHP код:
#include <string.h>
#include <NewSoftSerial.h>
NewSoftSerial phone(2,3);
char incoming_char=0;
void setup()
{
Serial.begin(9600);
phone.begin(9600);
Serial.println("Starting Communication...");
}
void loop() {
if(phone.available() >0){
incoming_char=phone.read();
Serial.print(incoming_char);
}
if(Serial.available() >0){
incoming_char=Serial.read();
Serial.print(incoming_char);
phone.print(incoming_char);
}
}
Re: Управление внешними устройствами с Arduino при помощи СМС
metaforos
Спасибо... и с этим помог. Теперь команды идут отлично и ответ всегда правильный!!!
Но есть странность
Шлю AT а в ответ...
at
at
OK
То есть любой мой посыл два раза печатается, потом нормальный ответ.
Мне кажется так не должно быть. Ну да и бог с ним главное проблема пропала.
Re: Управление внешними устройствами с Arduino при помощи СМС
Re: Управление внешними устройствами с Arduino при помощи СМС
Теперь вопрос к Chip. У меня начало происходить что-то странное. Использую http://www.compcar.ru/forum/showpost...&postcount=208
Все работает, но очень-очень тускло горят светодиоды. Раньше нормально было. Проверяю пины со светиками Blink'ом, - ярко горят. Посылаю СМС - тускло. В чем дело может быть?
Re: Управление внешними устройствами с Arduino при помощи СМС
Цитата:
Сообщение от
metaforos
Теперь вопрос к Chip. У меня начало происходить что-то странное. Использую
http://www.compcar.ru/forum/showpost...&postcount=208
Все работает, но очень-очень тускло горят светодиоды. Раньше нормально было. Проверяю пины со светиками Blink'ом, - ярко горят. Посылаю СМС - тускло. В чем дело может быть?
Извините, туплю... Пины то я перевесил, а здесь не поменял - for(byte i=10; i<14; i++) pinMode(i, OUTPUT);