Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Development
  3. Ceech Board MOSFET Pin DIGITALWRITE Problem

Ceech Board MOSFET Pin DIGITALWRITE Problem

Scheduled Pinned Locked Moved Development
9 Posts 3 Posters 84 Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • paqorP Offline
    paqorP Offline
    paqor
    wrote on last edited by
    #1

    Hi, I'm working with Ceech-Board for a pool sensor. I'm rewriting the code from V1.5 to 2.x. I encountered a problem with DIGITALWRITE which I can't explain.

    Only if I set PINMODE unequal to the PIN for DIGITALWRITE, this output works.

    void setup() {
      pinMode(5, OUTPUT); // Setzt den Digitalpin 13 als Outputpin
    }
    
    void loop() {
      digitalWrite(4, HIGH); // Setzt den Digitalpin 13 auf HIGH = "Ein"
      delay(1000);            // Wartet eine Sekunde
      digitalWrite(4, LOW);  // Setzt den Digitalpin 13 auf LOW = "Aus"
      delay(1000);            // Wartet eine Sekunde
    }
    

    It worked with pin 3, 5 and 13 e.g.

    On the board the PIN D4 is followed by a MOSFET for switching. This worked once, once again not. No I seem to have found the problem, but what is the cause?

    rvendrameR tbowmoT 2 Replies Last reply
    0
    • paqorP paqor

      Hi, I'm working with Ceech-Board for a pool sensor. I'm rewriting the code from V1.5 to 2.x. I encountered a problem with DIGITALWRITE which I can't explain.

      Only if I set PINMODE unequal to the PIN for DIGITALWRITE, this output works.

      void setup() {
        pinMode(5, OUTPUT); // Setzt den Digitalpin 13 als Outputpin
      }
      
      void loop() {
        digitalWrite(4, HIGH); // Setzt den Digitalpin 13 auf HIGH = "Ein"
        delay(1000);            // Wartet eine Sekunde
        digitalWrite(4, LOW);  // Setzt den Digitalpin 13 auf LOW = "Aus"
        delay(1000);            // Wartet eine Sekunde
      }
      

      It worked with pin 3, 5 and 13 e.g.

      On the board the PIN D4 is followed by a MOSFET for switching. This worked once, once again not. No I seem to have found the problem, but what is the cause?

      rvendrameR Offline
      rvendrameR Offline
      rvendrame
      Hero Member
      wrote on last edited by
      #2

      @paqor I recently converted the sketch to 2.x . Here it goes:

      /**
       * The MySensors Arduino library handles the wireless radio link and protocol
       * between your home built sensors/actuators and HA controller of choice.
       * The sensors forms a self healing radio network with optional repeaters. Each
       * repeater and gateway builds a routing tables in EEPROM which keeps track of the
       * network topology allowing messages to be routed to nodes.
       *
       * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
       * Copyright (C) 2013-2015 Sensnology AB
       * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
       *
       * Documentation: http://www.mysensors.org
       * Support Forum: http://forum.mysensors.org
       *
       * This program is free software; you can redistribute it and/or
       * modify it under the terms of the GNU General Public License
       * version 2 as published by the Free Software Foundation.
       *
       *******************************
       *
       * REVISION HISTORY
       * Version 1.0 - Initial Version by rvendrame
       * 
       ******************************
       * DESCRIPTION
       * Floating Swiming pool sensor based on ceech's arista board 
       *   (see https://www.tindie.com/products/ceech/astri-arista/ ) 
       *   Solar-powered (+Li-ion 18650 battery backup)
       * PH Measurement via A3 pin,  using DFrobot SEN0161 PH sensor 
       *    (see https://www.dfrobot.com/wiki/index.php/PH_meter(SKU:_SEN0161)
       * ORP Measurement via A1 pin,  using Phidgets 1130_0 board + 3556_0 Electrode 
       *    (see http://www.phidgets.com/products.php?product_id=1130)
       *    (see http://www.phidgets.com/products.php?product_id=3556)
       * Temp sensor via D4 pin,  using DS18B20 sensor
       *    (see https://create.arduino.cc/projecthub/TheGadgetBoy/ds18b20-digital-temperature-sensor-and-arduino-9cc806 ) 
       *    
       *    Revisions: 
       *    1.0  ( ??? 2017 ) - Initial version 
       *    1.1  ( Jan 2020 ) - MySensors 2.x port 
       */
      
      // Enable debug prints to serial monitor
      //#define MY_DEBUG
      
      // CEECH BOARD
      #define CEECH 
      
      // Define a static node address, AUTO or 1-255 fixed
      #define MY_NODE_ID AUTO
      #define MY_PARENT_NODE_ID AUTO
      
      // Enable and select radio type attached
      #define MY_RADIO_RF24  // MY_RADIO_RFM69
      
      // MySensors 
      #define SN "myPoolWater"
      #define SV "1.2"
      #ifdef CEECH 
      #define MY_RF24_CE_PIN 7 // Ceech Arista board 
      #define MY_RF24_CS_PIN 8 // Ceech Arista board
      #endif
      
      // Includes -------------------------------------------
      #include <MySensors.h> 
      #include <SPI.h>
      #include <OneWire.h>
      #include <DallasTemperature.h>
      
      // External IO Pins 
      #define PH_PIN           A3  // pH Sensor dfrobot SKU SEN0161
      #define ORP_PIN          A1  // ORP Sensor phidgets ASR2801 (3556_0) + 1103_0 
      #define ONE_WIRE_BUS     5   // One wire bus
      
      // Runtime constants
      #define day 86400000L // 86400000 milliseconds in a day
      #define hour 3600000L // 3600000 milliseconds in an hour
      #define minute 60000L // 60000 milliseconds in a minute
      #define second  1000L // 1000 milliseconds in a second
      
      // Ceech-Arista Internal connections 
      #define  current A6  // Charging current from Solar Panel 
      #define  cell    A2  // Voltage at Solar Panel 
      #define  lipo    A0  // Voltage at Battery 
      #define  CHRG    A7  // Charge indicator ( 0 means 'charging' ) 
      #define  POWER   4   // MOSFET driver on 5V Step up (to power the sensors) 
      #define  R1      47000.0  // resistance of R1
      #define  R2      10000.0  // resistance of R2
      
      // mySensors objects
      MyMessage ph_msg( 2, V_PH ),
                orp_msg( 3, V_ORP ),
                temp_msg( 1, V_TEMP ),
                bat_msg( 199 , V_VOLTAGE ),
                var1_msg( 0 , V_VAR1 ), 
                var2_msg( 0 , V_VAR2 ),
                var3_msg( 0 , V_VAR3 );  
      
      // Setup a oneWire instance to communicate with any OneWire devices 
      // (not just Maxim/Dallas temperature ICs)
      OneWire oneWire(ONE_WIRE_BUS);
       
      // Pass our oneWire reference to Dallas Temperature.
      DallasTemperature dallas(&oneWire);
      
      // Misc 
      #define pHOffset         0.00  // pH deviation compensate
      #define samplingInterval 20    // in miliseconds 
      #define arrayLenth       40    // times of collection
      
      // PH / ORP / Temp  Reading
      static unsigned long samplingTime = millis();
      static float temp, ph, orp, voltage;
      static float aux, dif, old_ph=999, old_orp=999, old_temp=999;
      int   battery, counter = -1, 
            old_bat=999, old_volt=9999; 
      
      
      int readings[arrayLenth];   //Store the average value of the sensor feedback
      int arrayIndex = 0;
      
      // Misc  
      float vout = 0.0;
      float vin = 0.0;
      int value = 0;
      
      //// SETUP
      void setup() {
      
        Serial.begin( MY_BAUD_RATE );
        Serial.println(F("Init..."));
      
        // IO PINS
        pinMode( POWER   , OUTPUT );
        pinMode( PH_PIN  , INPUT );
        pinMode( ORP_PIN , INPUT ); 
      
      }
      
      //// PRESENTATION 
      void presentation() { 
        
        sendSketchInfo(SN, SV);
      
        present( 1, S_TEMP );          // Temperature
        present( 2, S_WATER_QUALITY ); // PH
        present( 3, S_WATER_QUALITY ); // ORP
      
      }
      //// LOOP
      void loop() {
      
        // Force a refresh on each hour...
        if ( ++counter == 5 ) {
          old_ph = old_orp = old_temp = -999;
          old_bat = old_volt = -999;
          counter = 0;
        }
      
        // Internal board/battery status 
        digitalWrite( POWER , true );
        Serial.println("5V Power ON - Wait 5s");
        wait(5000); 
      
        float napetost = readVcc();
      
        Serial.println("*Internal:"); 
        
        value = analogRead(cell);
        vout = (value * napetost) / 1024.0;
        vin = vout / (R2 / (R1 + R2));
        if (vin < 0.09) vin = 0.0;
        
        float tok = ((analogRead(current) * napetost / 1024 ) * 250) / 3.3; // convert the ADC value to miliamps
        float baterija = ( analogRead(lipo) * napetost / 1024 ) * 2; // measuring battery voltage
        int polnjenje = analogRead(CHRG);
      
        Serial.print("Vcc = ");
        Serial.print(napetost);
        Serial.println("V");
        //delay(400);
        Serial.print("Charge current = ");
        Serial.print(tok);
        Serial.println("mA");
        //delay(400);
        Serial.print("Solar cell voltage = ");
        Serial.print(vin);
        Serial.println("V");
        //delay(400);
        Serial.print("Battery voltage = ");
        Serial.print(baterija);
        Serial.print("V  ");
        aux = constrain( map( baterija*1000 , 2200 , 4000 , 0 , 100 ) , 0 , 100 );
        Serial.print( aux , 0  );
        Serial.println("%");
        dif = aux - old_bat;
        if ( abs( dif ) > 0 ) {
          old_bat = aux;
          send( bat_msg.set(baterija,2) );
          sendBatteryLevel( aux) ;
          send ( var3_msg.set(vin,2) ); 
        }
        //delay(400);
        Serial.print("CHRG = ");
        Serial.println(polnjenje);
      
        Serial.println("*External:"); 
        
        //////// Temp Reading
        dallas.begin();  // Start up the library
        dallas.requestTemperatures();
        temp = dallas.getTempCByIndex(0); 
        Serial.print( "Temperature: "); 
        Serial.println( temp , 2 ); 
        dif = old_temp - temp;
        if ( abs( dif ) > 0.01 ) {
           old_temp = temp;
           send( temp_msg.set( temp , 2 ) ) ;
        }
        
        //////// PH Reading
        arrayIndex = 0;
        while ( arrayIndex < arrayLenth )
          if (millis() - samplingTime > samplingInterval)
          {
            readings[arrayIndex++] = analogRead(PH_PIN);
            samplingTime = millis();
          }
        
        voltage = avergearray( readings, arrayLenth ) * 3.30 / 1024.0;
        ph = 3.5 * ( voltage + pHOffset );
      
        Serial.print("PH Probe voltage:");
        Serial.print(voltage, 4);
        Serial.print("    pH value: ");
        Serial.println( ph , 2);
        dif = old_ph - ph;
        if ( abs( dif ) > 0.005 ) {
           old_ph = ph;
           send( ph_msg.set( ph , 2 ) ) ;
           send( var1_msg.set( voltage, 4) ); 
        }
      
      
        /////////// ORP 
        arrayIndex = 0;
        while ( arrayIndex < arrayLenth )
          if (millis() - samplingTime > samplingInterval)
          {
            readings[arrayIndex++] = analogRead(ORP_PIN);
            samplingTime = millis();
          }
      
        voltage = avergearray( readings, arrayLenth ) * 3.31 / 1024.0;
        orp = ( 2.5 - voltage ) / 1.037 ;
      
        Serial.print("ORP Probe voltage:");
        Serial.print( voltage, 4);
        Serial.print("    ORP value: ");
        Serial.println( orp, 2 );  
        dif = old_orp - orp;
        if ( abs( dif ) > 0.005 ) {
           old_orp = orp; 
           send( orp_msg.set( orp , 2 ) ) ;
           send( var2_msg.set( voltage, 4) ); 
        }
      
        /////////// Sleep
        digitalWrite( POWER , false );
        Serial.println("5V Power OFF");
      
        Serial.print("Runtime: ");
        time();
        Serial.println("Pausing...");
        Serial.println("----------------------------");
        
        //delay(715000);
        wait(500);
        sleep( 715000U );   // Sleeps for 12m
      
      }
      
      double avergearray(int* arr, int number) {
        int i;
        int max, min;
        double avg;
        long amount = 0;
        if (number <= 0) {
          Serial.println("Error number for the array to avraging!/n");
          return 0;
        }
        if (number < 5) { //less than 5, calculated directly statistics
          for (i = 0; i < number; i++) {
            amount += arr[i];
          }
          avg = amount / number;
          return avg;
        } else {
          if (arr[0] < arr[1]) {
            min = arr[0]; max = arr[1];
          }
          else {
            min = arr[1]; max = arr[0];
          }
          for (i = 2; i < number; i++) {
            if (arr[i] < min) {
              amount += min;      //arr<min
              min = arr[i];
            } else {
              if (arr[i] > max) {
                amount += max;  //arr>max
                max = arr[i];
              } else {
                amount += arr[i]; //min<=arr<=max
              }
            }//if
          }//for
          avg = (double)amount / (number - 2);
        }//if
        return avg;
      }
      
      
      void time() {
      
        long timeNow = millis();
      
        int days = timeNow / day ;                                //number of days
        int hours = (timeNow % day) / hour;                       //the remainder from days division (in milliseconds) divided by hours, this gives the full hours
        int minutes = ((timeNow % day) % hour) / minute ;         //and so on...
        int seconds = (((timeNow % day) % hour) % minute) / second;
      
        // digital clock display of current time
        Serial.print(days, DEC);
        printDigits(hours);
        printDigits(minutes);
        printDigits(seconds);
        Serial.println();
      
      }
      
      void printDigits(byte digits) {
        // utility function for digital clock display: prints colon and leading 0
        Serial.print(":");
        if (digits < 10)
          Serial.print('0');
        Serial.print(digits, DEC);
      }
      
      
      /* Read internal Vcc reference 
       *  
       */
      float readVcc()
      {
        signed long resultVcc;
        float resultVccFloat;
        // Read 1.1V reference against AVcc
        ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
        delay(10);                           // Wait for Vref to settle
        ADCSRA |= _BV(ADSC);                 // Convert
        while (bit_is_set(ADCSRA, ADSC));
        resultVcc = ADCL;
        resultVcc |= ADCH << 8;
        resultVcc = 1126400L / resultVcc;    // Back-calculate AVcc in mV
        resultVccFloat = (float) resultVcc / 1000.0; // Convert to Float
      
        return resultVccFloat;
      }
      

      Home Assistant / Vera Plus UI7
      ESP8266 GW + mySensors 2.3.2
      Alexa / Google Home

      1 Reply Last reply
      0
      • paqorP Offline
        paqorP Offline
        paqor
        wrote on last edited by paqor
        #3

        Oh, thank you so much. I had to make some small changes though. Maybe it's the newer Ceech Board version.

         // IO PINS
          pinMode( 13  , OUTPUT ); //unclear why this is so
        
        ...
        
        
          present(0, S_MULTIMETER);
          present(0, S_CUSTOM);
        ...
        
        digitalWrite( POWER , HIGH );
        
        ...
        
        digitalWrite( POWER , LOW );
        
        1 Reply Last reply
        0
        • paqorP Offline
          paqorP Offline
          paqor
          wrote on last edited by
          #4

          The MOSFET_outputs are two blank pins. I haven't found anything official about this, except in a post here and a circuit. I supply the voltage converter with VCC and at the bottom of these pins towards the RESET button.

          upload-02ce5e27-5068-4d58-8c6b-df5706a26a70.png

          1 Reply Last reply
          0
          • paqorP paqor

            Hi, I'm working with Ceech-Board for a pool sensor. I'm rewriting the code from V1.5 to 2.x. I encountered a problem with DIGITALWRITE which I can't explain.

            Only if I set PINMODE unequal to the PIN for DIGITALWRITE, this output works.

            void setup() {
              pinMode(5, OUTPUT); // Setzt den Digitalpin 13 als Outputpin
            }
            
            void loop() {
              digitalWrite(4, HIGH); // Setzt den Digitalpin 13 auf HIGH = "Ein"
              delay(1000);            // Wartet eine Sekunde
              digitalWrite(4, LOW);  // Setzt den Digitalpin 13 auf LOW = "Aus"
              delay(1000);            // Wartet eine Sekunde
            }
            

            It worked with pin 3, 5 and 13 e.g.

            On the board the PIN D4 is followed by a MOSFET for switching. This worked once, once again not. No I seem to have found the problem, but what is the cause?

            tbowmoT Offline
            tbowmoT Offline
            tbowmo
            Admin
            wrote on last edited by
            #5

            @paqor said in Ceech Board MOSFET Pin DIGITALWRITE Problem:

            You have to set pinMode for the same pin as you want to use as a output.. That is, if you use pinMode(5, OUTPUT); you also need to use digitalWrite(5, HIGH); See documentation here

            If you do not set pinMode for a particular pin, then that pin will be set as input by default. And then digitalWrite() will enable / disable the internal pullup on that particular pin.

            I also suggest that you use a #define to make sensible names for your pins, that will make your code more readable:

            #define RELAY_PIN 5
            
            void setup() {
              pinMode(RELAY_PIN, OUTPUT); // Setzt den Digitalpin 13 als Outputpin
            }
            
            void loop() {
              digitalWrite(RELAY_PIN, HIGH); // Setzt den Digitalpin 13 auf HIGH = "Ein"
              delay(1000);            // Wartet eine Sekunde
              digitalWrite(RELAY_PIN, LOW);  // Setzt den Digitalpin 13 auf LOW = "Aus"
              delay(1000);            // Wartet eine Sekunde
            }
            
            1 Reply Last reply
            0
            • paqorP Offline
              paqorP Offline
              paqor
              wrote on last edited by
              #6

              Unfortunately, it's not that simple. Then it would have worked. What else could have caused this strange behavior?

              1 Reply Last reply
              0
              • paqorP Offline
                paqorP Offline
                paqor
                wrote on last edited by
                #7
                This post is deleted!
                1 Reply Last reply
                0
                • paqorP Offline
                  paqorP Offline
                  paqor
                  wrote on last edited by
                  #8
                  This post is deleted!
                  1 Reply Last reply
                  0
                  • paqorP Offline
                    paqorP Offline
                    paqor
                    wrote on last edited by
                    #9

                    hello, he runs, after much effort and nerves :-)
                    The values are a little bit very fluctuating? Probably you can only get away with a very accurate stable voltage of 5.0V.

                    Screenshot_20200528_165820.png

                    1 Reply Last reply
                    0
                    Reply
                    • Reply as topic
                    Log in to reply
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes


                    15

                    Online

                    11.7k

                    Users

                    11.2k

                    Topics

                    113.0k

                    Posts


                    Copyright 2019 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                    • Login

                    • Don't have an account? Register

                    • Login or register to search.
                    • First post
                      Last post
                    0
                    • MySensors
                    • OpenHardware.io
                    • Categories
                    • Recent
                    • Tags
                    • Popular