Chinese Arduino UNO Clones - The Wavgat versus the generic UNO R3 Clone - The Winner Is?

Waiting for more fun Ardunio parts from AliExpress, I decided to test two cheap Chinese Arduino UNO clones.

  1. The Arduino UNO R3 (CH340G) MEGA328P
  2. The Wavgat UNO R3 (CH340G) MEGA328P

Both of these Chinese Ardunio clones sell for about $3 USD, delivered to your door.

The bottom line is that the Wavgat requires extra "poorly written" board management Arduino IDE code, which is buggy and hard to install; and delivers less power on the analog pins.

The generic UNO R3 board management software "out of the box" works flawlessly in the Ardunio IDE and requires zero extra frustrating set up time. Also, this board delivered more power to the analog pins.

On both devices, I ran the same "sync with my mac and get the unix time stamp" code I drafted a few days ago:

/*
  Sync UNIX Time with Computer and
  LCD Display with I2C on Arduino UN0
  Rough Draft 0.121  (needs improvements)
  Neo December 2019
  https://www.unix.com
*/
// Include Wire Library for I2C
#include <Wire.h>
// Include NewLiquidCrystal Library for I2C
#include <LiquidCrystal_I2C.h>
#include <Time.h>
#include <TimeLib.h>

#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by Unix time_t as ten ASCII digits
#define TIME_HEADER 'T' // Header tag for serial time sync message
#define TIME_REQUEST 7  // ASCII bell character requests a time sync message
#define DEBUG_SKETCH false
#define ENABLE_LED_A0 true
// Define LCD pinout
const int en = 2, rw = 1, rs = 0, d4 = 4, d5 = 5, d6 = 6, d7 = 7, bl = 3;
// can be any integer greater than zero and less than recent unix time
const int time_int = 10;
// Define I2C Address - change if reqiuired
const int i2c_addr = 0x27;
String s;
bool flag = true;
time_t t = now();
LiquidCrystal_I2C lcd(i2c_addr, en, rw, rs, d4, d5, d6, d7, bl, POSITIVE);
void setup()
{
    Serial.begin(9600);
    Wire.begin();
    time_t t = now();
    lcd.begin(16, 2);
    lcd.clear();
    if (ENABLE_LED_A0)
    {
        pinMode(LED_BUILTIN, OUTPUT);
        pinMode(A0, OUTPUT);
        pinMode(13, OUTPUT);
    }
}

void loop()
{
    lcd.clear();
    if (ENABLE_LED_A0)
    {
        // pinMode(LED_BUILTIN, HIGH);
        digitalWrite(A0, HIGH);
        digitalWrite(13, HIGH);
    }
    int count = 0;
    if (Serial.available() and flag)
    {
        lcd.clear();
        lcd.setCursor(0, 1);
        lcd.print("Serial OK");
        count = processSyncMessage();
        //Serial.println("Serial Available: " + count);
        if (count > time_int)
            flag = false;
    }
    lcd.setCursor(0, 0);
    if (timeStatus() == timeNotSet)
    {
        if (flag)
        {
            Serial.println("waiting for sync message");
            lcd.print("Arduino Time:");
        }
    }
    else
    {

        lcd.print("Unix Time:");
        if (DEBUG_SKETCH)
        {
            Serial.println("Time Synced");
        }
    }
    t = now();
    int s = int(t);
    if (s != 0)
    {
        lcd.setCursor(0, 1);
        lcd.print(t);
        lcd.print(" secs");
        if (ENABLE_LED_A0)
        {
            digitalWrite(A0, LOW);
            digitalWrite(13, LOW);
            //pinMode(LED_BUILTIN, LOW);
        }
    }
    Serial.println(s);
    delay(1000);
    lcd.clear();
}

int processSyncMessage()
{
    while (Serial.available() >= TIME_MSG_LEN)
    { // time message consists of header & 10 ASCII digits

        char c = Serial.read();
        int count = 0;
        Serial.print(c);
        time_t pctime = 0;
        if (c == TIME_HEADER)
        {
            for (int i = 0; i < TIME_MSG_LEN - 1; i++)
            {
                c = Serial.read();
                if (c >= '0' && c <= '9')
                {
                    Serial.print(c);
                    count++;
                    pctime = (10 * pctime) + (c - '0'); // convert digits to a number
                }
            }
            Serial.print("\n");
            if (DEBUG_SKETCH)
            {
                Serial.write(pctime + "\n");
                Serial.println(pctime);
            }
            setTime(pctime); // Sync Arduino clock to the time received on the serial port
        }
        return count;
    }
}

My new Rigol 1054Z scope has not arrived yet, so this comparison was not really a proper bench test and I don't claim to be a very detailed "bench tester" anyway. I don't have a proper lab set up yet. However, I do have a very cheap Chinese tabletop microscope which I keep from falling over with two rubber bands :slight_smile:

The fact that the analog pins on the Wavgat put out a lot less power than on the generic UNO clone is not really a big deal; but in practice, I could only drive one small off-board LED in series with the Wavgat, but I could drive two in series with the generic UNO.

The BIG showstopper for the Wavgat was the hours it took me to actually edit the board management code to remove all the errors. For example, in many files, the include paths had "\" (backslashes) like on a Windows machine versus the "/" forward slashes (did I get the names of those slashes right?) used on unix-like machines. Not very good porting!! What were they thinking?! This was a real PITA - to go in and edit all the Wavgat board management code to get it to work on macOS. I assume Linux and other unix-like machines will have the same issue.

So, my advice is to avoid the Wavgat Arduino UNO clone like the plague and go with the generic UNO clone, like the one depicted above (marked UNO). The Wavget is not a true Arduino clone because some oddball USB serial drivers (I assume the chip is different but have not yet looked into it) and requires a lot of "time wasting" debugging to get it to work. For what, I ask? Both board are $3 USD delivered to your doorstep from AliExpress.

Go with the Arduino UNO clone (board logo magnified above) which requires no C programming debugging and works out of the box.

Maybe someday I'll do a more "in-depth" four channel o-scope review, but I need it to arrive from China safely and unharmed first!

Let's see what arrives in the mail from China and in what order..... whatever will be will be.

Happy Creative Arduino Hacking!

Edit: Updated code where there was a conflict regarding the onboard LED (digital pin 13), which I fixed (caused by alternating the same sketch between two different boards).

3 Likes