I had great difficulty getting my Arduino Opta set up and working using the Arduino PLC IDE – whatever I tried I got the “Cannot download Sketch file (error code: 1)” error.
I finally had success using the plain Arduino IDE to do the initialization and then switching to the Arduino PLC IDE. The final step was changing the Modbus address to 247.
So I’ve finally bought myself one of the new M1 Macs – my first new computer in nearly 10 years. I went with the 16GB unified memory model with 8-core CPU, 8-core GPU and 1TB SSD. Not very cheap but I’m hopeful I will get 5+ years of service out of it.
After some trial and error (and leaning heavily on the tutorials and sample code available online) I have built a Pebble watchface (named gWatch for obvious and boring reasons). It’s fairly basic – see the screenshot below.
After a fair amount of trial and error I now have the Pebble SDK working on my Mac (macOS 10.15.4 Catalina). I was working from the guide here. I can now create, build and deploy programs and watch faces to my Pebble watch.
Firstly I had problems with the virtualenv command:
For a while I’ve been tinkering around with a simple project – an Arduino-based temperature (and humidity) monitor that outputs a webpage on my home LAN. The Arduino I used was the Freetronics EtherTen, a quality product.
If you require an SD card interface for your Arduino project I highly recommend purchasing an Arduino with one built-in. It took three attempts to get an SD card interface added to my basic Arduino Mega:
A very cheap generic (“LC Studio”) break out module that seemed to work intermittently at best;
A cheap shield (linksprite SD Card Shield v1.0b) – not compatible with the Mega (it does not state this on the packaging but if you search the documentation on their website it clearly states this, I should have done my research first);
And finally, a not so cheap Ethernet plus SD card shield (Freetronics) that worked without a hitch.
I would have been better off spending the extra coin on a Mega with the SD card interface built-in and reclaiming most of my weekend…
// ———————————————————————————————————————————————— // Project: DataLogger // Version: 0.4 // Date: 26 August 2018 // Author: Greg Howell <gjhmac@gmail.com> // ———————————————————————————————————————————————— // Version Date Comments // 0.4 26 August 2018 Modified code to only log to the SD card if the new value is different to the old value // 0.3 30 June 2018 Added debugging and diagnostics on serial port, sped up ADC for analogue read (128kHz -> 1MHz), fixed “A REF” // 0.2 26 April 2018 Addition of switch to enable/disable logging to SD card and LED to indicate logging status // 0.1 17 February 2018 Initial Development // // ———————————————————————————————————————————————— // Description: // – Logs analog0 value to a text file on the SD card along with date/time stamp in CSV format // – Maintains date/time via DS1302 Real Time Clock // – Builds with Arduino 1.8.5 // ———————————————————————————————————————————————— // #includes #include <SPI.h> // Serial Peripheral Interface #include <SD.h> // SD Cards #include <DS1302.h> // DS1302 RTC const int chipSelect = 4; const int buttonPin = 5; // Pin 5 is the button to enable/disable logging (digital input) const int ledPin = 6; // Pin 6 is the LED indicate logging status (digital output) const byte PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); const byte PS_16 = (1 << ADPS2); int buttonState = 0; // initialise button state to off int oldsensor; // variable to store the previous sensor value (used in loop()) // Init the DS1302 // Pin 2 = RST // Pin 3 = DAT // Pin 4 = CLK DS1302 rtc(2, 3, 4); // ———————————————————————————————————————————————— // setup() // ———————————————————————————————————————————————— void setup() { ADCSRA &= ~PS_128; // remove prescale of 128 ADCSRA |= PS_16; // add prescale of 16 (1MHz) analogReference(EXTERNAL); // Analogue reference set to “A REF” pin pinMode(buttonPin, INPUT); // Initialize the pushbutton pin as an input pinMode(ledPin, OUTPUT); // Initialize the LED pin as an output rtc.halt(false); // Set the clock to run-mode rtc.writeProtect(false); // and disable the write protection Serial.begin(9600); // Use following lines once to set clock if battery fails (modify to suit) //rtc.setDOW(SUNDAY); // Set Day-of-Week to FRIDAY //rtc.setTime(21, 50, 0); // Set the time to 12:00:00 (24hr format) //rtc.setDate(26, 8, 2018); // Set the date to August 6th, 2010 while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // Print current system date from RTC at start up Serial.print(“System date: “); Serial.println(String(rtc.getDateStr()) + “,” + String(rtc.getTimeStr())); Serial.print(“Initializing SD card…”); // see if the card is present and can be initialized: if (!SD.begin(chipSelect)) { Serial.println(“Card failed, or not present”); // don’t do anything more: while (1); } Serial.println(“card initialized.”); } // ———————————————————————————————————————————————— // loop() // ———————————————————————————————————————————————— void loop() { String dataString = “”; // make a string for assembling the data to log int sensor = analogRead(A0); // read analogue dataString += String(sensor); // construct string with analogue signal buttonState = digitalRead(buttonPin); // read button state // Logging enabled if (buttonState == HIGH) { File dataFile = SD.open(“datalog.txt”, FILE_WRITE); // if the file is available, write to it if (dataFile) { // if the new data is different to the old data write it to file if (sensor != oldsensor) { // Write data to serial output Serial.println(String(rtc.getDateStr()) + “,” + String(rtc.getTimeStr()) + “,” + dataString); Serial.println(String(sensor) + “,” + String(oldsensor)); // Write data to SD card dataFile.println(String(rtc.getDateStr()) + “,” + String(rtc.getTimeStr()) + “,” + dataString); dataFile.close(); } else { dataFile.close(); } // set logging LED to high digitalWrite(ledPin, HIGH); } // if the file isn’t open, print an error else { digitalWrite(ledPin, LOW); Serial.println(“error opening datalog.txt”); } } // Logging disabled else { // set logging LED to low digitalWrite(ledPin, LOW); } // set the old sensor value to the current sensor value (read at top of loop()) oldsensor = sensor; // Wait before repeating 🙂 delay (500); }