Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*ArduiBox firmware
- * Rev 1.0 Alpha
- * Still buggy
- * Setup loop : line 20 to 38
- * Main loop : line 46 to 129
- * Sub routines : line 132 to 264
- */
- // 1 - includes for functions
- #include "ClickButton.h"
- #include <U8g2lib.h>
- #include <U8x8lib.h>
- U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA);
- #include "system_vars.h"
- #include <Wire.h>
- #include <ADXL335.h>
- // 2 - Display driver selection
- // 3 - Multiclick init
- ClickButton fireSwitch(FIRE_SW_PIN, LOW, CLICKBTN_PULLUP);
- // 4 - Begin setup
- void setup()
- {
- fireSwitch.debounceTime = 15; // debounce interval
- fireSwitch.multiclickTime = 250; // multiclick interval
- fireSwitch.longClickTime = 10000; // 10 sec fire cut-off
- pinMode(FIRE_SW_PIN, INPUT_PULLUP); // setting Fire Pin as Input
- pinMode(BATTERY_READ_PIN, INPUT); // setting Battery Voltage reading as Input
- pinMode(PWM_OUT_PIN, OUTPUT); // setting the PWM pin to Output
- u8g2.begin();
- u8g2.setFontMode(0);
- u8g2.setFont(u8g2_font_lucasarts_scumm_subtitle_o_tf);
- u8g2.setFontPosTop(); // Fonts origin
- analogReference(DEFAULT); // For voltage ref
- ADXL335 accelerometer;
- // Mettre le ADXL345 à plage +/-4G en écrivant la valeur 0x01 dans le
- // registre DATA_FORMAT.
- AccellerometreConfigure (DATA_FORMAT, Accellerometre_1_Precision4G);
- // Mettre le ADXL345 en mode de mesure en écrivant 0x08 dans le registre
- // POWER_CTL.
- AccellerometreConfigure (POWER_CTL, Accellerometre_1_ModeMesure);
- u8g2.firstPage();
- u8g2.setFont(u8g2_font_lucasarts_scumm_subtitle_o_tf);
- do {
- u8g2.drawStr( 22, 0, "NicoVape");
- u8g2.drawStr( 7, 18, "Minikin BHM");
- } while ( u8g2.nextPage() );
- delay(4500);
- };
- //////////////////////
- // Start of program //
- //////////////////////
- void loop()
- {
- u8g2.firstPage();
- AccellerometreLecture ();
- // reading input states and transfer to vars
- fireState = digitalRead(FIRE_SW_PIN);
- fireState = !fireState;
- if ( fireState == LOW ){
- analogWrite(PWM_OUT_PIN, 0);
- };
- if ( fireState == HIGH ){
- u8g2.setPowerSave(0);
- }
- // Processing fire clicks
- fireSwitch.Update();
- if (fireSwitch.clicks != 0){
- fireClicks = fireSwitch.clicks;
- //Serial.print(fireClicks);
- };
- avgVolts = ((battVolt * pwmRatio) / 100);
- // AfficheMenu.select(fireSwitch.clicks, battVolt, pwmRatio, avgVolts, PWM_OUT_PIN, logo);
- // sleeping display for stealth
- if ((fireClicks == 3) && (lock == 0)){
- if (menuMode == 0){
- menuMode = 1;
- fireClicks = 0;
- //Serial.println("menuMode 1");
- } else {
- menuMode = 0;
- fireClicks = 0;
- currentTimeDisp = millis();
- //Serial.println("menuMode 0");
- }
- }
- if (fireClicks == 5){
- if ((lock == 0) && (longHold !=1)){
- lock = 1;
- fireClicks = 0;
- //Serial.println("lock 1");
- } else {
- lock = 0;
- fireClicks = 0;
- longHold = 0;
- //Serial.println("lock 0");
- }
- }
- if (fireClicks == -1){
- if (longHold == 0){
- longHold = 1;
- fireClicks = 0;
- //Serial.println("longHold 1");
- }
- }
- if (menuMode == 1) {
- int Posi = Accelerometre1_AxeY;
- if ((Posi < -65) && (Posi < -30)){
- currentTimePwm = millis();
- if (currentTimePwm - previousTimePwm >= PwmTime2) {
- previousTimePwm = currentTimePwm;
- //Serial.println("Down x2");
- pwmChange( 2.55 );
- };
- } else if ((Posi < -35) && (Posi < -10)){
- currentTimePwm = millis();
- if (currentTimePwm - previousTimePwm >= PwmTime2) {
- previousTimePwm = currentTimePwm;
- //Serial.println("Down");
- pwmChange( 2.55 );
- };
- } else if (Posi > 65){
- currentTimePwm = millis();
- if (currentTimePwm - previousTimePwm >= PwmTime2) {
- previousTimePwm = currentTimePwm;
- //Serial.println("Up x2");
- pwmChange( -2.55 );
- };
- } else if (Posi > 35){
- currentTimePwm = millis();
- if (currentTimePwm - previousTimePwm >= PwmTime) {
- previousTimePwm = currentTimePwm;
- //Serial.println("Up");
- pwmChange( -2.55 );
- };
- };
- }
- fire_event();
- // processing Battery voltage reading and calcs
- battValue = analogRead(BATTERY_READ_PIN);
- battVolt = (battValue * batteryVoltAref) / 1024;
- //Serial.println(battVolt);
- pwmRatio = (pwmValue * 100)/255;
- percentRatio = ((pwmRatio * battVolt) / 100);
- currentTime = millis();
- // Low Battery detection
- if (currentTime - previousTime >= stepForLowBatt) {
- previousTime = currentTime;
- if (battVolt <= cuttOff) {
- lowBatt = 1;
- };
- };
- // processing display
- do {
- menuSelect();
- //sleepDisplayFct();
- } while ( u8g2.nextPage() );
- };
- //-----------------------//
- // start of sub routines //
- //-----------------------//
- void menuSelect()
- {
- if (menuMode == 1){
- tune_screen();
- } else if (lock == 1){
- lock_screen();
- } else if (longHold == 1){
- long_screen();
- } else if (lowBatt == 1){
- low_batterie();
- } else {
- main_screen();
- };
- }
- void sleepDisplayFct()
- {
- if (menuMode == 0){
- currentTimeDisp = millis();
- if (currentTimeDisp - previousTimeDisp >= sleepDisplay){
- u8g2.setPowerSave(1);
- previousTimeDisp = currentTimeDisp;
- }
- }
- }
- void fire_event()
- {
- // Fire clearance and output to Mosfet
- if ( fireState == HIGH && menuMode == 0){
- analogWrite(PWM_OUT_PIN, pwmValue);
- } else if ( fireState == HIGH && lowBatt == 1) {
- analogWrite(PWM_OUT_PIN, 0);
- } else if ( fireState == HIGH && lock == 1) {
- analogWrite(PWM_OUT_PIN, 0);
- } else if ( fireState == HIGH && menuMode == 1){
- analogWrite(PWM_OUT_PIN, 0);
- } else if ( fireState == LOW ){
- analogWrite(PWM_OUT_PIN, 0);
- };
- }
- void pwmChange (int internalValue)
- //
- // low and high stops for PWM consigne
- //
- {
- pwmValue += internalValue;
- if (pwmValue > 255){
- pwmValue = 255;
- } else if (pwmValue < 0){
- pwmValue = 0;
- };
- }
- //*****************************************************************************
- // FONCTION AccellerometreConfigure
- //*****************************************************************************
- void AccellerometreConfigure (byte address, byte val)
- {
- // Commencer la transmission à trois axes accéléromètre
- Wire.beginTransmission (Accellerometre3AxesAdresse);
- // Envoyer l'adresse de registre
- Wire.write (address);
- // Envoyer la valeur à écrire.
- Wire.write (val);
- // Fin de la transmission.
- Wire.endTransmission ();
- }
- //*****************************************************************************
- // FONCTION AccellerometreLecture ()
- //*****************************************************************************
- void AccellerometreLecture ()
- {
- uint8_t NombreOctets_a_Lire = 6;
- // Lire les données d'accélération à partir du module ADXL345.
- AccellerometreLectureMemoire (DATAX0, NombreOctets_a_Lire,
- Accellerometre3AxesMemoire);
- // Chaque lecture de l'axe vient dans une résolution de 10 bits, soit 2 octets.
- // Première Octet significatif !
- // Donc nous convertissons les deux octets pour un « int ».
- Accelerometre1_AxeX = (((int)Accellerometre3AxesMemoire[1]) << 8) |
- Accellerometre3AxesMemoire[0];
- Accelerometre1_AxeY = (((int)Accellerometre3AxesMemoire[3]) << 8) |
- Accellerometre3AxesMemoire[2];
- Accelerometre1_AxeZ = (((int)Accellerometre3AxesMemoire[5]) << 8) |
- Accellerometre3AxesMemoire[4];
- }
- //*****************************************************************************
- // FONCTION AccellerometreLectureMemoire
- //*****************************************************************************
- void AccellerometreLectureMemoire (byte address, int num, byte
- Accellerometre3AxesMemoire[])
- {
- // Démarrer la transmission à accéléromètre.
- Wire.beginTransmission (Accellerometre3AxesAdresse);
- // Envoie l'adresse de lire.
- Wire.write (address);
- // Fin de la transmission.
- Wire.endTransmission ();
- // Démarrer la transmission à accéléromètre.
- Wire.beginTransmission (Accellerometre3AxesAdresse);
- // Demande 6 octets à l'accéléromètre.
- Wire.requestFrom (Accellerometre3AxesAdresse, num);
- int i = 0;
- // L'accéléromètre peut envoyer moins que demandé, c'est anormal, mais...
- while (Wire.available())
- {
- // Recevoir un octet.
- Accellerometre3AxesMemoire[i] = Wire.read ();
- i++;
- }
- // Fin de la transmission.
- Wire.endTransmission ();
- }
- void main_screen()
- {
- u8g2.setFont(u8g2_font_lucasarts_scumm_subtitle_o_tf);
- u8g2.drawStr( 1, 1, "Batt :");
- float level = battVolt;
- int levelclc = round(level*100/8.4);
- int levelBx = map(levelclc,0,100,0,70);
- u8g2.drawRFrame(55,3,70,10,3);
- u8g2.drawBox(60,3,levelBx,10);
- u8g2.drawStr( 1, 18, "Power % :");
- u8g2.setCursor( 92, 18 );
- u8g2.print(pwmRatio);
- //u8g2.drawStr( 1, 23, "Avg Volts :");
- //u8g2.setCursor( 90, 23 );
- avgVolts = ((battVolt * pwmRatio) / 100);
- //u8g2.print(avgVolts);
- }
- void tune_screen()
- {
- u8g2.setFont(u8g2_font_profont15_tf);
- //u8g2.drawStr( 1, 1, "Reglage puissance");
- u8g2.drawStr( 25, 1, "Power :");
- u8g2.setCursor( 85, 1 );
- u8g2.print(pwmRatio);
- u8g2.setFont(u8g2_font_profont11_tf);
- u8g2.drawStr( 3, 13, "+ droite / - gauche");
- u8g2.setFont(u8g2_font_profont11_tf);
- u8g2.drawStr( 1, 23, "3 clics pour valider");
- }
- void lock_screen()
- {
- analogWrite(PWM_OUT_PIN, 0);
- u8g2.drawStr( 0, 0, "Lock device !");
- u8g2.drawStr( 0, 18, "Unlock Clic 5 ");
- }
- void long_screen()
- {
- analogWrite(PWM_OUT_PIN, 0);
- u8g2.drawStr( 0, 0, "Long Fire !");
- u8g2.drawStr( 0, 18, "Unlock Clic 5");
- }
- void low_batterie()
- {
- analogWrite(PWM_OUT_PIN, 0);
- u8g2.drawStr( 0, 0, "Low battery !");
- u8g2.drawStr( 0, 18, "Replace it !");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement