Go Down

Topic: Lautstärke steuern per Ultraschall (Read 4 times) previous topic - next topic

sschultewolter

Meinst du dieses Problem?
  //Bearbeitung....
// if ... sensor 1 zuerst und dann sensor 2, dann next = true
// if ... sensor 2 zuerst und dann sensor 1, dann last = true

Das kannst machen in dem du den Status abfragst innerhalb einer Interval.

Wenn Sensor1 oder Sensor2 einen Wert erfasst, setzt du die verangene Zeit der Interval auf 0 und speicherst den Wert des entsprechenden Sensors als true. Kommt nun innerhalb der Interval auch ein Signal des anderen Sensors, wertest du aus, ob es eine Wischgeste von Rechts nach Links oder Links nach Rechts war.

Aber eine andere Sache, was macht dieser Code, bzw. was willst du damit machen? Du schaltest das Relais 20mal ein/aus innerhalb einer Sekunde. Das bekommt dem Relais auf Dauer nicht.

Code: [Select]
digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   next = false;
   }if (last == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
Keinen technischen Support über PN!

MaxNarr

Zum Thema Relais...:
Die Relais schalten den Kontakt eines 4 poligen klinken Kabels. Verbunden wird dadurch gnd mit aux (von Klinke) . Auf dem Handy hab ich dazu eine APP die pro anaus eine Funktion (play,pause,last,next)hat.

MaxNarr

Hab ich das jetzt so richtig gemacht?

Code: [Select]


//* +V connection of the Sensor attached to +5V
//* GND connection of the Sensor attached to ground
//* SIG connection of the Sensor attached to digital pin 7
        //* SIG connection of the Sensor2 attached to digital pin 8
        //* Relais SIG on digital pin 9
        //* Poti SIG on digital pin 10
        
#include <Wire.h> // DigitalPoti       
int ug = 5; // UNTERGRENZE in cm
int og = 30; // OBERGRENZE in cm

const int potiPin = 10;
const int pingPin = 7;
const int pingPin2= 8;
const int relais = 9;
int protzentsensor = 0;
int schrittepoti = 0;
boolean pause = false;
boolean next = false;
boolean last = false;
boolean play = false;
boolean isplaying = true;
boolean sensor1hand = false;
boolean sensor2hand = false;
int maxhoehe;
int maxhoehe2;
void setup() {
pinMode(relais,OUTPUT);
Wire.begin(); //DigitalPoti
 
 //Kalibrierung am Start zur Ermittlung der Maximalen höhe
 //(falls man direkt unter der Decke ist oder so, schließlich sind viele Decken keine 4m hoch ;D )
  
  long duration3, cm3;
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  pinMode(pingPin, INPUT);
  duration3 = pulseIn(pingPin, HIGH);
  cm3 = microsecondsToCentimeters(duration3);
  
  long duration4, cm4;
  pinMode(pingPin2, OUTPUT);
  digitalWrite(pingPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin2, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin2, LOW);
  pinMode(pingPin2, INPUT);
  duration4 = pulseIn(pingPin2, HIGH);
  cm4 = microsecondsToCentimeters(duration4);
  
  maxhoehe = cm3-10;
  maxhoehe2 = cm4-10;
  
}
byte val = 50; //DigitalPoti
void loop()
{
  // DigitalPoti
  Wire.beginTransmission(44); // transmit to device #44 (0x2c)---> Datasheet
  Wire.write(byte(0x00));           
  Wire.write(val);             
  Wire.endTransmission();   

  //SonarSensor1
  long duration, cm;
  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);
  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);
  cm = microsecondsToCentimeters(duration);
  
  //SonarSensor2
  long duration2, cm2;
  pinMode(pingPin2, OUTPUT);
  digitalWrite(pingPin2, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin2, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin2, LOW);
  pinMode(pingPin2, INPUT);
  duration2 = pulseIn(pingPin2, HIGH);
  cm2 = microsecondsToCentimeters(duration2);
 
 
  // Reaktion auf Entfernung: Lautstärkeregulierung
   if ( cm||cm2 > ug && cm||cm2 < og ){
     int protzentsensor1 = 100/(og-ug)*(cm-ug);
     int protzentsensor2 = 100/(og-ug)*(cm2-ug);
         protzentsensor  = protzentsensor1/protzentsensor2*2 ;// Durschnitt der beiden Sensoren
     }
   
     schrittepoti = 2,56*protzentsensor;
     val = schrittepoti;
     
  // Pause / Play Steuerung
  if (cm||cm2 < ug && isplaying == true){
    pause = true;
   }
  if (cm||cm2 > ug && isplaying == false){
    play = true;
   }
   
// Relais Befehle zur Klinkenschaltung
 if (pause == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   pause = false;
   isplaying = false;
   }
    if (play == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   play = false;
   isplaying = true;
   }
   if (next == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   next = false;
   }if (last == true ) {
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   digitalWrite(relais, HIGH);
   delay(50);
   digitalWrite(relais, LOW);
   delay(50);
   last = false;
   }
 
 // Vorwärts/Rückwärts -Steuerung und Erkennung der Wischrichtung
if (cm && cm2 > og){
  if (cm < maxhoehe)
  sensor1hand = true;
  delay(10);
  sensor1hand = false;
  
  }
  if (cm2 < maxhoehe2){
   sensor2hand = true;
   delay(10);
   sensor2hand = false;
  }
  // Bewegung von links nach rechts
 if (sensor1hand == true){
    delay(10);
   if (sensor2hand == true && sensor1hand == false ){
     delay(10);
     if(sensor1hand == false && sensor2hand == false){
     next = true;
     }
     
  }  
  // Bewegung von rechts nach links
  if (sensor2hand == true){
    delay(10);
   if (sensor2hand == false && sensor1hand == true ){
     delay(10);
     if(sensor1hand == false && sensor2hand == false){
     last = true;
     }
  }  
 }
 }
 }








long microsecondsToCentimeters(long microseconds)
{

  return microseconds / 29 / 2;
  
 
}



MaxNarr


Serenifly

#19
Jan 01, 2014, 04:06 pm Last Edit: Jan 02, 2014, 03:43 am by Serenifly Reason: 1
Du musst bei ICs generall erst mal ins Datenblatt schauen.

AD5263 Datenblatt:
http://www.analog.com/static/imported-files/data_sheets/AD5263.pdf

Ansteuerung erfolgt über I2C oder SPI. SPI will da aber 10 Bit und Arduino macht nur 8 Bit. Also bleibt I2C. Das geht mit den üblichen 8 Bit Adressen + 8 Bit Daten.

RTC Libs sind da ein guter Anhaltspunkt. Sind aber immer nur ein paar Zeilen für Senden und Lesen. Um die ganzen Timing Diagramme und Start/Stop Conditions brauchst die du dich da NIE zu kümmern. Die schickst immer nur Adressen und/oder Daten und die Lib setzt das für dich um.

Das Datenformat ist auf Seite 16 erklärt. Da muss man sich dann erst mal entsprechend die Bytes zusammenbasteln. Man schickt drei Bytes: Address + Instruction + Data

Address wird an den Pins außen eingestellt. Kann bei einem Device immer 0 sein. Dann muss man da ein Bit für Read/Write setzen
Instruction enthält ein paar Status Bits. Hier wird auch eingestellt welches der 4 Potis man beschreibt
Das Data Byte enthält dann den Widerstandswert von 0-255

Sieht nicht so extrem kompliziert aus.


Ich würde dir da aber empfehlen was in DIP zu nehmen. Nicht SMD wie das hier. Die Dinger gibt es in DIP8. Oder willst du das weil es 15V macht? Die meisten können nämlich nur 5V.

EDIT:
Hier ist Code für Senden:
Code: [Select]

void write(byte addr, byte instruction, byte data)
{
     Wire.beginTransmission(addr)
     Wire.write(instruction);
     Wire.write(data);
     Wire.endTransmission();
}


Das kannst du dann so machen, dass du da z.B. die Nummer des Potis übergibst (jedes IC hat 4) und dann intern das Instruction Byte daraus erzeugst. Man kann auch das Adress-Byte intern festlegen und braucht es nicht als Parameter.

Go Up