This command.... Serial.println(PSTR(“Hello world”)) Ought to work
No it ought not to work! Serial.println expects a pointer into SRAM and you are trying to pass it a pointer into flash. The Harvard architecture
of the AVR MCU means that address N could be in flash or it could be in SRAM and so a function (e.g. println) that receives a memory address must know in which memory bank it lies. The convention is that ordinarily named functions expect SRAM addresses and those with an _P suffix expect flash addresses in at least one of their parameters.
If you want println to accept a flash address then you could subclass it and add _P methods or you will need to temporarily copy your string out of flash like this: