Forum Replies Created
-
AuthorPosts
-
What board are you using for your datalogger? And what is your battery and the model of the ESP32 you’re using?
The correct part number for U9 is bq24074, as shown in the red text at the top of the schematic symbol. Apparently the device properties in the Eagle library that I got from Adafruit two years ago for that component have an incorrect value printed below the symbol diagram on the schematic file only, but the BOM produced from that schematic file, as well as the manually-created BOM I give the manufacturer for producing all of the Mayfly boards specifies that the part number is bq24074, and the footprint for the part on the board layout is the correct footprint for that component (16-pin QFN). I didn’t put that incorrect number at the bottom of the schematic symbol, but it doesn’t affect anything about the functionality or manufacturing of the board, so it can be ignored until I can remove it from the file.
There’s no easy way to tell your Mayfly sketch to wait longer on initial startup, the instructions for that are buried deep in one of the supporting library files and not in the main sketch. Usually just having the larger antenna and using it in an area with known strong cell signals during the initial activation is all that’s necessary.
One other thing to check is that you’ve inserted the SIM card properly in the cell module. The first photo in section 6.1 of the manual shows the right way to insert the card. There’s a little notch in one corner of the card, and that’s the end you insert first, and with the gold contacts of the card facing the green circuit board and the text on the card facing away from the circuit board, as shown in the photo. Sometimes people accidentally insert the card upside down or backwards (or both upside down AND backwards), which obviously will prevent the board from making a connection. We’ve also seen antennas not properly snapped all the way onto the tiny little antenna jack, resulting in connection issues. So just make sure everything looks the photos shown in the manual.
If the Mayfly reports “could not wake modem for clock sync” then that means there’s no communication between the Mayfly and the cellular module. That usually happens when then cell module isn’t properly seated all the way in the Bee socket or the pins aren’t aligned properly. If the bee module is correctly installed, the clock sync part of the sketch is purposely made long (2 minutes) to give a newly activated SIM card time to join the network for the first time. I don’t know how US Cellular is, but with our Hologram cards, it can sometimes take several tries of doing the 2-minute sync session to get the card to join the network for the first time. Once it’s done that, subsequent connections can happen in about 5 seconds. So if you’re in an area with weak or no US Cellular signal, then it might be challenging to get that initial connection completed. If your cell data plan supports things like tablets or phones, then you could put the new SIM card in a different device that is constantly on and use that to establish the card with your provider first, and then move it back to the SIM7080 after that. And if US Cellular doesn’t recognize the SIM7080 as an approved device for their network (which is what Verizon does), then it probably won’t let the Mayfly connect at all. That why we’ve been using the Hologram network for the past 6 years because they’ve supported all of the various cell modules we’ve ever tried to use, and for around $5 per month per device.
What antenna are you using? There’s 2 small antennas that come with the SIM7080 board (one’s for cell, the other for GPS and not currently used), but we’ve found that the small cell antenna is usually not sufficient unless you’re in an urban area or very near a supported cell tower. We’ve had much better luck with a larger antenna like the one suggested in section 6.1 of the manual: https://www.envirodiy.org/knowledge-base/building-an-envirodiy-monitoring-station/
What is the APN name that US Cellular gave you use? Is the SIM card activated? Have you ever used that particular SIM card on another cellular device, like a tablet or phone? Are you sure that there is sufficient US Cellular coverage in the area where you’re using the board? They don’t actually own any cell networks, they just piggy-back off other carriers service like AT&T and Verizon. And apparently Verizon doesn’t recognize the EnviroDIY SIM7080 as an allowed device on their network, so even if all of the other steps I’ve mentioned are okay regarding the APN and SIM card activation, if there’s only Verizon service in the area you’re trying to use the board, then it may not work. Do you know what cell providers have coverage in your area?
I don’t think that feature has been implemented yet, so for the time being, if you need to change ownership of a site you can email me at mayfly@envirodiy.org and I can manually change the assigned owner.
There are several different models of Maxbotix ultrasonic sensors with different types of outputs that interface with the Mayfly, so do you have a particular sensor model in mind, or have a preferred communication protocol?
2023-01-30 at 4:20 PM in reply to: Please Help! Meter CTD Gen2 being blocked by Yosemitech 511-a #17574Here’s my code that has been successfully working on a Mayfly v1.1 RevB board, with a Hydros21 connected to the D4-7 Grove jack (with jumper set to the switched 3v setting) and a Y-511a and our custom RS485 adapter connected to the D5-6 jack and an external (non-Mayfly) 12v source supplying power for the Y-511a.
Arduino123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406// ==========================================================================// Defines for the Arduino IDE// NOTE: These are ONLY needed to compile with the Arduino IDE.// If you use PlatformIO, you should set these build flags in your// platformio.ini// ==========================================================================/** Start [defines] */#ifndef TINY_GSM_RX_BUFFER#define TINY_GSM_RX_BUFFER 64#endif#ifndef TINY_GSM_YIELD_MS#define TINY_GSM_YIELD_MS 2#endif/** End [defines] */// ==========================================================================// Include the libraries required for any data logger// ==========================================================================/** Start [includes] */// The Arduino library is needed for every Arduino program.#include <Arduino.h>// EnableInterrupt is used by ModularSensors for external and pin change// interrupts and must be explicitly included in the main program.#include <EnableInterrupt.h>// Include the main header for ModularSensors#include <ModularSensors.h>/** End [includes] */#include <AltSoftSerial.h>AltSoftSerial altSoftSerial(6,5);#define modbusSerial altSoftSerial // For AltSoftSerial// ==========================================================================// Data Logging Options// ==========================================================================/** Start [logging_options] */// The name of this program fileconst char* sketchName = "DRWI_SIM7080LTE.ino";// Logger ID, also becomes the prefix for the name of the data file on SD cardconst char* LoggerID = "Logger_XXXXXX";// How frequently (in minutes) to log dataconst uint8_t loggingInterval = 10;// Your logger's timezone.const int8_t timeZone = -5; // Eastern Standard Time// NOTE: Daylight savings time will not be applied! Please use standard time!// Set the input and output pins for the logger// NOTE: Use -1 for pins that do not applyconst int32_t serialBaud = 57600; // Baud rate for debuggingconst int8_t greenLED = 8; // Pin for the green LEDconst int8_t redLED = 9; // Pin for the red LEDconst int8_t buttonPin = 21; // Pin for debugging mode (ie, button pin)const int8_t wakePin = 31; // MCU interrupt/alarm pin to wake from sleep// Mayfly 0.x D31 = A7// Set the wake pin to -1 if you do not want the main processor to sleep.// In a SAMD system where you are using the built-in rtc, set wakePin to 1const int8_t sdCardPwrPin = -1; // MCU SD card power pinconst int8_t sdCardSSPin = 12; // SD card chip select/slave select pinconst int8_t sensorPowerPin = 22; // MCU pin controlling main sensor power/** End [logging_options] */// ==========================================================================// ==========================================================================// Wifi/Cellular Modem Options// ==========================================================================/** Start [sim_com_sim7080] */// For almost anything based on the SIMCom SIM7080G#include <modems/SIMComSIM7080.h>// Create a reference to the serial port for the modemHardwareSerial& modemSerial = Serial1; // Use hardware serial if possibleconst int32_t modemBaud = 9600; // SIM7080 does auto-bauding by default, but// for simplicity we set to 9600// Modem Pins - Describe the physical pin connection of your modem to your board// NOTE: Use -1 for pins that do not applyconst int8_t modemVccPin = 18;// MCU pin controlling modem power --- Pin 18 is the power enable pin for the// bee socket on Mayfly v1.0, use -1 if using Mayfly 0.5b or if the bee socket// is constantly powered (ie you changed SJ18 on Mayfly 1.x to 3.3v)const int8_t modemStatusPin = 19; // MCU pin used to read modem statusconst int8_t modemSleepRqPin = 23; // MCU pin for modem sleep/wake requestconst int8_t modemLEDPin = redLED; // MCU pin connected an LED to show modem// status// Network connection informationconst char* apn ="hologram"; // APN connection name, typically Hologram unless you have a// different provider's SIM card. Change as needed// Create the modem objectSIMComSIM7080 modem7080(&modemSerial, modemVccPin, modemStatusPin,modemSleepRqPin, apn);// Create an extra reference to the modem by a generic nameSIMComSIM7080 modem = modem7080;/** End [sim_com_sim7080] */// ==========================================================================// Using the Processor as a Sensor// ==========================================================================/** Start [processor_sensor] */#include <sensors/ProcessorStats.h>// Create the main processor chip "sensor" - for general metadataconst char* mcuBoardVersion = "v1.1";ProcessorStats mcuBoard(mcuBoardVersion);/** End [processor_sensor] */// ==========================================================================// Maxim DS3231 RTC (Real Time Clock)// ==========================================================================/** Start [ds3231] */#include <sensors/MaximDS3231.h>// Create a DS3231 sensor objectMaximDS3231 ds3231(1);/** End [ds3231] */// ==========================================================================// Sensirion SHT4X Digital Humidity and Temperature Sensor// Built in on Mayfly 1.x// ==========================================================================/** Start [sensirion_sht4x] */#include <sensors/SensirionSHT4x.h>// NOTE: Use -1 for any pins that don't apply or aren't being used.const int8_t SHT4xPower = sensorPowerPin; // Power pinconst bool SHT4xUseHeater = true;// Create an Sensirion SHT4X sensor objectSensirionSHT4x sht4x(SHT4xPower, SHT4xUseHeater);/** End [sensirion_sht4x] */// ==========================================================================// Meter Hydros 21 Conductivity, Temperature, and Depth Sensor// ==========================================================================/** Start [hydros21] */#include <sensors/MeterHydros21.h>const char* hydrosSDI12address = "1"; // The SDI-12 Address of the Hydros 21const uint8_t hydrosNumberReadings = 6; // The number of readings to averageconst int8_t SDI12Power = sensorPowerPin; // Power pin (-1 if unconnected)const int8_t SDI12Data = 7; // The SDI12 data pin// Create a Meter Hydros 21 sensor objectMeterHydros21 hydros(*hydrosSDI12address, SDI12Power, SDI12Data,hydrosNumberReadings);/** End [hydros21] *///----------------------------------------------------------------------------#include <sensors/YosemitechY511.h>// NOTE: Extra hardware and software serial ports are created in the "Settings// for Additional Serial Ports" sectionbyte y511ModbusAddress = 0x01; // The modbus address of the Y511const int8_t y511AdapterPower = sensorPowerPin; // RS485 adapter power pin (-1 if unconnected)const int8_t y511SensorPower = 22; // Sensor power pinconst int8_t y511EnablePin = -1; // Adapter RE/DE pin (-1 if not applicable)const uint8_t y511NumberReadings = 5;// The manufacturer recommends averaging 10 readings, but we take 5 to minimize// power consumption// Create a Y511-A Turbidity sensor objectYosemitechY511 y511(y511ModbusAddress, modbusSerial, y511AdapterPower,y511SensorPower, y511EnablePin, y511NumberReadings);//---------------------------------------------------------// ==========================================================================// Creating the Variable Array[s] and Filling with Variable Objects// ==========================================================================/** Start [variable_arrays] */Variable* variableList[] = {new MeterHydros21_Cond(&hydros),new MeterHydros21_Depth(&hydros),new MeterHydros21_Temp(&hydros),new YosemitechY511_Turbidity(&y511),new YosemitechY511_Temp(&y511),new ProcessorStats_Battery(&mcuBoard), // Battery voltage (EnviroDIY_Mayfly_Batt)new SensirionSHT4x_Humidity(&sht4x), // Relative humidity (Sensirion_SHT40_Humidity)new SensirionSHT4x_Temp(&sht4x), // Temperature (Sensirion_SHT40_Temperature)new Modem_SignalPercent(&modem), // Percent full scale (EnviroDIY_LTEB_SignalPercent)};// All UUID's, device registration, and sampling feature information can be// pasted directly from Monitor My Watershed.// To get the list, click the "View token UUID list" button on the upper right// of the site page.// *** CAUTION --- CAUTION --- CAUTION --- CAUTION --- CAUTION ***// Check the order of your variables in the variable list!!!// Be VERY certain that they match the order of your UUID's!// Rearrange the variables in the variable list ABOVE if necessary to match!// Do not change the order of the variables in the section below.// *** CAUTION --- CAUTION --- CAUTION --- CAUTION --- CAUTION ***// Replace all of the text in the following section with the UUID array from// MonitorMyWatershed// --------------------- Beginning of Token UUID List ---------------------const char* UUIDs[] = // UUID array for device sensors{"12345678-abcd-1234-ef00-1234567890ab", // Specific conductance (Meter_Hydros21_Cond)"12345678-abcd-1234-ef00-1234567890ab", // Water depth (Meter_Hydros21_Depth)"12345678-abcd-1234-ef00-1234567890ab", // Temperature (Meter_Hydros21_Temp)"12345678-abcd-1234-ef00-1234567890ab", // Turbidity (YosemiTech_Y511-A_Turbidity)"12345678-abcd-1234-ef00-1234567890ab", // Temperature (YosemiTech_Y511-A_Temp)"12345678-abcd-1234-ef00-1234567890ab", // Battery voltage (EnviroDIY_Mayfly_Batt)"12345678-abcd-1234-ef00-1234567890ab", // Relative humidity (Sensirion_SHT40_Humidity)"12345678-abcd-1234-ef00-1234567890ab", // Temperature (Sensirion_SHT40_Temperature)"12345678-abcd-1234-ef00-1234567890ab", // Percent full scale (EnviroDIY_LTEB_SignalPercent)};const char* registrationToken = "12345678-abcd-1234-ef00-1234567890ab"; // Device registration tokenconst char* samplingFeature = "12345678-abcd-1234-ef00-1234567890ab"; // Sampling feature UUID// ----------------------- End of Token UUID List -----------------------// Count up the number of pointers in the arrayint variableCount = sizeof(variableList) / sizeof(variableList[0]);// Create the VariableArray objectVariableArray varArray(variableCount, variableList, UUIDs);/** End [variable_arrays] */// ==========================================================================// The Logger Object[s]// ==========================================================================/** Start [loggers] */// Create a new logger instanceLogger dataLogger(LoggerID, loggingInterval, &varArray);/** End [loggers] */// ==========================================================================// Creating Data Publisher[s]// ==========================================================================/** Start [publishers] */// Create a data publisher for the Monitor My Watershed/EnviroDIY POST endpoint#include <publishers/EnviroDIYPublisher.h>EnviroDIYPublisher EnviroDIYPOST(dataLogger, &modem.gsmClient,registrationToken, samplingFeature);/** End [publishers] */// ==========================================================================// Working Functions// ==========================================================================/** Start [working_functions] */// Flashes the LED's on the primary boardvoid greenredflash(uint8_t numFlash = 4, uint8_t rate = 75) {for (uint8_t i = 0; i < numFlash; i++) {digitalWrite(greenLED, HIGH);digitalWrite(redLED, LOW);delay(rate);digitalWrite(greenLED, LOW);digitalWrite(redLED, HIGH);delay(rate);}digitalWrite(redLED, LOW);}// Reads the battery voltage// NOTE: This will actually return the battery level from the previous update!float getBatteryVoltage() {if (mcuBoard.sensorValues[0] == -9999) mcuBoard.update();return mcuBoard.sensorValues[0];}// ==========================================================================// Arduino Setup Function// ==========================================================================/** Start [setup] */void setup() {// Start the primary serial connectionSerial.begin(serialBaud);// Print a start-up note to the first serial portSerial.print(F("Now running "));Serial.print(sketchName);Serial.print(F(" on Logger "));Serial.println(LoggerID);Serial.println();Serial.print(F("Using ModularSensors Library version "));Serial.println(MODULAR_SENSORS_VERSION);Serial.print(F("TinyGSM Library version "));Serial.println(TINYGSM_VERSION);Serial.println();// Start the serial connection with the modemmodemSerial.begin(modemBaud);// Set up pins for the LED'spinMode(greenLED, OUTPUT);digitalWrite(greenLED, LOW);pinMode(redLED, OUTPUT);digitalWrite(redLED, LOW);// Blink the LEDs to show the board is on and starting upgreenredflash();pinMode(20, OUTPUT); // for proper operation of the onboard flash memory// chip's ChipSelect (Mayfly v1.0 and later)altSoftSerial.begin(9600);modbusSerial.begin(9600);// Set the timezones for the logger/data and the RTC// Logging in the given time zoneLogger::setLoggerTimeZone(timeZone);// It is STRONGLY RECOMMENDED that you set the RTC to be in UTC (UTC+0)Logger::setRTCTimeZone(0);// Attach the modem and information pins to the loggerdataLogger.attachModem(modem);modem.setModemLED(modemLEDPin);dataLogger.setLoggerPins(wakePin, sdCardSSPin, sdCardPwrPin, buttonPin,greenLED);// Begin the loggerdataLogger.begin();// Note: Please change these battery voltages to match your battery// Set up the sensors, except at lowest battery levelif (getBatteryVoltage() > 3.4) {Serial.println(F("Setting up sensors..."));varArray.setupSensors();}/** Start [setup_esp] */for (int8_t ntries = 5; ntries; ntries--) {// This will also verify communication and set up the modemif (modem.modemWake()) break;// if that didn't work, try changing baud ratemodemSerial.begin(115200);modem.gsmModem.sendAT(GF("+UART_DEF=9600,8,1,0,0"));modem.gsmModem.waitResponse();modemSerial.end();modemSerial.begin(9600);}/** End [setup_esp] */// Sync the clock if it isn't valid or we have battery to spareif (getBatteryVoltage() > 3.55 || !dataLogger.isRTCSane()) {// Synchronize the RTC with NIST// This will also set up the modemdataLogger.syncRTC();}// Create the log file, adding the default header to it// Do this last so we have the best chance of getting the time correct and// all sensor names correct// Writing to the SD card can be power intensive, so if we're skipping// the sensor setup we'll skip this too.if (getBatteryVoltage() > 3.4) {Serial.println(F("Setting up file on SD card"));dataLogger.turnOnSDcard(true); // true = wait for card to settle after power updataLogger.createLogFile(true); // true = write a new headerdataLogger.turnOffSDcard(true); // true = wait for internal housekeeping after write}// Call the processor sleepSerial.println(F("Putting processor to sleep\n"));dataLogger.systemSleep();}/** End [setup] */// ==========================================================================// Arduino Loop Function// ==========================================================================/** Start [loop] */// Use this short loop for simple data logging and sendingvoid loop() {// Note: Please change these battery voltages to match your battery// At very low battery, just go back to sleepif (getBatteryVoltage() < 3.4) {dataLogger.systemSleep();}// At moderate voltage, log data but don't send it over the modemelse if (getBatteryVoltage() < 3.55) {dataLogger.logData();}// If the battery is good, send the data to the worldelse {dataLogger.logDataAndPublish();}}/** End [loop] */When we scout an area for a potential CTD sensor installation, one of the top deciding factors is whether that portion of the stream will freeze during extremely cold weather. Almost all of our sensors are mounted in deep, continuously flowing water. Most of the time our streams won’t freeze at all in the area around the sensor, or if they do, it’s only the top inch or two. By installing the sensors at least 12 inches or more below the surface, they aren’t damaged by the ice. There’s a few small tributaries or streams with shallow or slow water that we have to monitor for a particular reason and can’t choose a deeper spot, so we just make sure to pay close attention to the site when extended cold weather is in the forecast. We’ve got over 200 stations in the Delaware River watershed, and since we only see deep prolonged freezes a few times a year, if at all, our stations typically make it through the winter with no damage. We’ve only had a few sensors be damaged by ice in the past 5 years, most were in the first year or two of the project before we got good at predicting ice formation areas. If someone has a sensor in a stream that might freeze and isn’t sure whether or not it will survive some upcoming cold weather, it’s certainly safer to remove the sensor and place it on the streambank (dry it off thoroughly and either hang it somewhere off the ground and protected from rain that might later freeze, or wrap the sensor in a dry towel and place it in a ziploc bag on the shore (in a safe area that won’t be damaged in case of flooding resulting from future snow-melt). Note that freeze damage to pressure sensors is not covered by the manufacturers, so if your sensor is still under warranty and you think it will likely freeze, it’s up to you to decide what to do. One of our biggest monitoring efforts right now is examining the effects of road salt in our waterways, so being able to measure water depth and conductivity during these winter months is extremely important and worth taking a gamble that we might lose one or two sensors out of 200. If you are only interested in measuring temperature and conductivity and not depth, then a simpler sensor like Meter Group’s ES-2 conductivity-temperature sensor is a better choice than the CTD, because it doesn’t have the sensitive pressure sensor on it and the housing can be completely incased in ice without damage.
If you have the original sketch that someone wrote for the logger, then that should give you clues of how everything should be connected. There are several different ways in which to connect a tipping bucket to a Mayfly logger, some require a circuit in between to do the actual counting (like the Trinket or an ATtiny), but we’ve had good luck with just connecting the two poles of the tipping bucket switch directly to the Mayfly board and using digial pin 10 (D10) which is a hardware interrupt pin to wake the logger and count the tip. By activating the onboard pullup resistor (using jumper SJ12) you can just connect one wire of the bucket to D10 and the other to Mayfly ground. There’s a full explanation in this thread (https://www.envirodiy.org/topic/rain-gauge-tip-data-without-rain/) along with the sample code. However, note the one drawback to using this method (as mentioned in that thread) that tips won’t be counted if the Mayfly is busy doing something else like making a radio or cell transmission, so an occasional tip might be missed during high rain-rate events (and depending on your transmission frequency). So having a separate counting device report tips to the Mayfly on demand is a more reliable and accurate method, so people use the Trinket, ATtiny, or other small affordable programmable chip for that.
-
AuthorPosts