Projekt code für Hfecter

Dependencies:   PM2_Libary PM2_Example_PES_board

main.cpp

Committer:
jashaalm
Date:
2021-05-13
Revision:
15:1ebd2ee7b1c8
Parent:
14:cfe1311a63f0
Child:
16:5d4a58eecf55

File content as of revision 15:1ebd2ee7b1c8:

#include "mbed.h"
#include "platform/mbed_thread.h"

/* PM2_Libary */
#include "EncoderCounter.h"
#include "Servo.h"
#include "SpeedController.h"
#include "PositionController.h"
#include "FastPWM.h"
#include "RangeFinder.h"
/*Defines initialisieren*/
#define AUFLOESUNG 0.25412f
#define FUELSENSOR 1
#define BATTERIE 2
#define SENSOR 3
#define MOTOR 4
#define SPERREN 5
#define F_FUELSENSOR 1
#define F_BATTERIE 2

using namespace std::chrono;

InterruptIn user_button(USER_BUTTON);
InterruptIn sensor(PA_1);
/*Initialisierung outputs*/
DigitalOut  led(LED1);
AnalogOut BatteryLED (PA_5);
AnalogOut WeightLED (PA_4);
/*Initialisierung inputs*/
AnalogIn adc_vbat(ADC_VBAT);
AnalogIn analogIn_2(PA_0);
DigitalIn digitalIn(D5);
//AnalogIn analogIn_1(PA_1);


bool  executeMainTask = false;
Timer user_button_timer, loop_timer;


/* declaration of custom button functions */
void button_fall();
void button_rise();
void sensor_fall();
void led_blinken(int fehler);
/* create analog input object */


/*Variabeln initialisieren*/
float    movement = 0.0f;
float    batt = 0.0f;
float    weight = 0.0f;
float    rotation = 0.0f;
int situation = FUELSENSOR;
int Fehler = 0;
int sensor_trig = 0;
int timer_1 = 0;
/*Initialisierung motor ¦ entnommen aus PM2_example_PES_board*/
/* create enable dc motor digital out object */
DigitalOut enable_motors(PB_15);
/* create pwm objects */
//FastPWM pwmOut_M1(PB_13);
FastPWM pwmOut_M2(PA_9);
//FastPWM pwmOut_M3(PA_10);
double  Ts_pwm_s = 0.00005; // this needs to be a double value (no f at the end)
/* create encoder read objects */

EncoderCounter  encoderCounter_M2(PB_6, PB_7);
/* create speed controller objects, only M1 and M2, M3 is used open-loop */
float counts_per_turn = 20.0f*78.125f; // counts/turn * gearratio
float kn = 180.0f/12.0f;               // (RPM/V)
float max_voltage = 12.0f;             // adjust this to 6.0f if only one batterypack is used
//SpeedController speedController_M2(counts_per_turn, kn, max_voltage, pwmOut_M2, encoderCounter_M2);
PositionController positioncontroller_M2(counts_per_turn, kn, max_voltage, pwmOut_M2, encoderCounter_M2);

/* analog output */


/*Hauptprogramm*/
int main()
{

    user_button.fall(&button_fall);
    user_button.rise(&button_rise);
    sensor.fall(&sensor_fall);

    loop_timer.start();

    /* enable hardwaredriver dc motors */
    enable_motors = 1;


    float movementold = 0;
    while (true) {

        batt = adc_vbat.read()* (3.3f/AUFLOESUNG);
        loop_timer.reset();
       weight = analogIn_2.read() * 5;
        /* ------------- start hacking ------------- -------------*/
 
        movement = 0;
        rotation = positioncontroller_M2.getRotation();
        switch (situation) {
            case FUELSENSOR:

                if(weight < 4) {//Ist Der Füllstand Unter 25%?
                    WeightLED = 1;//Anzeige LED
                    situation = BATTERIE;//Weiter zu Batteriestand
                    if (weight < 3.5) {//Ist der Füllstand unter 10%
                        Fehler = F_FUELSENSOR;//Weitergabe Feler
                        situation = SPERREN;//Gerät sperren

                    }
                } else {
                    WeightLED = 0;//LED AUS
                    situation = BATTERIE;//Weiter zu Batteriestand
                }

                break;
            case BATTERIE:          //Der Batteriestand
                if(batt <3.2) {     //Ist der Batteriesand Unter 25%
                    BatteryLED = 1;//Anzeige LED
                    situation = SENSOR;//Weiter zu Sensor
                    if(batt < 3) {//Ist der Batteriestand unter 10%
                        fehler = F_BATTERIE;//Weitergabe Fehler
                        situation = FEHLER;//Gerät sperren
                    }
                } else {
                    BatteryLED = 0;//LED AUS
                    situation = SENSOR;//Weiter zu Sensor
                }
                break;
            case SENSOR:                //Sensor
                if (sensor_trig == 1) {//Wurde der Bewegungsensor Betätigt
                    situation = MOTOR;//Weiter zu Motor
                    sensor_trig = 0;
                } else {
                    situation = FUELSENSOR;//Weiter zu Füllsensor
                }
                break;
            case MOTOR:                 //Motor
                if(timer_1 > 200) {     //Ist genug zeit vergangen das jemand seine Hand wegnemmen konte(hier 2 sek)
                    enable_motors = 1;  //motor ein
                    positioncontroller_M2.setDesiredRotation(1.0f);
                    if (timer_1 ==500) {//Hat der motor lange genug gedreht?
                        positioncontroller_M2.setDesiredRotation(0.0f);
                        enable_motors = 0;//Motor aus
                        timer_1 = 0;
                        situation = FUELSENSOR;//weiter zu Füllsensor
                    } else {
                        timer_1 ++;     //warten
                    }

                } else {
                    timer_1 ++;             //warten
                }
                break;
            /*Gerät Sperren*/
            case SPERREN:
                if (Fehler == F_FUELSENSOR) { //Liegt der Fehler beim Füllsensor?
                    led_blinken(F_FUELSENSOR);//Anzeige LED Blinken
                    if(weight > 4.2) {         //Liegt der Füllstand über 30%
                        WeightLED = 0;         //LED aus
                        situation = BATTERIE;   //Weiter Batteriestand
                    }
                } else {
                    led_blinken(F_BATTERIE);//Anzeige LED Blinken
                    if(batt >3.2) {
                        BatteryLED = 0;     //LED aus
                        situation = SENSOR;//Weiter zu Sensor
                    }
                }
                break;



        }

        led = !led;

        /* do only output via serial what's really necessary (this makes your code slow)*/
        printf("%3.3f\n, %3.3f\n, %3.3f\n, %3d\n,%3d\n ",
               movement,
               weight,
               batt,
               timer_1);

        /* ------------- stop hacking ------------- -------------*/

        // int T_loop_ms = duration_cast<milliseconds>(loop_timer.elapsed_time()).count();
        // int dT_loop_ms = Ts_ms - T_loop_ms;
        //  thread_sleep_for(dT_loop_ms);
        thread_sleep_for(10);

    }
}

void button_fall()
{
    user_button_timer.reset();
    user_button_timer.start();
}

void sensor_fall()
{
    if (situation != MOTOR && situation != SPERREN) {
        sensor_trig = 1;
    }


}
void led_blinken(int fehler)
{
    static int timer = 0;

    if (fehler == F_FUELSENSOR) {
        if (timer == 50) {
            timer = 0;

            WeightLED = !WeightLED;
        }
    } else {
        if (timer == 50) {

            BatteryLED = !BatteryLED;
            timer = 0;
        }
    }
    timer ++;
}
void button_rise()
{
    int t_button_ms = duration_cast<milliseconds>(user_button_timer.elapsed_time()).count();
    user_button_timer.stop();
    if (t_button_ms > 200) {
        executeMainTask = !executeMainTask;
    }
}