Как объединить две программы в Arduino?

Итак, у меня есть ESP8266 nodemcu, на который я прошил программу под названием Deauther 2.0. Последние два часа я потратил на то, чтобы объединить ещё один Sketch. Но всё закончилось плачевно.

Чего я пытаюсь достичь:

При первом включении nodemcu должен загрузиться Deauther. Но при нажатии кнопки встроенной флеш-памяти должен загрузиться второй скетч.

Что я попытался исправить:

  1. Добавил свой собственный clock.cpp в скетч Deauther и отредактировал верхнюю часть скетча:

    const int button = 0;  
    
    int temp = 0;
    
     void setup() {
    
     pinMode(button, INPUT)
    
     }
    
     void loop() {
    
     temp = digitalRead(button)
    
     if (temp == HIGH ) {
    
     // запустить код ниже
    
    }
    
  2. Ещё кое-что, о чём я не хочу упоминать.

Есть идеи, как это исправить?

Спасибо!

, 👍-1

Обсуждение

Волшебного способа объединить два скетча не существует. В общем случае это может быть невозможно. Вам нужно понять, что и как делает один скетч, понять, что и как делает другой, и написать третий скетч, объединяющий оба. Устраните любые проблемы, возникающие при обычном подходе., @Mark Smith

Автор не говорит об объединении двух эскизов. Автор говорит об использовании одного эскиза для загрузки другого эскиза., @jsotola

Любой, кто задаёт такой простой вопрос, не имеет права использовать деаутентификацию Wi-Fi. С ESP8266 можно делать столько всего интересного. Почему же вы выбираете вредоносное использование?, @per1234

@per1234 Я не использую деаутентификацию в вредоносных целях, я только тестирую ее в своей собственной сети., @nobody user


1 ответ


2

Чтобы объединить скетчи, необходимо убедиться, что они не будут пытаться получить доступ к одним и тем же контактам/ресурсам несовместимыми способами. Например, если обоим требуется входной сигнал через последовательный порт, необходимо настроить параметры так, чтобы отправляемый входной сигнал достигал корректного кода.

Убедившись в этом, зачастую проще всего сначала провести рефакторинг обоих набросков, чтобы избежать любого типа кода, вызывающего задержку, или чего-либо, что останавливает выполнение в ожидании каких-либо событий, и вместо этого использовать конечный автомат, который просто постоянно выполняет цикл и использует временные метки для управления тем, когда следует выполнять какие-либо действия.

Например, второй скетч имеет формат:

void loop(){
    //do stuff

    delay(1000);
}

Вам следует переписать это так

unsigned long last_run = 0;

void loop(){
    unsigned long current_millis = millis();
    if(current_millis - last_run > 1000){
        last_run = current_millis;
        //делайте то, что никогда не блокирует

    }
}

После того, как это будет завершено и вы убедитесь, что нет конфликта имен между скетчами для функций/глобальных переменных, вы можете просто добавить функции loop() и setup() в новые функции loop() и setup()

,