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.
Category Archives: Development
Apple Product Ranges and Processor Architectures (Updated)
Apple Product Ranges and Processor Architectures
My Pebble Watchface – gWatch
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.

Pebble Development in 2020
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:
cd ~/pebble-dev/pebble-sdk-4.3-mac
virtualenv --no-site-packages .env
source .env/bin/activate
CFLAGS="" pip install -r requirements.txt
deactivate
It turns out the –no-site-packages flag is not required and should be omitted (see here for details).
I then had issues with no SDK being installed (and the scripts trying in vain to locate the SDK on the Internet). After trying:
pebble new-project testing
I was greeted with:
No SDK installed; installing the latest one...
Consulting Google yielded:
The key part of the reddit post is path to the SDK. I used the following to successfully install the SDK:
pebble sdk install https://github.com/aveao/PebbleArchive/raw/master/SDKCores/sdk-core-4.3.tar.bz2
The last fix was disabling the analytics tracking by creating a NO_TRACKING file in the SDK directory.
TempMonHTTP
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.

Check out the code at https://github.com/gjhmac/TempMonHTTP.
Arduinos and SD cards
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…
Rebble?
Just found this:
Is there life left in my Pebble smartwatches still?
Edit: Maybe not. Sadly, the hardware seems to be failing. I’m seeing lots of intermittent issues with the LCD screen.
[Part 7] Arduino Data Logger
// ————————————————————————————————————————————————
// 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);
}
[Part 6] Arduino Data Logger
// ————————————————————————————————————————————————
// Project: DataLogger
// Version: 0.3
// Date: 30 June 2018
// Author: Greg Howell
// ————————————————————————————————————————————————
// Version Date Comments
// 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
#include
#include
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
// 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(THURSDAY); // Set Day-of-Week to FRIDAY
//rtc.setTime(15, 50, 0); // Set the time to 12:00:00 (24hr format)
//rtc.setDate(26, 4, 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) {
// Write data to serial output
Serial.println(String(rtc.getDateStr()) + “,” + String(rtc.getTimeStr()) + “,” + dataString);
// Write data to SD card
dataFile.println(String(rtc.getDateStr()) + “,” + String(rtc.getTimeStr()) + “,” + dataString);
dataFile.close();
digitalWrite(ledPin, HIGH);
}
// if the file isn’t open, pop up an error:
else {
digitalWrite(ledPin, LOW);
Serial.println(“error opening datalog.txt”);
}
}
// Logging disabled
else {
digitalWrite(ledPin, LOW);
}
// Wait before repeating 🙂
delay (200);
}