Member 13710355 Ответов: 2

Нужна помощь с кодированием arduino для проекта


Привет, я полный новичок в arduino и использую c/c++. Для этого проекта я должен был составить прецедент использования и на основе этого прецедента получить для него три датчика arduino.
Мой вариант использования-это умная трость, которая помогает слабовидящим, датчики включают в себя датчик движения PIR, ультразвуковой датчик и пьезоэлектрический датчик (дискообразный) и зуммер.

Как это должно работать :
1. Нажмите на пьезоэлектрический датчик
2.PIR-датчик проверяет наличие любых движущихся объектов
3.пока пир проверяет наличие движущихся объектов, активируются ультразвуковой датчик и зуммер.
4. Если движущийся объект улавливается пир и находится на определенном расстоянии от ультразвукового датчика, зуммер должен предупредить пользователя.

Я нашел код для ультразвукового датчика/зуммера, пир-датчика и пьезоэлектрического датчика.

Мне нужна помощь в том, как объединить три эскиза Arduino для датчиков.
Мне также нужна помощь и совет о том, как я могу заставить три датчика работать так, как я хочу, чтобы они работали, о чем говорилось выше.

Код для пьезоэлектрического датчика:
/* Knock Sensor

 * ----------------

 *

 * Program using a Piezo element as if it was a knock sensor.

 *

 * We have to basically listen to an analog pin and detect 

 * if the signal goes over a certain threshold. It writes

 * "knock" to the serial port if the Threshold is crossed,

 * and toggles the LED on pin 13.

 *

 * (cleft) 2005 D. Cuartielles for K3

 * edited by Scott Fitzgerald 14 April 2013

 */



int ledPin = 13;

int knockSensor = 0;               

byte val = 0;

int statePin = LOW;

int THRESHOLD = 100;



void setup() {

 pinMode(ledPin, OUTPUT); 

 Serial.begin(9600);

}



void loop() {

  val = analogRead(knockSensor);     

  if (val >= THRESHOLD) {

    statePin = !statePin;

    digitalWrite(ledPin, statePin);

    Serial.println("Knock!");



  }

  delay(100);  // we have to make a delay to avoid overloading the serial port

}


Код для датчика движения PIR:
int calibrationTime = 30;        

long unsigned int lowIn;         
long unsigned int pause = 5000;  

boolean lockLow = true;
boolean takeLowTime;  

int pirPin = 3;    //the digital pin connected to the PIR sensor's output

void setup(){
  Serial.begin(9600);
  pinMode(pirPin, INPUT);
  digitalWrite(pirPin, LOW);

  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
    for(int i = 0; i < calibrationTime; i++){
      Serial.print(".");
      delay(1000);
      }
    Serial.println(" done");
    Serial.println("SENSOR ACTIVE");
    delay(50);
  }
void loop(){

     if(digitalRead(pirPin) == HIGH){
       digitalWrite(ledPin, HIGH);   //the led visualizes the sensors output pin state
       if(lockLow){  
         lockLow = false;            
         Serial.println("---");
         Serial.print("motion detected at ");
         Serial.print(millis()/1000);
         Serial.println(" sec"); 
         delay(50);
         }         
         takeLowTime = true;
       }

     if(digitalRead(pirPin) == LOW){       
       digitalWrite(ledPin, LOW);  //the led visualizes the sensors output pin state

       if(takeLowTime){
        lowIn = millis();          //save the time of the transition from high to LOW
        takeLowTime = false;       //make sure this is only done at the start of a LOW phase
        }
       if(!lockLow && millis() - lowIn > pause){  
           lockLow = true;                        
           Serial.print("motion ended at ");      //output
           Serial.print((millis() - pause)/1000);
           Serial.println(" sec");
           delay(50);
           }
       }
  }



Код для ультразвукового датчика и зуммера:
#define trigPin 13
#define echoPin 12
int buzzer = 6;

void setup()
{ pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzer,OUTPUT);
}

void loop()
{ long duration, distance;
digitalWrite(trigPin, LOW); 
delayMicroseconds(2); 
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); 
digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);
distance = (duration/2) / 29.1;

if (distance < 100) // Checking the distance, you can change the value
{ 
// When the the distance below 100cm
digitalWrite(buzzer,HIGH);
} else
{
// when greater than 100cm
digitalWrite(buzzer,LOW); 
} delay(500);
}


Что я уже пробовал:

YouTube обучает, сайты и обсуждает с коллегами.

2 Ответов

Рейтинг:
2

KarstenK

Вы должны посетить этот сайт вместе с Встроенные примеры.

Ваши датчики должны взаимодействовать в некотором роде Многопоточный режим и Совпадение работать.

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

Arduino - это отличный способ весело провести время, изучая программирование ;-)


Рейтинг:
1

raddevus

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

Объединение эскизов
Во-первых, я предполагаю, что вы понимаете, что каждый эскиз, который выполняется, в основном состоит из :
1) настройка (выполняется один раз при каждом включении устройства)
2) петля (работает / петляет во время питания устройства)

Контакты и порты
Хорошо, следующая вещь заключается в том, что булавки-это булавки Arduino, которые считывают входные данные.
Порты-это контакты, которые записывают выходной сигнал (например, устанавливая высокое напряжение).

Начиная с этого базового понимания, мы можем продолжать думать об этом следующим образом.

Застрахуйте Каждый Pin-Код/Порт, Используемый Только Для Одной Вещи
Убедитесь, что в каждом из ваших эскизов не используется ни один pin-код (D1, D2 и т. д.) для двух разных вещей.
Опять же, это основное, но просто устанавливающее идею здесь.

Если мы можем гарантировать, что каждый контакт/порт используется только для одной вещи, то мы можем легко объединить части настройки и цикла из 3 эскизов, и все они будут работать так же, как и при запуске только одного.

*Однако могут возникнуть проблемы со скоростью обработки входных данных, в результате чего более поздний код в цикле не будет обработан до тех пор, пока не будут обработаны более ранние части кода в цикле.
IE - если D1 получает данные в скрипте, а затем что-то делает и держит процессор занятым, то нижние части эскиза не будут запускаться до тех пор, пока не будет выполнена часть эскиза D1. Надеюсь, это имеет смысл.

Теперь я попытаюсь объединить ваши первые два наброска:

// ### SKETCH 1 items ####
int ledPin = 13;
int knockSensor = 0;               
byte val = 0;
int statePin = LOW;
int THRESHOLD = 100;

// ### SKETCH 2 items ####
int calibrationTime = 30;        

long unsigned int lowIn;         
long unsigned int pause = 5000;  
boolean lockLow = true;
boolean takeLowTime;  
int pirPin = 3;    //the digital pin connected to the PIR sensor's output


void setup() {
 pinMode(ledPin, OUTPUT); 
 Serial.begin(9600);

  pinMode(pirPin, INPUT);
  digitalWrite(pirPin, LOW);

  //give the sensor some time to calibrate
  Serial.print("calibrating sensor ");
    for(int i = 0; i < calibrationTime; i++){
      Serial.print(".");
      delay(1000);
      }
    Serial.println(" done");
    Serial.println("SENSOR ACTIVE");
    delay(50);
}


void loop() {
  val = analogRead(knockSensor);     

  if (val >= THRESHOLD) {
    statePin = !statePin;
    digitalWrite(ledPin, statePin);
    Serial.println("Knock!");
  }

     if(digitalRead(pirPin) == HIGH){
       digitalWrite(ledPin, HIGH);   //the led visualizes the sensors output pin state
       if(lockLow){  
         lockLow = false;            
         Serial.println("---");
         Serial.print("motion detected at ");
         Serial.print(millis()/1000);
         Serial.println(" sec"); 
         delay(50);
         }         
         takeLowTime = true;
       }

     if(digitalRead(pirPin) == LOW){       
       digitalWrite(ledPin, LOW);  //the led visualizes the sensors output pin state

       if(takeLowTime){
        lowIn = millis();          //save the time of the transition from high to LOW
        takeLowTime = false;       //make sure this is only done at the start of a LOW phase
        }
       if(!lockLow && millis() - lowIn > pause){  
           lockLow = true;                        
           Serial.print("motion ended at ");      //output
           Serial.print((millis() - pause)/1000);
           Serial.println(" sec");
           delay(50);
           }
       }

  delay(100);  // we have to make a delay to avoid overloading the serial port
}


Рознь
Я не вижу никаких серьезных противоречий в этих двух набросках-это означает, что вы сможете объединить их и запустить, как это сделал я. ЗАПИСКА:Возможно, я неправильно скопировал/вставил код, поэтому, пожалуйста, изучите его более внимательно.

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

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