Beschleunigungsmesser und Transistor

Hier ist mein Programm, ich möchte:

  1. Der Mikrocontroller Arduino UNO R3 sendet 3,3 V an den Sensor Beschleunigungsmesser MMA7361

  2. Der Sensor schaltet sich ein und sendet ein Signal an den Mikrocontroller.

  3. Wenn ich den Sensor bewege und die Spannung mehr als 2 V beträgt, sendet der Mikrocontroller 1,5 V an den Transistor. Sonst 0V senden.


int outputPin1 = 3;   // Pin D3    
int outputPin2 = 5;  // Pin D5    
int analogPin = 0;  // Input Pin A0

void setup()    
{    
  pinMode (outputPin1, OUTPUT);   
  pinMode (outputPin2, OUTPUT);   
  Serial.begin(9600);   
}

void loop()    
{   
    int volts = 170; // send signals of 3.3v   
    analogWrite(outputPin1, volts);  // to Accelerometer   

    int reading = analogRead(analogPin);  //  receive signal
    delay(1000);    // delay 5sec.

    if (volts >= 100)    // Input voltage is more than 2.0V
    {
    int volts = 77; // send signals of 1.5V
    analogWrite(outputPin2, volts);  // to Transistor
    }
    else
      {
      int volts = 0;
      analogWrite(outputPin2, volts);  // to Transistor
      }
}

Wenn ich mit dem Digital Multi Meter messe, zeigt es weiterhin 1,5 V an, auch wenn sich die Position des Sensors nicht ändert.

Ich vermute, es gibt ein Problem in der if, else-Zeile.

Antworten (1)

Sie verwenden die readingVariable nicht in der if-Anweisung. Ihre if-Anweisung prüft volts, und dies wird nie geändert, es wird immer bei 170 sein (es ändert sich für ein paar Taktzyklen auf 77 und dann zurück auf 170.)

Außerdem sollten Sie Ihre Variablen nicht in der Schleife deklarieren. Und Ihre Verzögerung ist auf eine Sekunde eingestellt, nicht auf 5. Sie sollten danach eine Verzögerung hinzufügen, analogWrite(outputPin1, volts);damit der Beschleunigungsmesser Zeit zum Einschalten hat.

int outputPin1 = 3; // Pin D3
int outputPin2 = 5; // Pin D5
int analogPin = 0; // Input Pin A0
int volts = 170;
int reading = 0;    

void setup()
{
    pinMode (outputPin1, OUTPUT);
    pinMode (outputPin2, OUTPUT);
    Serial.begin(9600);
}

void loop()    
{   
    analogWrite(outputPin1, volts);  // send signals of 3.3v to Accelerometer   
    delay(200);    // delay .2 sec

    reading = analogRead(analogPin);  //  receive signal
    delay(1000);    // delay 1sec.

    if (reading >= 100)    // Input voltage is more than 2.0V
    {
        volts = 77; // send signals of 1.5V
        analogWrite(outputPin2, volts);  // to Transistor
    }
    else
    {
        volts = 0;
        analogWrite(outputPin2, volts);  // to Transistor
    }
}

Hier ist, was der Code jetzt tut (vorausgesetzt, Ihre Spannungsmathematik ist korrekt):

  1. outputPin1Kräfte bis ~ 3,3 V
  2. Lesen erhält den Wert vonanalogPin
  3. 1 Sekunde Pause
  4. wenn reading >= 100Leistungsausgang Pin2 auf ~ 1,5 V, sonst 0 V
  5. wiederholen

Um effizienter zu sein, brauchen Sie die Variable voltsund nicht reading. outputPin1muss nicht in der Schleife sein. Ich habe auch die Verzögerung vor Sie gestellt analogRead(analogPin), damit Ihre if-Anweisung sofort nach dem Lesen ausgeführt wird und beim Einschalten Ihrem Beschleunigungsmesser Zeit zum Einschalten gibt. Ich habe auch das entfernt, Serial.begin(9600);da Sie es nicht verwendet haben. Ihr gesamter Code könnte so aussehen:

int outputPin1 = 3; // Pin D3
int outputPin2 = 5; // Pin D5
int analogPin = 0; // Input Pin A0

void setup()
{
    pinMode (outputPin1, OUTPUT);
    pinMode (outputPin2, OUTPUT);
    analogWrite(outputPin1, 170);  // send signals of 3.3v to Accelerometer
}

void loop()    
{
    delay(1000);    // delay 1sec.

    if (analogRead(analogPin) >= 100)    // Input voltage is more than 2.0V
    {
        analogWrite(outputPin2, 77);  // send signals of 1.5V to Transistor
    }
    else
    {
        analogWrite(outputPin2, 0);  // 0v to Transistor
    }
}

Als zukünftige Referenz sollten Sie die Seriennummer verwenden, Serial.println("helpfull info");um Ihnen beim Debuggen Ihres Codes zu helfen. Schauen Sie sich dieses Beispiel an. Jedes Mal, wenn es eine Messung durchführt, überträgt es die Messung zurück an den Computer, damit Sie sehen können, was vor sich geht.

Bearbeiten

Laden Sie dies hoch und verwenden Sie ein serielles Terminal, um zu sehen, was passiert, wenn Sie den Beschleunigungsmesser bewegen.

int analogPin = 0;
int value = 0;

void setup()
{
  Serial.begin(9600);          //  setup serial
}

void loop()
{
  value = analogRead(analogPin);    // read the input pin
  Serial.println(value);             // debug value
  delay(1000);
}
Ich danke Ihnen für Ihre Hilfe. Ich habe Ihren zweiten Code hochgeladen und getestet. Es sieht so aus, als ob der Beschleunigungsmesser ordnungsgemäß funktioniert und eine andere Spannung sendet, wenn ich die Position ändere, ABER wenn ich die Spannung von Ausgang Pin2, Pin D5 gemessen habe, zeigt er weiterhin 1,5 V an, selbst wenn ich die Richtung des Sensors ändere, der 0 V anzeigen muss. Bedeutet dies, dass der Mikrocontroller das Signal vom Beschleunigungsmesser nicht richtig empfängt oder ein Teil im Code fehlt?
@ redcomet782 es könnte verschiedene Dinge bedeuten. Das erste, was Sie testen sollten, wäre , analogRead(analogPin) >= 100zu analogRead(analogPin) >= 50oder vielleicht niedriger zu wechseln und zu sehen, was passiert. Werfen Sie einen Blick auf meine Bearbeitung, um weitere Hilfe zu erhalten.