Hallo ich habe einen Projekt wobei I2C Drucksenosren ausgelsen werden und das immer wieder in einem Loop (delay 15).
In dem Loop werden zwei Werte abgeglichen. Mit einem Potentiometer kann man den sogenannten Soll-Druck einstellen (0-1Bar) und ein Sensor misst den Ist-Druck in Bar.
In einem Sketch steht im Loop nun folgendes:
if (istbar < (sollbar + 0.01)) myservo.write(var++);
if (istbar > (sollbar - 0.01)) myservo.write(var--);
Dabei gleicht er die Werte mit einer Toleranz von +-0.01 Bar ab und stellt dann wenn der Druck zu hoch ist den Servo ein bisschen zu und wenn der Druck zu niedrig ist wird der Servo in die andere Richtung gedreht. Am Servo hängt ein kleiner Kugelhahn der den Durchfluss regelt.
Nun zu meinem Probelm:
Dadurch dass ich den Drucksensor möglichst schnell aktualisiert haben möchte habe ich ein Delay von 15ms gewählt. Aber durch diesen kleinen Delay reagiert der Servo (also die Druckregelung) zu sensibel
und übersteuert und untersteuert immer den Zielbereich. Ich hätte gerne einen separaten Delay für den oben genannten Codeschnipsel. Nur weiß ich leider nicht wie ich dass hinbekomme ohne auch die Sensorrate zu verringern.
Ich füge mal den gesamten Code bei und hoffe dass ich nicht gesteinigt werden.
Ich hoffe man kann mir helfen
Danke
#include <Servo.h>
#include <Adafruit_BMP085.h>
#include <SPI.h>
#include <Wire.h>
#include "U8glib.h"
#include <SparkFun_MS5803_I2C.h>
const int buttonPin = 2; // the number of the pushbutton pin
int buttonState = 0;
const int secbuttonPin = 3; // the number of the pushbutton pin
int secbuttonState = 0;
float pressure_abs;
float pressure_earth = 0.0;
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NO_ACK);
MS5803 sensor(ADDRESS_HIGH);
Servo myservo; // create servo object to control a servo
Adafruit_BMP085 bmp;
int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
int var = 50; //variable zur servo steurung
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
pinMode(buttonPin, INPUT);
pinMode(secbuttonPin, INPUT);
sensor.reset();
sensor.begin();
if (!bmp.begin()) {
Serial.println("Could not find a valid BMP085 sensor, check wiring!");
while (1) {}
}
}
void loop()
{
pressure_earth = ((bmp.readPressure()/100) * 0.9936);
pressure_abs = (sensor.getPressure(ADC_4096) - pressure_earth);
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
float PercentageAct = map(val, 0, 1023, 0, 1000);
float sollbar = (PercentageAct / 1000); //Convert Pot_Motor to % and Round for Display
float mbar = (pressure_abs / 1000);
float istbar = (mbar);
delay(15); // waits for the servo to get there
Serial.print("Soll:");
Serial.print(sollbar, 3);
Serial.println(" bar");
Serial.print("Ist:");
Serial.print(istbar, 3);
Serial.println(" bar");
u8g.firstPage();
do
{
u8g.setFont(u8g_font_fub14);
u8g.setFontRefHeightExtendedText();
u8g.setDefaultForegroundColor();
u8g.setFontPosTop();
u8g.drawStr(3, 0, "Soll");
u8g.setFont(u8g_font_fub14);
u8g.setPrintPos(53, 0);
u8g.print(sollbar);
u8g.setFont(u8g_font_fub14);
u8g.setPrintPos(98, 0);
u8g.print("Bar");
u8g.drawStr(3, 30, "Ist");
u8g.setPrintPos(53, 30);
u8g.print(istbar);
u8g.setFont(u8g_font_fub14);
u8g.setPrintPos(98, 30);
u8g.print("Bar");
u8g.setFont(u8g_font_7x14);
u8g.drawStr(3, 64, "Modus:");
buttonState = digitalRead(buttonPin);
secbuttonState = digitalRead(secbuttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
if (var > 105) var=105;
if (var < 1) var =1;
//activate Auto modus:
if (istbar < (sollbar + 0.01)) myservo.write(var++);
if (istbar > (sollbar - 0.01)) myservo.write(var--);
u8g.setPrintPos(50, 64);
u8g.print("Auto");
}
if (secbuttonState == HIGH){
myservo.write(105);
u8g.setPrintPos(50, 64);
u8g.print("An");
}
if (secbuttonState == LOW) {
if (buttonState == LOW){
// close valve:
myservo.write(1);
u8g.setPrintPos(50, 64);
u8g.print("Aus");
}
}
}
while (u8g.nextPage());
}