Объединить два скетча вмести, как это сделать?
Здравствуйте ! помогите пожалуйста, есть два скетча и их нужно объединить. первый делает звонок на телефон при срабатывания датчика удара, второй типа центральный замок , мне нужно чтобы в функции закрытие дверей включался первый скетч.
первый /// GSM Датчик удара
#include SoftwareSerial.h
SoftwareSerial gsm(7, 8);
#define LED 13
#define ShockPin 3 // датчик удара
int ShockVal;
#define TELLNUMBER «ATD+79021039665;» // номер на который будет звонить датчик#define pinBOOT 5
void setup() <
Serial.begin(9600);
delay(1000);
gsm.begin(19200);
pinMode(LED, OUTPUT);
delay(1000);
digitalWrite(LED, HIGH);
delay(2000);
while(gsm.find(«STARTUP»));
gsm.println(«ATE0»);
while(1) <
gsm.println(«AT+COPS?»);
if (gsm.find(«+COPS: 0»)) break;
delay(50);
digitalWrite(LED, HIGH);
delay(500);
>
digitalWrite(LED, LOW);
delay(1500);
digitalWrite(LED, HIGH);
delay(250);
digitalWrite(LED, LOW);
void loop() <
Serial.println(ShockVal);
ShockVal = digitalRead(ShockPin);
if(ShockVal == LOW) <
digitalWrite(LED,HIGH);
gsm.println(TELLNUMBER);
delay(2500);
>
else
<
digitalWrite(LED, LOW);
>
второй
#include RemoteReceiver.h
int dver=12;
int bag=4;
RemoteReceiver::init(0, 3, showCode);
pinMode (dver,OUTPUT);
pinMode (bag,OUTPUT);
>
void showCode(unsigned long receivedCode, unsigned int period)
<
Serial.print(«Code: «);
Serial.print(receivedCode);
Serial.print(«, period duration: «);
Serial.print(period);
Serial.println(«us.»);
// открытие и зокрытие дверей
if (receivedCode == 411878) // закрыто
<
digitalWrite(dver,LOW)
>
if (receivedCode == 411810) // открыто
<
digitalWrite(dver,HIGH);
// багажник
if (receivedCode == 411864)
<
digitalWrite(bag,HIGH);
delay(100000);
digitalWrite(bag,LOW);
>
- Вопрос задан более трёх лет назад
- 1937 просмотров
- Вконтакте
Вот так, только откуда процедура showCode будет вызываться?
- Вконтакте
извините но я не понял вас, я не селен в это
компилятором проверил без ошибок , завтра на ардуине попробую
спасибо .
Здравствуйте, помогите пожалуйста объединить два скетча
Код для создания Ping:
byte mac[] = <0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED>; // max address for ethernet shield
byte ip[] = <192,168,0,177>; // ip address for ethernet shield
IPAddress pingAddr(0,0,0,0); // ip address to ping
SOCKET pingSocket = 0;
char buffer [256];
ICMPPing ping(pingSocket, (uint16_t)random(0, 255));
dns.getHostByName(«ya.ru»,pingAddr); // at this point the function works
ICMPEchoReply echoReply = ping(pingAddr, 4);
if (echoReply.status == SUCCESS)
«Reply[%d] from: %d.%d.%d.%d: bytes=%d time=%ldms TTL=%d»,
sprintf(buffer, «Echo request failed; %d», echoReply.status);
Код для отправки сообщения:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//структура для сообщения
struct Message
<
String From;//адрес отправителя
String To;// адрес получателя
String Subject;// Тема письма
String Body;// Текст письма
>;
//mac адрес устройства (можно не менять)
byte mac[] = <
0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x05 >;
//IP адрес адруины (можно не менять)
IPAddress ip(192,168,1,48);
// IP smtp сервера
IPAddress server(87,250,251,50);
// IP других сереров можно найти в инете
// логин и пароль к почтовому сервису
char login[] = «A. @yandex.ru»;//
char password[] = «A. «;
// создаем экземпляр клиента
EthernetClient client;
void setup() <
Serial.begin(9600);// UART
Ethernet.begin(mac,ip);// Запускаем шилд
Serial.println(«Start»);
>
void loop() <
while(Serial.available()) <
char inSerialChar = 0;
inSerialChar = Serial.read();
if(inSerialChar == ‘s’) <
SendMessage();// При отправке в дуину ‘s’, отправляем сообщение.
>
>
>
// метод подключения к серверу
bool connectToServer() <
if(client.connected()) <
>
else <
if(client.connect(server,25)) <
return true;
>
else <
return false;
>
>
>
// метод отправки сообщения
void SendMessage() <
Serial.println(«Please wite…»);
LogPass();
Message message = <
«A. @yandex.ru»,
«B. @yandex.ru»,
«Проба пера»,//тема
«Огромный привет от Ардуино. » >;//само сообщение
client.println(«MAIL From:<«+message.From+»>»);
delay(250);
client.println(«RCPT To:<«+message.To+»>»);
delay(250);
client.println(«DATA»);
delay(250);
client.println(«From:»+message.From);
client.println(«To:»+message.To);
client.println(«Subject:»+message.Subject);
delay(250);
client.println(message.Body);
delay(250);
client.println(«.»);// поприходуточкисерверставитсообщениевочередь
delay(250); // на отправку
client.println(«QUIT»);// как только закрыли соединение, сообщение улетает
delay(250);
Serial.println(«Message sending…»);
>
// подключение к серверу и авторизация
void LogPass() <
char array[64];// массив для кодирования
if(connectToServer()) <
client.println(F(«helo 1.2.3.4»));
delay(250);
client.println(F(«AUTH LOGIN»));
delay(250);
client.println(strToBase64(login));
delay(250);
client.println(strToBase64(password));
delay(250);
>
else <
Serial.println(«Server not connected…»);
>
// кодировка Base64
String strToBase64(char str[]) <
char charArray[64];
base64_encode(charArray,str,strlen(str));
String result = charArray;
return result;
>
Как объединить два скетча в один
- Проекты построены на одной и той же плате/платформе?
- Да – отлично!
- Нет – нужно убедиться, что “общая” плата сможет работать с железками, которые есть в объединяемых проектах, а также сама обладает нужной периферией.
- Нет – отлично!
- Да, I2C – все железки подключаются на I2C общей платы. Убедитесь, что адреса устройств не совпадают (случается крайне редко)!
- Да, SPI – у шины SPI все пины “общие”, кроме CS (Chip Select), этот пин может быть любым цифровым. Подробнее можно почитать вот тут.
- Да, UART – беда, к UART может быть подключено только одно устройство. Можно повесить одну железку на аппаратный UART, а вторую на SoftwareSerial. Либо заморачиваться с мультиплексорами.
- Нет – отлично!
- Да – разобраться, какую функцию выполняет пин в каждом из проектов и подобрать замену, как в железе, так и в программе:
- Если это обычный цифровой вход-выход, можно заменить на любой другой
- Если это измерение аналогового сигнала – заменить на другой аналоговый пин
- Если это генерация ШИМ, подключить соответственно на другой ШИМ пин и подкорректировать программу
- Если это прерывание – быть внимательным
- Нет – ОТЛИЧНО!
- Да – ситуация требует хорошего опыта работы с Ардуино…
- Используется один и тот же таймер – нельзя одновременно использовать ШИМ на ногах первого таймера и управление сервоприводами при помощи библиотеки Servo.h
- Используется генерация звука при помощи tone() – нельзя использовать ШИМ на ногах второго таймера
- Используются прерывания по таймеру и генерация ШИМ на соответствующем таймере – сложная ситуация
- И т.д., ситуаций может быть бесконечно много…
- Подключаем все библиотеки. Некоторые библиотеки могут конфликтовать, например Servo и Timer1, как обсуждалось выше.
- Сравниваем имена глобальных переменных и дефайны в объединяемых программах: они не должны совпадать. Совпадающие меняем при помощи замены по коду (Правка/Найти) на другие. Далее копипастим все глобальные переменные и дефайны в общую программу
- Объединяем содержимое блока setup()
- Копипастим в общую программу все “пользовательские” функции
- Остаётся у нас только loop() , и это самая сложная задача
- Основной код (который в loop()) из разных проектов должен выполняться по очереди по таймеру
- Набор действий из разных проектов должен переключаться кнопкой или ещё как-то
- К одному проекту добавляется датчик из другого проекта – данные нужно обработать и запрограммировать их дальнейшее движение (вывод на дисплей, отправку и т.д.)
- Все “проекты” должны работать одновременно на одной Ардуине
- И так далее
#define BLYNK_PRINT Serial#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <DHT.h>
#define RELA D7 // пин D7
#define DHTPIN D5 // пин D5
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22, AM2302, AM2321
//#define DHTTYPE DHT21 // DHT 21, AM2301DHT dht(DHTPIN, DHTTYPE);
int rela = 1;
int relas = 0;
char auth[] = «token»;
char ssid[] = «name wi-fi»;
char pass[] = «pass»;Объединить несколько скетчей?

Чтобы соединить несколько проектов в один, нужно разобраться со всеми возможными конфликтами:
- Проекты построены на одной и той же плате/платформе?
- Да – отлично!
- Нет – нужно убедиться, что “общая” плата сможет работать с железками, которые есть в объединяемых проектах, а также сама обладает нужной периферией.
- Нет – отлично!
- Да, I2C – все железки подключаются на I2C общей платы. Убедитесь, что адреса устройств не совпадают (случается крайне редко)!
- Да, SPI – у шины SPI все пины “общие”, кроме CS (Chip Select), этот пин может быть любым цифровым. Подробнее можно почитать вот тут.
- Да, UART – беда, к UART может быть подключено только одно устройство. Можно повесить одну железку на аппаратный UART, а вторую на SoftwareSerial. Либо заморачиваться с мультиплексорами.
- Нет – отлично!
- Да – разобраться, какую функцию выполняет пин в каждом из проектов и подобрать замену, как в железе, так и в программе:
- Если это обычный цифровой вход-выход, можно заменить на любой другой
- Если это измерение аналогового сигнала – заменить на другой аналоговый пин
- Если это генерация ШИМ, подключить соответственно на другой ШИМ пин и подкорректировать программу
- Если это прерывание – быть внимательным
- Нет – ОТЛИЧНО!
- Да – ситуация требует хорошего опыта работы с Ардуино…
- Используется один и тот же таймер – нельзя одновременно использовать ШИМ на ногах первого таймера и управление сервоприводами при помощи библиотеки Servo.h
- Используется генерация звука при помощи tone() – нельзя использовать ШИМ на ногах второго таймера
- Используются прерывания по таймеру и генерация ШИМ на соответствующем таймере – сложная ситуация
- И т.д., ситуаций может быть бесконечно много…
Можно внести все правки в схемы и программы объединяемых проектов, чтобы они не конфликтовали. Далее приступаем к сборке общей программы:
- Подключаем все библиотеки. Некоторые библиотеки могут конфликтовать, например Servo и Timer1, как обсуждалось выше.
- Сравниваем имена глобальных переменных и дефайны в объединяемых программах: они не должны совпадать. Совпадающие меняем при помощи замены по коду (Правка/Найти) на другие. Далее копипастим все глобальные переменные и дефайны в общую программу
- Объединяем содержимое блока setup()
- Копипастим в общую программу все “пользовательские” функции
- Остаётся у нас только loop() , и это самая сложная задача
Раньше у нас было два (или больше) отдельно работающих проекта. Теперь наша задача как программиста – продумать и запрограммировать работу этих нескольких проектов в одном, и тут ситуаций уже бесконечное множество:
- Основной код (который в loop()) из разных проектов должен выполняться по очереди по таймеру
- Набор действий из разных проектов должен переключаться кнопкой или ещё как-то
- К одному проекту добавляется датчик из другого проекта – данные нужно обработать и запрограммировать их дальнейшее движение (вывод на дисплей, отправку и т.д.)
- Все “проекты” должны работать одновременно на одной Ардуине
- И так далее
В большинстве случаев нельзя просто так взять и объединить содержимое loop() из разных программ, я надеюсь все это понимают. Даже мигалку и пищалку таким образом объединить не получится, если изначально код был написан с задержками или замкнутыми циклами.