Датчик расстояния и температурный датчик

Maxymilian
Offline
Зарегистрирован: 20.08.2015
Здравствуйте. Очень нужна ваша помощь с АРДУИНО скетчем. 2 года назад я написал большой и нормально работающий скетч для робота. Проблема в том что при нажатии клавишы "X" в спец. проге мне должно показывать температуру и дистанцию к обєкту. А оно не показывает (даже Temp).Посмотрите пожалуйста мой скетч и испарвте ошыбку. Он очень понятен и там все расписано (что и куда)
 
Maxymilian
Offline
Зарегистрирован: 20.08.2015
#include <Servo.h>
#include <OneWire.h>
#include "Ultrasonic.h"
Ultrasonic ultrasonic(A0, A1);//пины для ультразвукового дальномера
int dist_cm=100;//начальное значение расстояния
OneWire  ds(2);  // линия 1-Wire будет на pin 2, тоесть датчик температуры подключен к пину 2
//начальные позиции для каждой сервы задаём индивидуально от 5 до 250, что примерно от 0 до 180градусов
byte pan=90;
byte tilt=90;
byte servo3=90;
byte servo4=90;
byte servo5=90;
byte servo6=90;
//переменные для хранения предыдущих значений позиций сервов
byte lastPan, lastTilt, lastServo3, lastServo4, lastServo5, lastServo6;
//объявления имен сервов
Servo panServo, tiltServo, Servo3, Servo4, Servo5, Servo6;
//пины для запуска моторшилда
int E1 = 5;  
int M1 = 4; 
int E2 = 6;                      
int M2 = 7;                        
int val = 0; //переменная для хранения данных сериал
int led = 13; //светодиод на 13м пине
int mState = 0; //глобальная переменная для хранения состояния направления
//задание прерыва между вкл выкл фар
long interval = 4000;  
long previousMillis = 0;//предыдущее значение временной переменной
//фарЫ)))
byte LedPin=A2; //пин аналогового входа А2
byte LedState=0; //по умолчанию фары выключены
//направления с именами для удобства управления функцией, меняем местами цифры и можно менять управление
int STOP = 0;
int VPERED=1;
int VLEVO=3;
int VPRAVO=2;
int NAZAD=4;
int tempSpeed=0;
int val2;  //переменная для хранения предыдущих данных сериал
int pause = 33; //глобальная переменная - подбирается для скорости, отзывчивости робота и задержек считывания кнопок
void setup() 
  Serial.begin(9600); //запускаем передачу данных Serial
 
//назначаем порты моторов на вывод
    pinMode(M1, OUTPUT);   
    pinMode(M2, OUTPUT); 
    pinMode(LedPin, OUTPUT); 
//назначаем порты для серв, ВАЖНО что с 4 по 7й пины - ЗАНЯТЫ!!!
  panServo.attach(13); //Серва 1
 tiltServo.attach(12); //Серва 2
    Servo3.attach(11); //Серва 3
    Servo4.attach(10); //Серва 4
    Servo5.attach(9); //Серва 5
    Servo6.attach(8); //Серва 6
 
void loop()
  // 
  
//обработка данных поступающих с компьютера
  if (val2==val) val=0; //если предыдущее значение равно текущей, задаём текущей значение нуль(для остановки после того как отпустил клавишу)
  while (Serial.available()>0) { //ожидаем передачу данных
  val = Serial.read();} //получаем данные в переменную
  if(val2!=val) val2=val; //если новые данные отличаются от старых, старые = новым
  if (-1 != val) 
 { 
  
//запуск действий в зависимости от нажатой клавиши
 if ('W' == val2)mDrive(VPERED,255);  //едем вперед при нажатии W
 else if ('S' == val2) mDrive(NAZAD,255); //едем Назад при нажатии S
 else if ('A' == val2) mDrive(VLEVO,255); //едем влево при нажатии A
 else if ('D' == val2) mDrive(VPRAVO,255); //едем вправо при нажатии D
 else if ('X' == val2) //показываем температуру, включаем фары
 { 
  dist_cm = ultrasonic.Ranging(CM);//считываем показания расстояния
 
   if (val2!=0){
  temp();//отображаем температуру и расстояние текущие
  val2=0;
 }
   
 }
 
 //дальше управляем сервами каждая серва имеет управление из 2х клавишь, одна увеличивает угол, вторая уменьшает
 //первая серва
 else if ('Q' == val2) 
 { 
   if (val2!=0){
   if(pan>=1 and pan<=254) pan=pan-1;
   //Serial.println(pan);
 val2=0;
 }
 }
 else if ('E' == val2) 
 { 
   if (val2!=0){
   if(pan>=0 and pan<254) pan=pan+1;
   //Serial.println(pan);
   val2=0;}
 }
 //##########################################
 //вторая серва
 else if ('Z' == val2) 
 { 
    if (val2!=0){
   if(tilt>=1 and tilt<=254) tilt=tilt-1;
 // Serial.println(tilt);
 val2=0;
 }
 }
 else if ('C' == val2) 
 { 
   if (val2!=0){
   if(tilt>=0 and tilt<254) tilt=tilt+1;
 //  Serial.println(tilt);
   val2=0;}
 }
 //##########################################
 //третья серва
 else if ('R' == val2) 
 { 
    if (val2!=0){
   if(servo3>=1 and servo3<=254) servo3=servo3-1;
  // Serial.println(servo3);
 val2=0;
 }
 }
 else if ('T' == val2) 
 { 
   if (val2!=0){
   if(servo3>=0 and servo3<254) servo3=servo3+1;
  // Serial.println(servo3);
   val2=0;}
 }
 //##########################################
 //четвертая серва
 else if ('Y' == val2) 
 { 
    if (val2!=0){
   if(servo4>=1 and servo4<=254) servo4=servo4-1;
   //Serial.println(servo4);
 val2=0;
 }
 }
 else if ('U' == val2) 
 { 
   if (val2!=0){
   if(servo4>=0 and servo4<254) servo4=servo4+1;
   //Serial.println(servo4);
   val2=0;}
 }
 //##########################################
 //пятая серва
 else if ('I' == val2) 
 { 
    if (val2!=0){
   if(servo5>=1 and servo5<=254) servo5=servo5-1;
   //Serial.println(servo5);
 val2=0;
 }
 }
 else if ('O' == val2) 
 { 
   if (val2!=0){
   if(servo5>=0 and servo5<254) servo5=servo5+1;
   //Serial.println(servo5);
   val2=0;}
 }
 //##########################################
 //шестая серва
 else if ('P' == val2) 
 { 
    if (val2!=0){
   if(servo6>=1 and servo6<=254) servo6=servo6-1;
   //Serial.println(servo6);
   val2=0;}
 }
 
 else if ('L' == val2) 
 { 
   if (val2!=0){
   if(servo6>=0 and servo6<254) servo6=servo6+1;
  // Serial.println(servo6);
   val2=0;}
 }
 //##########################################
 
 //Останавливаем моторы после того как отпустили клавишу управления
 else if (0 == val2)
 {  
   mDrive(STOP,0);
 } 
 
  delay(pause);//для плавности
  
//###################################################
//обнуляем глобальные переменные, которые сохраняют текущее и предыдущее нажатие клавиш
 
  val2=0; 
  val=0;
 
//###################################################
 
//установка положений сервов для камеры
   if (lastPan!=pan)
      { panServo.write(pan);      // указываем куда позиционировать серву 1
        lastPan=pan; }
       
   if (lastTilt!=tilt)
      { tiltServo.write(tilt);  // указываем куда позиционировать серву 2
        lastTilt=tilt; }
        
   if (lastServo3!=servo3)
      { Servo3.write(servo3);  // указываем куда позиционировать серву 3
        lastServo3=servo3; }
        
   if (lastServo4!=servo4)
      { Servo4.write(servo4);  // указываем куда позиционировать серву 4
        lastServo4=servo4; }
        
   if (lastServo5!=servo5)
      { Servo5.write(servo5);  // указываем куда позиционировать серву 5
        lastServo5=servo5; }
        
   if (lastServo6!=servo6)
      { Servo6.write(servo6);  // указываем куда позиционировать серву 6
        lastServo6=servo6; }
}
 }
 
//функция управлением моторов
void mDrive(byte Direction, byte Speed){
switch (Direction) {
 case 0://стоп
      digitalWrite(E1, LOW);
      digitalWrite(E2, LOW); 
      break;
 case 1://выполняется, когда нажимаем вперед
      digitalWrite(M1,LOW);   
      digitalWrite(M2,LOW);       
      digitalWrite(E1, HIGH);
      digitalWrite(E2, HIGH);
      break;
      
 case 2://выполняется, когда нажимаем влево
      digitalWrite(M1,HIGH);   
      digitalWrite(M2,LOW);       
      digitalWrite(E1, HIGH);
      digitalWrite(E2, HIGH);
      break;
 case 3://выполняется, когда нажимаем вправо
      digitalWrite(M1,LOW);   
      digitalWrite(M2,HIGH);       
      digitalWrite(E1, HIGH);
      digitalWrite(E2, HIGH);
      break;
 case 4:  //выполняется, когда нажимаем назад
      digitalWrite(M1,HIGH);   
      digitalWrite(M2,HIGH);       
      digitalWrite(E1, HIGH);
      digitalWrite(E2, HIGH);
      break;
}}
 
 
 
 
//функция считывания температуры с датчика DS18B20 и вывода ее в программу
void temp() {
  delay(500);
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
 
  if ( !ds.search(addr)) {
 
    ds.reset_search();
    delay(250);
    return;
  }
 
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end
 
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
 
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad
 
 
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
 
  }
 
 
  // convert the data to actual temperature
 
  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } 
  else 
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }
 
  celsius = (float)raw / 16.0;
  Serial.println(" ");
  Serial.print("Temp = ");
  Serial.print(celsius);
  Serial.print(" C ");
  Serial.println("Rasstoyanie: ");
  Serial.print(dist_cm);
  Serial.print(" cm");
  delay (10);
 
}
 
Клапауций 998
Offline
Зарегистрирован: 12.08.2015

Maxymilian пишет:

2 года назад я написал большой и нормально работающий скетч для робота. Проблема в том что при нажатии клавишы "X" в спец. проге мне должно показывать температуру и дистанцию к обєкту. А оно не показывает (даже Temp).

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

Maxymilian
Offline
Зарегистрирован: 20.08.2015

Чувак. Че так агресивно.

https://www.youtube.com/watch?v=4bTryhiGZp0

вот видео с моим роботом. Я 2 года назад сделал робота поучаствовал и выиграл в конкурсе. Потом что то изменил перестало показыывать температуру. Тепер я практически все забыл. 

Maxymilian
Offline
Зарегистрирован: 20.08.2015

Я уже все перепробовал в скетче. ничего не вышло

Клапауций 998
Offline
Зарегистрирован: 12.08.2015

Maxymilian пишет:

Я уже все перепробовал в скетче. ничего не вышло

ок - тащи сюда скетч и рассказывай, что пробовал и что у тебя не вышло.

Maxymilian
Offline
Зарегистрирован: 20.08.2015
#include <Servo.h>
#include <OneWire.h>
#include "Ultrasonic.h"
Ultrasonic ultrasonic(A0, A1);//пины для ультразвукового дальномера
int dist_cm=100;//начальное значение расстояния
OneWire  ds(2);  // линия 1-Wire будет на pin 2, тоесть датчик температуры подключен к пину 2
//начальные позиции для каждой сервы задаём индивидуально от 5 до 250, что примерно от 0 до 180градусов
byte pan=90;
byte tilt=90;
byte servo3=90;
byte servo4=90;
byte servo5=90;
byte servo6=90;
//переменные для хранения предыдущих значений позиций сервов
byte lastPan, lastTilt, lastServo3, lastServo4, lastServo5, lastServo6;
//объявления имен сервов
Servo panServo, tiltServo, Servo3, Servo4, Servo5, Servo6;
//пины для запуска моторшилда
int E1 = 5;  
int M1 = 4; 
int E2 = 6;                      
int M2 = 7;                        
int val = 0; //переменная для хранения данных сериал
int led = 13; //светодиод на 13м пине
int mState = 0; //глобальная переменная для хранения состояния направления
//задание прерыва между вкл выкл фар
long interval = 4000;  
long previousMillis = 0;//предыдущее значение временной переменной
//фарЫ)))
byte LedPin=A2; //пин аналогового входа А2
byte LedState=0; //по умолчанию фары выключены
//направления с именами для удобства управления функцией, меняем местами цифры и можно менять управление
int STOP = 0;
int VPERED=1;
int VLEVO=3;
int VPRAVO=2;
int NAZAD=4;
int tempSpeed=0;
int val2;  //переменная для хранения предыдущих данных сериал
int pause = 33; //глобальная переменная - подбирается для скорости, отзывчивости робота и задержек считывания кнопок
void setup() 
{ 
  Serial.begin(9600); //запускаем передачу данных Serial

//назначаем порты моторов на вывод
    pinMode(M1, OUTPUT);   
    pinMode(M2, OUTPUT); 
    pinMode(LedPin, OUTPUT); 
//назначаем порты для серв, ВАЖНО что с 4 по 7й пины - ЗАНЯТЫ!!!
  panServo.attach(13);	//Серва 1
 tiltServo.attach(12);	//Серва 2
    Servo3.attach(11);	//Серва 3
    Servo4.attach(10);	//Серва 4
    Servo5.attach(9);	//Серва 5
    Servo6.attach(8);	//Серва 6
} 
 
void loop()
{ 
  // 
  
//обработка данных поступающих с компьютера
  if (val2==val) val=0; //если предыдущее значение равно текущей, задаём текущей значение нуль(для остановки после того как отпустил клавишу)
  while (Serial.available()>0) { //ожидаем передачу данных
  val = Serial.read();} //получаем данные в переменную
  if(val2!=val) val2=val; //если новые данные отличаются от старых, старые = новым
  if (-1 != val) 
 { 
  
//запуск действий в зависимости от нажатой клавиши
 if ('W' == val2)mDrive(VPERED,255);  //едем вперед при нажатии W
 else if ('S' == val2) mDrive(NAZAD,255); //едем Назад при нажатии S
 else if ('A' == val2) mDrive(VLEVO,255); //едем влево при нажатии A
 else if ('D' == val2) mDrive(VPRAVO,255); //едем вправо при нажатии D
 else if ('X' == val2) //показываем температуру, включаем фары
 { 
  dist_cm = ultrasonic.Ranging(CM);//считываем показания расстояния
 
   if (val2!=0){
  temp();//отображаем температуру и расстояние текущие
  val2=0;
 }
   
 }
 
 //дальше управляем сервами каждая серва имеет управление из 2х клавишь, одна увеличивает угол, вторая уменьшает
 //первая серва
 else if ('Q' == val2) 
 { 
   if (val2!=0){
   if(pan>=1 and pan<=254) pan=pan-1;
   //Serial.println(pan);
 val2=0;
 }
 }
 else if ('E' == val2) 
 { 
   if (val2!=0){
   if(pan>=0 and pan<254) pan=pan+1;
   //Serial.println(pan);
   val2=0;}
 }
 //##########################################
 //вторая серва
 else if ('Z' == val2) 
 { 
    if (val2!=0){
   if(tilt>=1 and tilt<=254) tilt=tilt-1;
 // Serial.println(tilt);
 val2=0;
 }
 }
 else if ('C' == val2) 
 { 
   if (val2!=0){
   if(tilt>=0 and tilt<254) tilt=tilt+1;
 //  Serial.println(tilt);
   val2=0;}
 }
 //##########################################
 //третья серва
 else if ('R' == val2) 
 { 
    if (val2!=0){
   if(servo3>=1 and servo3<=254) servo3=servo3-1;
  // Serial.println(servo3);
 val2=0;
 }
 }
 else if ('T' == val2) 
 { 
   if (val2!=0){
   if(servo3>=0 and servo3<254) servo3=servo3+1;
  // Serial.println(servo3);
   val2=0;}
 }
 //##########################################
 //четвертая серва
 else if ('Y' == val2) 
 { 
    if (val2!=0){
   if(servo4>=1 and servo4<=254) servo4=servo4-1;
   //Serial.println(servo4);
 val2=0;
 }
 }
 else if ('U' == val2) 
 { 
   if (val2!=0){
   if(servo4>=0 and servo4<254) servo4=servo4+1;
   //Serial.println(servo4);
   val2=0;}
 }
 //##########################################
 //пятая серва
 else if ('I' == val2) 
 { 
    if (val2!=0){
   if(servo5>=1 and servo5<=254) servo5=servo5-1;
   //Serial.println(servo5);
 val2=0;
 }
 }
 else if ('O' == val2) 
 { 
   if (val2!=0){
   if(servo5>=0 and servo5<254) servo5=servo5+1;
   //Serial.println(servo5);
   val2=0;}
 }
 //##########################################
 //шестая серва
 else if ('P' == val2) 
 { 
    if (val2!=0){
   if(servo6>=1 and servo6<=254) servo6=servo6-1;
   //Serial.println(servo6);
   val2=0;}
 }

 else if ('L' == val2) 
 { 
   if (val2!=0){
   if(servo6>=0 and servo6<254) servo6=servo6+1;
  // Serial.println(servo6);
   val2=0;}
 }
 //##########################################
 
 //Останавливаем моторы после того как отпустили клавишу управления
 else if (0 == val2)
 {  
   mDrive(STOP,0);
 } 

  delay(pause);//для плавности
  
//###################################################
//обнуляем глобальные переменные, которые сохраняют текущее и предыдущее нажатие клавиш

  val2=0; 
  val=0;

//###################################################

//установка положений сервов для камеры
   if (lastPan!=pan)
      { panServo.write(pan);      // указываем куда позиционировать серву 1
        lastPan=pan; }		
        	
   if (lastTilt!=tilt)
      { tiltServo.write(tilt);	  // указываем куда позиционировать серву 2
        lastTilt=tilt; }
        
   if (lastServo3!=servo3)
      { Servo3.write(servo3);	  // указываем куда позиционировать серву 3
        lastServo3=servo3; }
        
   if (lastServo4!=servo4)
      { Servo4.write(servo4);	  // указываем куда позиционировать серву 4
        lastServo4=servo4; }
        
   if (lastServo5!=servo5)
      { Servo5.write(servo5);	  // указываем куда позиционировать серву 5
        lastServo5=servo5; }
        
   if (lastServo6!=servo6)
      { Servo6.write(servo6);	  // указываем куда позиционировать серву 6
        lastServo6=servo6; }
}
 }

//функция управлением моторов
void mDrive(byte Direction, byte Speed){
switch (Direction) {
 case 0://стоп
      digitalWrite(E1, LOW);
      digitalWrite(E2, LOW); 
      break;
 case 1://выполняется, когда нажимаем вперед
      digitalWrite(M1,LOW);   
      digitalWrite(M2,LOW);       
      digitalWrite(E1, HIGH);
      digitalWrite(E2, HIGH);
      break;
      
 case 2://выполняется, когда нажимаем влево
      digitalWrite(M1,HIGH);   
      digitalWrite(M2,LOW);       
      digitalWrite(E1, HIGH);
      digitalWrite(E2, HIGH);
      break;
 case 3://выполняется, когда нажимаем вправо
      digitalWrite(M1,LOW);   
      digitalWrite(M2,HIGH);       
      digitalWrite(E1, HIGH);
      digitalWrite(E2, HIGH);
      break;
 case 4:  //выполняется, когда нажимаем назад
      digitalWrite(M1,HIGH);   
      digitalWrite(M2,HIGH);       
      digitalWrite(E1, HIGH);
      digitalWrite(E2, HIGH);
      break;
}}




//функция считывания температуры с датчика DS18B20 и вывода ее в программу
void temp() {
  delay(500);
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  if ( !ds.search(addr)) {

    ds.reset_search();
    delay(250);
    return;
  }


  ds.reset();
  ds.select(addr);
  ds.write(0x44,1);         // start conversion, with parasite power on at the end

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad


  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();

  }


  // convert the data to actual temperature

  unsigned int raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // count remain gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } 
  else 
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw << 3;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
    // default is 12 bit resolution, 750 ms conversion time
  }

  celsius = (float)raw / 16.0;
  Serial.println(" ");
  Serial.print("Temp = ");
  Serial.print(celsius);
  Serial.print(" C ");
  Serial.println("Rasstoyanie: ");
  Serial.print(dist_cm);
  Serial.print(" cm");
  delay (10);

}

 

Maxymilian
Offline
Зарегистрирован: 20.08.2015

Я думаю вся проблема сдесь

 if ('W' == val2)mDrive(VPERED,255);  //едем вперед при нажатии W
072  else if ('S' == val2) mDrive(NAZAD,255); //едем Назад при нажатии S
073  else if ('A' == val2) mDrive(VLEVO,255); //едем влево при нажатии A
074  else if ('D' == val2) mDrive(VPRAVO,255); //едем вправо при нажатии D
075  else if ('X' == val2) //показываем температуру, включаем фары
076  {
077   dist_cm = ultrasonic.Ranging(CM);//считываем показания расстояния
078  
079    if (val2!=0){
080   temp();//отображаем температуру и расстояние текущие
081   val2=0;
082  }

код весь расписан мной...для курсача

Maxymilian
Offline
Зарегистрирован: 20.08.2015

если проблема была бы в датчиках то в проге не показывало б температуру. а в програме даже записаных сдесь (Temp и Rasstoyanie) нет

celsius = (float)raw / 16.0;
326   Serial.println(" ");
327   Serial.print("Temp = ");
328   Serial.print(celsius);
329   Serial.print(" C ");
330   Serial.println("Rasstoyanie: ");
331   Serial.print(dist_cm);
332   Serial.print(" cm");
333   delay (10);

 

Клапауций 998
Offline
Зарегистрирован: 12.08.2015

дык, а в чём проблема? - напиши маленький тестовый скетч, который у тебя будет только мерять расстояние и температуру, затем натянешь сову на глобус работающую часть скетча напишешь вокруг исправленного.