Argon solid red LED?

This morning I went out to check on my greenhouse project and the Argon is not functioning anymore. It was warm to the touch and had obliterated the QR code because of the heat. It was emitting a solid red light on the main LED and the charge LED was on solid yellow.

Removing it from the greenhouse and plugging it into USB causes it to heat up so it is warm to the touch and the lights remain the same. Holding the buttons down to try to enter DFU mode or safe mode produces no response.

The greenhouse was reporting data for a few hours before this happened. Prior to the failure I placed the solar panel, which may have blocked the signal. Could it be that the Argon destroyed itself just because it could not connect to the internet and, while trying, overheated? That would be very disappointing but the important thing is to figure out what’s going on I guess.

This is the firmware that was on it. It as working for a few days indoors before the greenhouse was deployed outdoors,

// This #include statement was automatically added by the Particle IDE.
#include <SparkFun_SCD30_Arduino_Library.h>

// This #include statement was automatically added by the Particle IDE.
#include <DHT22Gen3_RK.h>

// This #include statement was automatically added by the Particle IDE.
#include <MCP23017-RK.h>

SCD30 airSensor;

MCP23017 gpio(Wire, 0);

float seconds;
int digitalwritepin;
int pulse_valve_length;

float co2;
float hum_in;
float hum_ext;
float temp_in;
float temp_ext;

int irrigation_pulse_len = 15; // by default pulse the valve for 15ms to open or close.

unsigned long old_time = millis();

// How often to check the co2 in milliseconds
const unsigned long CHECK_INTERVAL = 300000;
unsigned long lastCheck = 0;

// The two parameters are any available GPIO pins. They will be used as output but the signals aren't
// particularly important for DHT11 and DHT22 sensors. They do need to be valid pins, however.
DHT22Gen3 dht(D7, D8);

void sampleCallback(DHTSample sample);

void setup() {
    
    //Functions for manual control of the outputs
    Particle.function("Open_seconds", open_seconds);
    Particle.function("Close_seconds", close_seconds);
    Particle.function("pulse_pin", pulse_pin);
    Particle.function("fans_seconds", fans_seconds);
    Particle.function("blower_seconds", blower_seconds);
    Particle.function("sprinkler_seconds", sprinkler_seconds);
    Particle.function("irrigate_seconds", irrigate_seconds);
    Particle.function("irrigation_pulse_length", irrigation_pulse_length); //set the length of a pulse used to open or close the valve
    
    
	Serial.begin(9600);// for the mcp23017

	delay(5000);

	gpio.begin();//gpio expander instance (mcp23017)
	
	Wire.begin();
	
    if (airSensor.begin() == false)
      {
        Serial.println("Air sensor not detected. Please check wiring. Freezing...");
        Particle.publish("frozen because co2 sensor is not connected");
        while (1)
          ;
      }
    
    dht.setup();
}

void loop() {
    dht.loop();
    
	if (millis() - lastCheck >= CHECK_INTERVAL) {
		lastCheck = millis();
		
		co2 = airSensor.getCO2();
        
        delay(1000);
        
        dht.getSample(A3, [](DHTSample sample1) {
    		dht.getSample(A4, [sample1](DHTSample sample2) {
                if (sample1.isSuccess() && sample2.isSuccess()) {

                    hum_in = sample1.getHumidity();
                    temp_in = sample1.getTempC();
                    
                    hum_ext = sample2.getHumidity();
                    temp_ext = sample2.getTempC();

                }
                else {
                    Log.info("sample is not valid");
                }
            });
		});
	
	send_data();
	
	}

}

int send_data(){
        if (Particle.connected()) {
        Particle.publish("co2", String(co2));
        delay(1000);
        Particle.publish("climate_reading_in", String(temp_in) + "," + String(hum_in), PRIVATE);
        delay(1000);
        Particle.publish("climate_reading_ext", String(temp_ext) + "," + String(hum_ext), PRIVATE);
        
        char buf[256];
        snprintf(buf, sizeof(buf), "{\"temp_in\":%.1f,\"hum_in\":%1.f,\"temp_ext\":%.1f,\"hum_ext\":%1.f,\"co2\":%1.f}", temp_in, hum_in, temp_ext, hum_ext, co2);
        
        Particle.publish("send_data", buf, PRIVATE);

    }
    else {
        //log an error if you want.
    }
}

int blower_seconds(String command)
{
    seconds = atof(command)*1000;
	gpio.pinMode(2, OUTPUT);
	
	gpio.digitalWrite(2, HIGH);
    delay(seconds);
    gpio.digitalWrite(2, LOW);
}

int sprinkler_seconds(String command)
{
    seconds = atof(command)*1000;
	gpio.pinMode(4, OUTPUT);
	
	gpio.digitalWrite(4, HIGH);//pulse opens the valve (1-a wire pulsed high for 15ms)
    delay(15);
    gpio.digitalWrite(4, LOW);
    
    delay(seconds);//technically this is ms now.
    
    gpio.pinMode(5, OUTPUT);
    gpio.digitalWrite(5, HIGH);//pulse closes the valve (1-b wire pulsed high for 15ms)
    delay(15);
    gpio.digitalWrite(5, LOW);

}

int fans_seconds(String command)
{
    seconds = atof(command)*1000;
	gpio.pinMode(0, OUTPUT);
	gpio.pinMode(1, OUTPUT);
	
	gpio.digitalWrite(0, HIGH);
	gpio.digitalWrite(1, HIGH);
    delay(seconds);
    gpio.digitalWrite(0, LOW);
    gpio.digitalWrite(1, LOW);
}

int pulse_pin(String command)
{
    digitalwritepin = atoi(command);
    gpio.pinMode(digitalwritepin, OUTPUT);

    gpio.digitalWrite(digitalwritepin, HIGH);
    delay(1000);
    gpio.digitalWrite(digitalwritepin, LOW);
}

int open_seconds(String command)
{
    seconds = atof(command)*1000;
	gpio.pinMode(9, OUTPUT);
	
	gpio.digitalWrite(9, HIGH);
    delay(seconds);
    gpio.digitalWrite(9, LOW);

}

int close_seconds(String command)
{
    seconds = atof(command)*1000;
	gpio.pinMode(8, OUTPUT);
	
	gpio.digitalWrite(8, HIGH);
    delay(seconds);
    gpio.digitalWrite(8, LOW);

}

int irrigate_seconds(String command)
{
    seconds = atof(command)*1000;
    
	gpio.pinMode(6, OUTPUT);
	gpio.digitalWrite(6, HIGH);//pulse opens the valve (2-a wire pulsed high for 15ms)
    delay(irrigation_pulse_len);
    gpio.digitalWrite(6, LOW);
    
    delay(seconds);//technically this is ms now.
    
    gpio.pinMode(7, OUTPUT);
    gpio.digitalWrite(7, HIGH);//pulse closes the valve (2-b wire pulsed high for 15ms)
    delay(irrigation_pulse_len);
    gpio.digitalWrite(7, LOW);

}

int irrigation_pulse_length(String command)
{
    irrigation_pulse_len = atoi(command);
}

@JamesDouglas, can you describe the hardware that surrounds your Argon. Are you powering any device via the 3.3v power pin or any other pin on the Argon? How are you powering the Argon itself? Schematics would be nice if you can share.

1 Like

Hi peekay123,

Sure here is the hardware schematic. I guess I can only upload an image so it is a .jpg instead of a .pdf.

After removing the argon I did notice that D3 failed. It shows 0.024V in both directions when I use my multimeter in diode test mode, and was warm to the touch.

Right now we do suspect a problem with the power supply but I would like a deeper understanding than that - there may be an interaction between the Argon and the power supply as well as other components.

I guess as far Particle is concerned I am trying to understand the error message from the device and its behaviour - what could cause an Argon to stop functioning and emit a solid red light while using a lot of power. Perhaps that will help us figure out what happened. For example, the schottky diode that failed was rated to 40V. It’s hard to imagine the power supply would output that much but if it did would the Argon be completely dead or emit this solid red light?

Before failure the Argon likely rebooted multiple times. I can say that because when it first boots the firmware reports zero values, which were logged when the data was delivered. Here is some temperature sensor data reported shortly before failure.

We disabled the 5V power supply yesterday and plugged in a new Argon. The new Argon cannot boot when plugged into the board, which is apparently caused by connections on the righthand side (short row of pins). The EN pin is floating as it should be and the Argon shuts down after being plugged in if I boot it via USB power before plugging it in.

@JamesDouglas, though you have a 40V schottky, what current is it rated for? Did you follow the layout rules for the MCP16301? How long are you PCB traces for the 5V rail and are they generously decoupled at each endpoint?

There is no question that if the 5V rail goes higher than the max rating for the Argon (5.5v I believe), this could damage the Argon. I noticed you don’t have a reverse protection diode between the 5V rail and Vusb. If you are also powering via the USB connector on the Argon (to get Serial output), you could get interference between the two supplies leading to the type of failure you have observed.

On you schematic, what exactly is PWR_FLAG as it seems to be in many places?

1 Like

I’ll comment as I’m the one that designed the hardware. :slightly_smiling_face:. The PWR_FLAG marker is an idiosyncrasy of Kicad, its a requirement to label any net supplying power with it to pass ERC.

I did follow the calculations and layout guidelines for the mcp16301 closely, although I will likely go through it all again. I do not have any decoupling caps on the argon side, Vusb has its own 0.1uf on the argon itself which I thought was enough. Perhaps that was a poor assumption.

I suspect it could be the saturation current rating of the inductor, I will have to go through some datasheets again when I get home tonight.

I did design the power supply with a 12v input in the calculations, and the battery is actually as high as 13.3v fully charged I think.

Yeah… I should add a diode OR to vusb.