Датчик расстояния и температурный датчик
- Войдите на сайт для отправки комментариев
Пт, 21/08/2015 - 10:02
Здравствуйте. Очень нужна ваша помощь с АРДУИНО скетчем. 2 года назад я написал большой и нормально работающий скетч для робота. Проблема в том что при нажатии клавишы "X" в спец. проге мне должно показывать температуру и дистанцию к обєкту. А оно не показывает (даже Temp).Посмотрите пожалуйста мой скетч и испарвте ошыбку. Он очень понятен и там все расписано (что и куда)
ну? и, как это понимать - два года тому всё работало, а сейчас тебя разбил старческий маразм и ты не можешь, даже, придумать правдоподобную историю с прокисшим скетчем, который два года тому работал, а сейчас нет.
Чувак. Че так агресивно.
https://www.youtube.com/watch?v=4bTryhiGZp0
вот видео с моим роботом. Я 2 года назад сделал робота поучаствовал и выиграл в конкурсе. Потом что то изменил перестало показыывать температуру. Тепер я практически все забыл.
Я уже все перепробовал в скетче. ничего не вышло
Я уже все перепробовал в скетче. ничего не вышло
ок - тащи сюда скетч и рассказывай, что пробовал и что у тебя не вышло.
#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); }Я думаю вся проблема сдесь
if('W'== val2)mDrive(VPERED,255);//едем вперед при нажатии W072elseif('S'== val2) mDrive(NAZAD,255);//едем Назад при нажатии S073elseif('A'== val2) mDrive(VLEVO,255);//едем влево при нажатии A074elseif('D'== val2) mDrive(VPRAVO,255);//едем вправо при нажатии D075elseif('X'== val2)//показываем температуру, включаем фары076{077dist_cm = ultrasonic.Ranging(CM);//считываем показания расстояния078079if(val2!=0){080temp();//отображаем температуру и расстояние текущие081val2=0;082}код весь расписан мной...для курсача
если проблема была бы в датчиках то в проге не показывало б температуру. а в програме даже записаных сдесь (Temp и Rasstoyanie) нет
celsius = (float)raw / 16.0;326Serial.println(" ");327Serial.print("Temp = ");328Serial.print(celsius);329Serial.print(" C ");330Serial.println("Rasstoyanie: ");331Serial.print(dist_cm);332Serial.print(" cm");333delay (10);дык, а в чём проблема? - напиши маленький тестовый скетч, который у тебя будет только мерять расстояние и температуру, затем
натянешь сову на глобусработающую часть скетча напишешь вокруг исправленного.